Skip to content

Instantly share code, notes, and snippets.

@tyrasd
Last active October 23, 2017 08:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tyrasd/1895193efb9fa49c776dee73ab5d717c to your computer and use it in GitHub Desktop.
Save tyrasd/1895193efb9fa49c776dee73ab5d717c to your computer and use it in GitHub Desktop.
@font-face {
font-family: 'Rubik';
font-style: normal;
font-weight: 400;
src:
local('Rubik'),
local('Rubik-Regular'),
url('./rubik-v4-latin-regular.woff2') format('woff2'),
url('./rubik-v4-latin-regular.woff') format('woff');
}
html {
height: 100%;
}
body {
font-family: Rubik, -apple-system, BlinkMacSystemFont, 'avenir next', avenir, helvetica, 'helvetica neue', ubuntu, roboto, noto, 'segoe ui', arial, sans-serif;
margin: 0;
padding: 0;
}
h1,
h2,
h3,
p {
margin: 0;
}
a {
color: #fff;
text-decoration-skip: ink;
border-radius: 6px;
}
em {
font-style: normal;
}
.dark {
background: #272c32;
color: #fff;
}
.dark em {
color: #fadb03;
}
.dark a {
color: #7cbfe5;
}
.dark a:hover {
background: #4e5b6f;
}
.light {
background: #f5f5f5;
color: #34383e;
}
.light em {
color: #d13787;
}
.light a {
color: #0889d1;
}
.light a:hover {
color: #0069a4;
}
img {
width: 100%;
}
div.slide-container {
background-size: 100%;
display: flex;
align-items: center;
}
div.slide {
box-sizing: border-box;
cursor: pointer;
cursor: hand;
padding: 4%;
}
div.imageText {
text-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
}
/* normally not good, but ok in context of full screen directional navigation */
:focus {
outline: 0;
}
body.talk-mode {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
body.print-mode {
background: #fff;
color: #000;
font-weight: normal;
padding: 30px 20px;
}
body.print-mode div.sub-container {
padding: 10px 20px;
display: flex;
flex-flow: row wrap;
}
ul.notes-list {
display: inline-block;
float: left;
vertical-align: top;
}
body.print-mode div.slide-container {
border: 1px solid #000;
}
body.jump-mode {
padding: 10px;
}
body.jump-mode div.sub-container {
display: inline-block;
vertical-align: top;
padding: 2px;
}
body.jump-mode div.slide-container {
border: 1px solid rgba(255, 255, 255, 0.2);
cursor: pointer;
}
body.jump-mode div.slide-container:hover {
border: 1px solid rgba(255, 255, 255, 0.8);
}
/* @flow weak */
window.addEventListener('load', function() {
// document.body isn't a guaranteed value: Flow will yell at
// us if we use it without checking if it exists, so let's check it here.
if (!document.body) {
throw new Error(
'big could not find a body element on this page, so it is exiting'
);
}
var body = document.body;
var initialBodyClass = body.className;
var slideDivs = nodeListToArray(document.querySelectorAll('body > div'));
if (!slideDivs.length) {
throw new Error(
"big couldn't find any slides in this presentation: " +
'there are no divs directly within the body of this page'
);
}
var ASPECT_RATIO = 1.6;
var timeoutInterval;
// Read the contents of `notes` elements as strings, and then
// get rid of the elements themselves so that they don't interfere with
// rendering.
var notes = slideDivs.map(function(slide) {
return nodeListToArray(slide.getElementsByTagName('notes')).map(function(
noteElement
) {
noteElement.parentNode.removeChild(noteElement);
return noteElement.innerHTML.trim();
});
});
/**
* The big API
* @public
*/
var big = {
/**
* The current slide
* @type {number}
* @public
*/
current: -1,
/**
* The current mode, one of 'talk', 'print', or 'jump'
* @public
*/
mode: 'talk',
/**
* Move one slide forward
* @function
* @public
*/
forward: forward,
/**
* Move one slide backward
* @function
* @public
*/
reverse: reverse,
/**
* Go to a numbered slide
* @function
* @public
*/
go: go,
/**
* The number of slides in this presentation
* @type {number}
* @public
*/
length: slideDivs.length,
audio: findAudioNode(),
playControl: undefined
};
var presentationContainer = body.appendChild(
ce('div', 'presentation-container')
);
slideDivs = slideDivs.map(function(slide) {
slide.setAttribute('tabindex', 0);
slide.classList.add('slide');
var slideContainer = presentationContainer.appendChild(
ce('div', 'slide-container')
);
slideContainer.appendChild(slide);
return slideContainer;
});
body.className = 'talk-mode ' + initialBodyClass;
if (big.audio) {
big.playControl = body.appendChild(ce('div'));
big.playControl.style.cssText = 'padding:5px;color:#aaa;';
big.playControl.addEventListener('click', onClickPlay);
window.setInterval(onAudioUpdate, 200);
}
var printListener = window.matchMedia('print');
//printListener.addListener(onPrint);
document.addEventListener('click', onClick);
document.addEventListener('keydown', onKeyDown);
document.addEventListener('touchstart', onTouchStart);
window.addEventListener('hashchange', onHashChange);
window.addEventListener('resize', onResize);
window.big = big;
console.log(
'This is a big presentation. You can: \n\n' +
'* press j to jump to a slide\n' +
'* press p to see the print view\n' +
'* press t to go back to the talk view'
);
go(parseHash() || big.current);
/**
* Parse the current window's hash, returning a number for a
* slide.
* @returns {number} slide number
*/
function parseHash() {
return parseInt(window.location.hash.substring(1), 10);
}
/**
* Just save some typing when we refer to document.createElement
*
* @param {string} type
* @param {string?} klass
* @returns {HTMLElement}
*/
function ce(type, klass) {
var element = document.createElement(type);
if (klass) {
element.className = klass;
}
return element;
}
/**
* Turn a NodeList, returned by querySelectorAll or another DOM method,
* into an Array with array methods.
* @param {NodeList} nodeList
* @returns {Array<HTMLElement>} array of nodes
*/
function nodeListToArray(nodeList) {
return [].slice.call(nodeList);
}
/**
* Try to find an audio node in the page that contains a usable
* track with a text track for navigation. There might be one, there
* might not.
* @returns {HTMLElement?} an audio node
*/
function findAudioNode() {
return nodeListToArray(
document.getElementsByTagName('audio')
).filter(function(audio) {
return (
audio.textTracks.length === 1 && audio.textTracks[0].cues.length > 0
);
})[0];
}
// Navigation ================================================================
function goToAudio(n) {
if (!big.audio) return;
big.playControl.style.cssText = n === 0
? 'display:none'
: 'padding:5px;color:#aaa;';
if (n === 0) {
big.audio.pause();
} else {
big.audio.currentTime = big.audio.textTracks[0].cues[n - 1].startTime;
if (big.audio.paused) big.audio.play();
}
}
/**
* Given a slide number, if there are notes for that slide,
* print them to the console.
*/
function printNotesToConsole(n) {
if (notes[n].length && 'group' in console) {
console.group(n);
notes[n].forEach(function(note) {
console.log(
'%c%s',
'padding:5px;font-family:serif;font-size:18px;line-height:150%;',
note
);
});
console.groupEnd();
}
}
function useDataImageAsBackground(slideContainer) {
var slideDiv = slideContainer.firstChild;
if (slideDiv.hasAttribute('data-background-image')) {
slideContainer.style.backgroundImage =
'url("' + slideDiv.getAttribute('data-background-image') + '")';
slideDiv.classList.add('imageText');
} else {
slideContainer.style.backgroundImage = '';
slideContainer.style.backgroundColor = slideDiv.style.backgroundColor;
}
}
/**
* The central navigation method: given a slide number, it goes to that slide
* and sets it up.
*
* @param {number} n slide index
* @param {boolean} dontSeek whether to seek audio. Specifically, when the slide
* is changing _because_ of audio tracks, we don't also want to skip audio.
*/
function go(n, dontSeek, force) {
// Ensure that the slide we're going to is in range: it isn't
// less than 0 or higher than the actual number of slides available.
n = Math.max(0, Math.min(big.length - 1, n));
// Avoid doing extra work if we're going from a slide to itself.
if (!force && big.current === n) return;
big.current = n;
var slideContainer = slideDivs[n];
var slideDiv = slideContainer.firstChild;
printNotesToConsole(n);
if (!dontSeek) {
goToAudio(n);
}
slideDivs.forEach(function(slide, i) {
slide.style.display = i === n ? 'flex' : 'none';
});
body.className =
'talk-mode ' + (slideDiv.getAttribute('data-bodyclass') || '') + ' ' + initialBodyClass;
useDataImageAsBackground(slideContainer);
// If a previous slide had set a timer to auto-advance but
// the user navigated before it fired, cancel it.
if (timeoutInterval !== undefined) {
window.clearInterval(timeoutInterval);
}
// If this slide has a time-to-next data attribute, set a
// timer that advances to the next slide within that many
// seconds.
if (slideDiv.hasAttribute('data-time-to-next')) {
if (big.audio) {
throw new Error(
'this presentation uses an audio track, and also uses time-to-next. ' +
'You must only use one or the other.'
);
}
var timeToNextStr = slideDiv.getAttribute('data-time-to-next');
var timeToNext = parseFloat(timeToNextStr);
if (isNaN(timeToNext)) {
throw new Error(
'big encountered a bad value for the time-to-next string: ' +
timeToNextStr
);
}
timeoutInterval = window.setTimeout(forward, timeToNext * 1000);
}
slideDiv.focus();
onResize();
if (window.location.hash !== n) {
window.location.hash = n;
}
document.title = slideDiv.textContent || slideDiv.innerText;
}
function forward() {
go(big.current + 1);
}
function reverse() {
go(big.current - 1);
}
/**
* This is the 'meat': it resizes a slide to a certain size. In
* talk mode, that size is the side of an aspect-fit box inside of
* the display. In jump and print modes, that size is a certain fixed
* pixel size.
*
* @param {HTMLElement} slideContainer
* @param {number} width
* @param {number} height
*/
function resizeTo(slideContainer, width, height) {
var slideDiv = slideContainer.firstChild;
var fontSize = height;
slideContainer.style.width = width + 'px';
slideContainer.style.height = height + 'px';
[100, 50, 10, 2].forEach(function(step) {
for (; fontSize > 0; fontSize -= step) {
slideDiv.style.fontSize = fontSize + 'px';
if (slideDiv.offsetWidth <= width && slideDiv.offsetHeight <= height) {
break;
}
}
fontSize += step;
});
}
function emptyNode(node) {
while (node.hasChildNodes()) {
node.removeChild(node.lastChild);
}
}
// Event listeners ===========================================================
function onPrint() {
body.className = 'print-mode ' + initialBodyClass;
emptyNode(presentationContainer);
slideDivs.forEach(function(slideContainer, i) {
var subContainer = presentationContainer.appendChild(
ce('div', 'sub-container')
);
var slideBodyContainer = subContainer.appendChild(
ce('div', slideContainer.firstChild.getAttribute('data-bodyclass') || '')
);
slideBodyContainer.appendChild(slideContainer);
slideContainer.style.display = 'flex';
useDataImageAsBackground(slideContainer);
resizeTo(slideContainer, 512, 320);
if (notes[i].length) {
var notesUl = subContainer.appendChild(ce('ul', 'notes-list'));
notes[i].forEach(function(note) {
var li = notesUl.appendChild(ce('li'));
li.innerText = note;
});
}
});
big.mode = 'print';
}
function onTalk(i) {
if (big.mode === 'talk') return;
big.mode = 'talk';
body.className = 'talk-mode ' + initialBodyClass;
emptyNode(presentationContainer);
slideDivs.forEach(function(slideContainer) {
presentationContainer.appendChild(slideContainer);
});
var goTo = big.current;
if (typeof i === 'number') {
goTo = i;
}
go(goTo, false, true);
}
function onJump() {
if (big.mode === 'jump') return;
big.mode = 'jump';
body.className = 'jump-mode ' + initialBodyClass;
emptyNode(presentationContainer);
slideDivs.forEach(function(slideContainer, i) {
var subContainer = presentationContainer.appendChild(
ce('div', 'sub-container')
);
var slideBodyContainer = subContainer.appendChild(
ce('div', slideContainer.firstChild.getAttribute('data-bodyclass') || '')
);
slideBodyContainer.appendChild(slideContainer);
slideContainer.style.display = 'flex';
useDataImageAsBackground(slideContainer);
resizeTo(slideContainer, 192, 120);
function onClickSlide(e) {
subContainer.removeEventListener('click', onClickSlide);
e.stopPropagation();
e.preventDefault();
onTalk(i);
}
subContainer.addEventListener('click', onClickSlide);
});
}
function onClick(e) {
if (big.mode !== 'talk') return;
if (e.target.tagName !== 'A') go((big.current + 1) % big.length);
}
function onKeyDown(e) {
if (big.mode == 'talk') {
if (e.which === 39 || e.which === 34 || e.which === 40) forward();
if (e.which === 37 || e.which === 33 || e.which === 38) reverse();
}
if (e.which === 80) onPrint();
if (e.which === 84) onTalk();
if (e.which === 74) onJump();
}
function onTouchStart(e) {
if (big.mode !== 'talk') return;
// When the 'once' option to addEventListener is available, we'll be able to
// simplify this code, but for now we manually remove the End listener
// after it is invoked once
var startingPageX = e.changedTouches[0].pageX;
document.addEventListener('touchend', onTouchEnd);
function onTouchEnd(e2) {
document.removeEventListener('touchend', onTouchEnd);
var distanceTraveled = e2.changedTouches[0].pageX - startingPageX;
// Don't navigate if the person didn't swipe by fewer than 4 pixels
if (Math.abs(distanceTraveled) < 4) return;
if (distanceTraveled < 0) forward();
else reverse();
}
}
function onClickPlay(e) {
if (big.audio.paused) {
big.current === 0 ? forward() : big.audio.play();
} else big.audio.pause();
e.stopPropagation();
}
function onAudioUpdate() {
big.playControl.innerHTML = big.audio.paused ? '&#9654;' : '&#9208;';
if (!big.audio.paused) {
return;
}
for (var ci = 0; ci < big.audio.textTracks[0].cues.length; ci++) {
if (
big.audio.textTracks[0].cues[ci].startTime <= big.audio.currentTime &&
big.audio.textTracks[0].cues[ci].endTime > big.audio.currentTime &&
big.current - 1 !== ci
) {
return go(ci + 1, true);
}
}
}
function onHashChange() {
if (big.mode !== 'talk') return;
go(parseHash());
}
function onResize() {
if (big.mode !== 'talk') return;
var documentElement = document.documentElement;
if (!documentElement) {
throw new Error(
'document.documentElement not found, this environment is weird'
);
}
var width = documentElement.clientWidth;
var height = documentElement.clientHeight;
// Too wide
if (width / height > ASPECT_RATIO) {
width = Math.ceil(height * ASPECT_RATIO);
} else {
height = Math.ceil(width / ASPECT_RATIO);
}
resizeTo(slideDivs[big.current], width, height);
}
});
/*! highlight.js v9.11.0 | BSD3 License | git.io/hljslicense */
!(function(e) {
var t =
('object' == typeof window && window) || ('object' == typeof self && self);
'undefined' != typeof exports
? e(exports)
: t &&
((t.hljs = e({})), 'function' == typeof define &&
define.amd &&
define([], function() {
return t.hljs;
}));
})(function(e) {
function t(e) {
return e.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
function r(e) {
return e.nodeName.toLowerCase();
}
function a(e, t) {
var r = e && e.exec(t);
return r && 0 === r.index;
}
function n(e) {
return E.test(e);
}
function i(e) {
var t, r, a, i, s = e.className + ' ';
if (((s += e.parentNode ? e.parentNode.className : ''), (r = M.exec(s))))
return w(r[1]) ? r[1] : 'no-highlight';
for (
(s = s.split(/\s+/)), (t = 0), (a = s.length);
a > t;
t++
) if (((i = s[t]), n(i) || w(i))) return i;
}
function s(e) {
var t, r = {}, a = Array.prototype.slice.call(arguments, 1);
for (t in e) r[t] = e[t];
return a.forEach(function(e) {
for (t in e) r[t] = e[t];
}), r;
}
function c(e) {
var t = [];
return (function a(e, n) {
for (
var i = e.firstChild;
i;
i = i.nextSibling
) 3 === i.nodeType ? (n += i.nodeValue.length) : 1 === i.nodeType && (t.push({ event: 'start', offset: n, node: i }), (n = a(i, n)), r(i).match(/br|hr|img|input/) || t.push({ event: 'stop', offset: n, node: i }));
return n;
})(e, 0), t;
}
function o(e, a, n) {
function i() {
return e.length && a.length
? e[0].offset !== a[0].offset
? e[0].offset < a[0].offset ? e : a
: 'start' === a[0].event ? e : a
: e.length ? e : a;
}
function s(e) {
function a(e) {
return (
' ' + e.nodeName + '="' + t(e.value).replace('"', '&quot;') + '"'
);
}
u += '<' + r(e) + N.map.call(e.attributes, a).join('') + '>';
}
function c(e) {
u += '</' + r(e) + '>';
}
function o(e) {
('start' === e.event ? s : c)(e.node);
}
for (var l = 0, u = '', d = []; e.length || a.length; ) {
var b = i();
if (((u += t(n.substring(l, b[0].offset))), (l = b[0].offset), b === e)) {
d.reverse().forEach(c);
do
o(b.splice(0, 1)[0]), (b = i());
while (b === e && b.length && b[0].offset === l);
d.reverse().forEach(s);
} else 'start' === b[0].event ? d.push(b[0].node) : d.pop(), o(b.splice(0, 1)[0]);
}
return u + t(n.substr(l));
}
function l(e) {
return e.v &&
!e.cached_variants &&
(e.cached_variants = e.v.map(function(t) {
return s(e, { v: null }, t);
})), e.cached_variants || (e.eW && [s(e)]) || [e];
}
function u(e) {
function t(e) {
return (e && e.source) || e;
}
function r(r, a) {
return new RegExp(t(r), 'm' + (e.cI ? 'i' : '') + (a ? 'g' : ''));
}
function a(n, i) {
if (!n.compiled) {
if (((n.compiled = !0), (n.k = n.k || n.bK), n.k)) {
var s = {},
c = function(t, r) {
e.cI && (r = r.toLowerCase()), r.split(' ').forEach(function(e) {
var r = e.split('|');
s[r[0]] = [t, r[1] ? Number(r[1]) : 1];
});
};
'string' == typeof n.k
? c('keyword', n.k)
: k(n.k).forEach(function(e) {
c(e, n.k[e]);
}), (n.k = s);
}
(n.lR = r(n.l || /\w+/, !0)), i &&
(n.bK && (n.b = '\\b(' + n.bK.split(' ').join('|') + ')\\b'), n.b ||
(n.b = /\B|\b/), (n.bR = r(n.b)), n.e ||
n.eW ||
(n.e = /\B|\b/), n.e && (n.eR = r(n.e)), (n.tE =
t(n.e) || ''), n.eW &&
i.tE &&
(n.tE += (n.e ? '|' : '') + i.tE)), n.i && (n.iR = r(n.i)), null ==
n.r && (n.r = 1), n.c ||
(n.c = []), (n.c = Array.prototype.concat.apply(
[],
n.c.map(function(e) {
return l('self' === e ? n : e);
})
)), n.c.forEach(function(e) {
a(e, n);
}), n.starts && a(n.starts, i);
var o = n.c
.map(function(e) {
return e.bK ? '\\.?(' + e.b + ')\\.?' : e.b;
})
.concat([n.tE, n.i])
.map(t)
.filter(Boolean);
n.t = o.length
? r(o.join('|'), !0)
: {
exec: function() {
return null;
}
};
}
}
a(e);
}
function d(e, r, n, i) {
function s(e, t) {
var r, n;
for (
(r = 0), (n = t.c.length);
n > r;
r++
) if (a(t.c[r].bR, e)) return t.c[r];
}
function c(e, t) {
if (a(e.eR, t)) {
for (; e.endsParent && e.parent; )
e = e.parent;
return e;
}
return e.eW ? c(e.parent, t) : void 0;
}
function o(e, t) {
return !n && a(t.iR, e);
}
function l(e, t) {
var r = v.cI ? t[0].toLowerCase() : t[0];
return e.k.hasOwnProperty(r) && e.k[r];
}
function p(e, t, r, a) {
var n = a ? '' : L.classPrefix, i = '<span class="' + n, s = r ? '' : R;
return (i += e + '">'), i + t + s;
}
function m() {
var e, r, a, n;
if (!N.k) return t(E);
for (
(n = ''), (r = 0), (N.lR.lastIndex = 0), (a = N.lR.exec(E));
a;
) (n += t(E.substring(r, a.index))), (e = l(N, a)), e ? ((M += e[1]), (n += p(e[0], t(a[0])))) : (n += t(a[0])), (r = N.lR.lastIndex), (a = N.lR.exec(E));
return n + t(E.substr(r));
}
function f() {
var e = 'string' == typeof N.sL;
if (e && !x[N.sL]) return t(E);
var r = e ? d(N.sL, E, !0, k[N.sL]) : b(E, N.sL.length ? N.sL : void 0);
return N.r > 0 &&
(M += r.r), e && (k[N.sL] = r.top), p(r.language, r.value, !1, !0);
}
function g() {
(C += null != N.sL ? f() : m()), (E = '');
}
function _(e) {
(C += e.cN
? p(e.cN, '', !0)
: ''), (N = Object.create(e, { parent: { value: N } }));
}
function h(e, t) {
if (((E += e), null == t)) return g(), 0;
var r = s(t, N);
if (r)
return r.skip
? (E += t)
: (r.eB && (E += t), g(), r.rB || r.eB || (E = t)), _(r, t), r.rB
? 0
: t.length;
var a = c(N, t);
if (a) {
var n = N;
n.skip ? (E += t) : (n.rE || n.eE || (E += t), g(), n.eE && (E = t));
do
N.cN && (C += R), N.skip || (M += N.r), (N = N.parent);
while (N !== a.parent);
return a.starts && _(a.starts, ''), n.rE ? 0 : t.length;
}
if (o(t, N))
throw new Error(
'Illegal lexeme "' + t + '" for mode "' + (N.cN || '<unnamed>') + '"'
);
return (E += t), t.length || 1;
}
var v = w(e);
if (!v) throw new Error('Unknown language: "' + e + '"');
u(v);
var y, N = i || v, k = {}, C = '';
for (y = N; y !== v; y = y.parent) y.cN && (C = p(y.cN, '', !0) + C);
var E = '', M = 0;
try {
for (var B, S, $ = 0; ; ) {
if (((N.t.lastIndex = $), (B = N.t.exec(r)), !B)) break;
(S = h(r.substring($, B.index), B[0])), ($ = B.index + S);
}
for (h(r.substr($)), (y = N); y.parent; y = y.parent) y.cN && (C += R);
return { r: M, value: C, language: e, top: N };
} catch (A) {
if (A.message && -1 !== A.message.indexOf('Illegal'))
return { r: 0, value: t(r) };
throw A;
}
}
function b(e, r) {
r = r || L.languages || k(x);
var a = { r: 0, value: t(e) }, n = a;
return r.filter(w).forEach(function(t) {
var r = d(t, e, !1);
(r.language = t), r.r > n.r && (n = r), r.r > a.r && ((n = a), (a = r));
}), n.language && (a.second_best = n), a;
}
function p(e) {
return L.tabReplace || L.useBR
? e.replace(B, function(e, t) {
return L.useBR && '\n' === e
? '<br>'
: L.tabReplace ? t.replace(/\t/g, L.tabReplace) : '';
})
: e;
}
function m(e, t, r) {
var a = t ? C[t] : r, n = [e.trim()];
return e.match(/\bhljs\b/) ||
n.push('hljs'), -1 === e.indexOf(a) && n.push(a), n.join(' ').trim();
}
function f(e) {
var t, r, a, s, l, u = i(e);
n(u) ||
(L.useBR
? ((t = document.createElementNS(
'http://www.w3.org/1999/xhtml',
'div'
)), (t.innerHTML = e.innerHTML
.replace(/\n/g, '')
.replace(/<br[ \/]*>/g, '\n')))
: (t = e), (l = t.textContent), (a = u ? d(u, l, !0) : b(l)), (r = c(
t
)), r.length &&
((s = document.createElementNS(
'http://www.w3.org/1999/xhtml',
'div'
)), (s.innerHTML = a.value), (a.value = o(r, c(s), l))), (a.value = p(
a.value
)), (e.innerHTML = a.value), (e.className = m(
e.className,
u,
a.language
)), (e.result = { language: a.language, re: a.r }), a.second_best &&
(e.second_best = {
language: a.second_best.language,
re: a.second_best.r
}));
}
function g(e) {
L = s(L, e);
}
function _() {
if (!_.called) {
_.called = !0;
var e = document.querySelectorAll('pre code');
N.forEach.call(e, f);
}
}
function h() {
addEventListener(
'DOMContentLoaded',
_,
!1
), addEventListener('load', _, !1);
}
function v(t, r) {
var a = (x[t] = r(e));
a.aliases &&
a.aliases.forEach(function(e) {
C[e] = t;
});
}
function y() {
return k(x);
}
function w(e) {
return (e = (e || '').toLowerCase()), x[e] || x[C[e]];
}
var N = [],
k = Object.keys,
x = {},
C = {},
E = /^(no-?highlight|plain|text)$/i,
M = /\blang(?:uage)?-([\w-]+)\b/i,
B = /((^(<[^>]+>|\t|)+|(?:\n)))/gm,
R = '</span>',
L = {
classPrefix: 'hljs-',
tabReplace: null,
useBR: !1,
languages: void 0
};
return (e.highlight = d), (e.highlightAuto = b), (e.fixMarkup = p), (e.highlightBlock = f), (e.configure = g), (e.initHighlighting = _), (e.initHighlightingOnLoad = h), (e.registerLanguage = v), (e.listLanguages = y), (e.getLanguage = w), (e.inherit = s), (e.IR = '[a-zA-Z]\\w*'), (e.UIR = '[a-zA-Z_]\\w*'), (e.NR = '\\b\\d+(\\.\\d+)?'), (e.CNR = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'), (e.BNR = '\\b(0b[01]+)'), (e.RSR = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~'), (e.BE = { b: '\\\\[\\s\\S]', r: 0 }), (e.ASM = { cN: 'string', b: "'", e: "'", i: '\\n', c: [e.BE] }), (e.QSM = { cN: 'string', b: '"', e: '"', i: '\\n', c: [e.BE] }), (e.PWM = { b: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ }), (e.C = function(
t,
r,
a
) {
var n = e.inherit({ cN: 'comment', b: t, e: r, c: [] }, a || {});
return n.c.push(e.PWM), n.c.push({
cN: 'doctag',
b: '(?:TODO|FIXME|NOTE|BUG|XXX):',
r: 0
}), n;
}), (e.CLCM = e.C('//', '$')), (e.CBCM = e.C('/\\*', '\\*/')), (e.HCM = e.C('#', '$')), (e.NM = { cN: 'number', b: e.NR, r: 0 }), (e.CNM = { cN: 'number', b: e.CNR, r: 0 }), (e.BNM = { cN: 'number', b: e.BNR, r: 0 }), (e.CSSNM = { cN: 'number', b: e.NR + '(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?', r: 0 }), (e.RM = { cN: 'regexp', b: /\//, e: /\/[gimuy]*/, i: /\n/, c: [e.BE, { b: /\[/, e: /\]/, r: 0, c: [e.BE] }] }), (e.TM = { cN: 'title', b: e.IR, r: 0 }), (e.UTM = { cN: 'title', b: e.UIR, r: 0 }), (e.METHOD_GUARD = { b: '\\.\\s*' + e.UIR, r: 0 }), e.registerLanguage(
'apache',
function(e) {
var t = { cN: 'number', b: '[\\$%]\\d+' };
return {
aliases: ['apacheconf'],
cI: !0,
c: [
e.HCM,
{ cN: 'section', b: '</?', e: '>' },
{
cN: 'attribute',
b: /\w+/,
r: 0,
k: {
nomarkup: 'order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername'
},
starts: {
e: /$/,
r: 0,
k: { literal: 'on off all' },
c: [
{ cN: 'meta', b: '\\s\\[', e: '\\]$' },
{ cN: 'variable', b: '[\\$%]\\{', e: '\\}', c: ['self', t] },
t,
e.QSM
]
}
}
],
i: /\S/
};
}
), e.registerLanguage('bash', function(e) {
var t = {
cN: 'variable',
v: [{ b: /\$[\w\d#@][\w\d_]*/ }, { b: /\$\{(.*?)}/ }]
},
r = {
cN: 'string',
b: /"/,
e: /"/,
c: [e.BE, t, { cN: 'variable', b: /\$\(/, e: /\)/, c: [e.BE] }]
},
a = { cN: 'string', b: /'/, e: /'/ };
return {
aliases: ['sh', 'zsh'],
l: /-?[a-z\._]+/,
k: {
keyword: 'if then else elif fi for while in do done case esac function',
literal: 'true false',
built_in: 'break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp',
_: '-ne -eq -lt -gt -f -d -e -s -l -a'
},
c: [
{ cN: 'meta', b: /^#![^\n]+sh\s*$/, r: 10 },
{
cN: 'function',
b: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
rB: !0,
c: [e.inherit(e.TM, { b: /\w[\w\d_]*/ })],
r: 0
},
e.HCM,
r,
a,
t
]
};
}), e.registerLanguage('coffeescript', function(e) {
var t = {
keyword: 'in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not',
literal: 'true false null undefined yes no on off',
built_in: 'npm require console print module global window document'
},
r = '[A-Za-z$_][0-9A-Za-z$_]*',
a = { cN: 'subst', b: /#\{/, e: /}/, k: t },
n = [
e.BNM,
e.inherit(e.CNM, { starts: { e: '(\\s*/)?', r: 0 } }),
{
cN: 'string',
v: [
{ b: /'''/, e: /'''/, c: [e.BE] },
{ b: /'/, e: /'/, c: [e.BE] },
{ b: /"""/, e: /"""/, c: [e.BE, a] },
{ b: /"/, e: /"/, c: [e.BE, a] }
]
},
{
cN: 'regexp',
v: [
{ b: '///', e: '///', c: [a, e.HCM] },
{ b: '//[gim]*', r: 0 },
{ b: /\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/ }
]
},
{ b: '@' + r },
{
sL: 'javascript',
eB: !0,
eE: !0,
v: [{ b: '```', e: '```' }, { b: '`', e: '`' }]
}
];
a.c = n;
var i = e.inherit(e.TM, { b: r }),
s = '(\\(.*\\))?\\s*\\B[-=]>',
c = {
cN: 'params',
b: '\\([^\\(]',
rB: !0,
c: [{ b: /\(/, e: /\)/, k: t, c: ['self'].concat(n) }]
};
return {
aliases: ['coffee', 'cson', 'iced'],
k: t,
i: /\/\*/,
c: n.concat([
e.C('###', '###'),
e.HCM,
{
cN: 'function',
b: '^\\s*' + r + '\\s*=\\s*' + s,
e: '[-=]>',
rB: !0,
c: [i, c]
},
{
b: /[:\(,=]\s*/,
r: 0,
c: [{ cN: 'function', b: s, e: '[-=]>', rB: !0, c: [c] }]
},
{
cN: 'class',
bK: 'class',
e: '$',
i: /[:="\[\]]/,
c: [{ bK: 'extends', eW: !0, i: /[:="\[\]]/, c: [i] }, i]
},
{ b: r + ':', e: ':', rB: !0, rE: !0, r: 0 }
])
};
}), e.registerLanguage('cpp', function(e) {
var t = { cN: 'keyword', b: '\\b[a-z\\d_]*_t\\b' },
r = {
cN: 'string',
v: [
{ b: '(u8?|U)?L?"', e: '"', i: '\\n', c: [e.BE] },
{ b: '(u8?|U)?R"', e: '"', c: [e.BE] },
{ b: "'\\\\?.", e: "'", i: '.' }
]
},
a = {
cN: 'number',
v: [
{ b: "\\b(0b[01']+)" },
{
b: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"
},
{
b: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"
}
],
r: 0
},
n = {
cN: 'meta',
b: /#\s*[a-z]+\b/,
e: /$/,
k: {
'meta-keyword': 'if else elif endif define undef warning error line pragma ifdef ifndef include'
},
c: [
{ b: /\\\n/, r: 0 },
e.inherit(r, { cN: 'meta-string' }),
{ cN: 'meta-string', b: /<[^\n>]*>/, e: /$/, i: '\\n' },
e.CLCM,
e.CBCM
]
},
i = e.IR + '\\s*\\(',
s = {
keyword: 'int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not',
built_in: 'std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr',
literal: 'true false nullptr NULL'
},
c = [t, e.CLCM, e.CBCM, a, r];
return {
aliases: ['c', 'cc', 'h', 'c++', 'h++', 'hpp'],
k: s,
i: '</',
c: c.concat([
n,
{
b: '\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<',
e: '>',
k: s,
c: ['self', t]
},
{ b: e.IR + '::', k: s },
{
v: [
{ b: /=/, e: /;/ },
{ b: /\(/, e: /\)/ },
{ bK: 'new throw return else', e: /;/ }
],
k: s,
c: c.concat([
{ b: /\(/, e: /\)/, k: s, c: c.concat(['self']), r: 0 }
]),
r: 0
},
{
cN: 'function',
b: '(' + e.IR + '[\\*&\\s]+)+' + i,
rB: !0,
e: /[{;=]/,
eE: !0,
k: s,
i: /[^\w\s\*&]/,
c: [
{ b: i, rB: !0, c: [e.TM], r: 0 },
{
cN: 'params',
b: /\(/,
e: /\)/,
k: s,
r: 0,
c: [e.CLCM, e.CBCM, r, a, t]
},
e.CLCM,
e.CBCM,
n
]
},
{
cN: 'class',
bK: 'class struct',
e: /[{;:]/,
c: [{ b: /</, e: />/, c: ['self'] }, e.TM]
}
]),
exports: { preprocessor: n, strings: r, k: s }
};
}), e.registerLanguage('cs', function(e) {
var t = {
keyword: 'abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while nameof add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield',
literal: 'null false true'
},
r = { cN: 'string', b: '@"', e: '"', c: [{ b: '""' }] },
a = e.inherit(r, { i: /\n/ }),
n = { cN: 'subst', b: '{', e: '}', k: t },
i = e.inherit(n, { i: /\n/ }),
s = {
cN: 'string',
b: /\$"/,
e: '"',
i: /\n/,
c: [{ b: '{{' }, { b: '}}' }, e.BE, i]
},
c = {
cN: 'string',
b: /\$@"/,
e: '"',
c: [{ b: '{{' }, { b: '}}' }, { b: '""' }, n]
},
o = e.inherit(c, {
i: /\n/,
c: [{ b: '{{' }, { b: '}}' }, { b: '""' }, i]
});
(n.c = [
c,
s,
r,
e.ASM,
e.QSM,
e.CNM,
e.CBCM
]), (i.c = [o, s, a, e.ASM, e.QSM, e.CNM, e.inherit(e.CBCM, { i: /\n/ })]);
var l = { v: [c, s, r, e.ASM, e.QSM] },
u = e.IR + '(<' + e.IR + '(\\s*,\\s*' + e.IR + ')*>)?(\\[\\])?';
return {
aliases: ['csharp'],
k: t,
i: /::/,
c: [
e.C('///', '$', {
rB: !0,
c: [
{
cN: 'doctag',
v: [{ b: '///', r: 0 }, { b: '<!--|-->' }, { b: '</?', e: '>' }]
}
]
}),
e.CLCM,
e.CBCM,
{
cN: 'meta',
b: '#',
e: '$',
k: {
'meta-keyword': 'if else elif endif define undef warning error line region endregion pragma checksum'
}
},
l,
e.CNM,
{
bK: 'class interface',
e: /[{;=]/,
i: /[^\s:]/,
c: [e.TM, e.CLCM, e.CBCM]
},
{
bK: 'namespace',
e: /[{;=]/,
i: /[^\s:]/,
c: [e.inherit(e.TM, { b: '[a-zA-Z](\\.?\\w)*' }), e.CLCM, e.CBCM]
},
{ bK: 'new return throw await', r: 0 },
{
cN: 'function',
b: '(' + u + '\\s+)+' + e.IR + '\\s*\\(',
rB: !0,
e: /[{;=]/,
eE: !0,
k: t,
c: [
{ b: e.IR + '\\s*\\(', rB: !0, c: [e.TM], r: 0 },
{
cN: 'params',
b: /\(/,
e: /\)/,
eB: !0,
eE: !0,
k: t,
r: 0,
c: [l, e.CNM, e.CBCM]
},
e.CLCM,
e.CBCM
]
}
]
};
}), e.registerLanguage('css', function(e) {
var t = '[a-zA-Z-][a-zA-Z0-9_-]*',
r = {
b: /[A-Z\_\.\-]+\s*:/,
rB: !0,
e: ';',
eW: !0,
c: [
{
cN: 'attribute',
b: /\S/,
e: ':',
eE: !0,
starts: {
eW: !0,
eE: !0,
c: [
{
b: /[\w-]+\(/,
rB: !0,
c: [
{ cN: 'built_in', b: /[\w-]+/ },
{ b: /\(/, e: /\)/, c: [e.ASM, e.QSM] }
]
},
e.CSSNM,
e.QSM,
e.ASM,
e.CBCM,
{ cN: 'number', b: '#[0-9A-Fa-f]+' },
{ cN: 'meta', b: '!important' }
]
}
}
]
};
return {
cI: !0,
i: /[=\/|'\$]/,
c: [
e.CBCM,
{ cN: 'selector-id', b: /#[A-Za-z0-9_-]+/ },
{ cN: 'selector-class', b: /\.[A-Za-z0-9_-]+/ },
{ cN: 'selector-attr', b: /\[/, e: /\]/, i: '$' },
{ cN: 'selector-pseudo', b: /:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/ },
{ b: '@(font-face|page)', l: '[a-z-]+', k: 'font-face page' },
{
b: '@',
e: '[{;]',
i: /:/,
c: [
{ cN: 'keyword', b: /\w+/ },
{ b: /\s/, eW: !0, eE: !0, r: 0, c: [e.ASM, e.QSM, e.CSSNM] }
]
},
{ cN: 'selector-tag', b: t, r: 0 },
{ b: '{', e: '}', i: /\S/, c: [e.CBCM, r] }
]
};
}), e.registerLanguage('diff', function(e) {
return {
aliases: ['patch'],
c: [
{
cN: 'meta',
r: 10,
v: [
{ b: /^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/ },
{ b: /^\*\*\* +\d+,\d+ +\*\*\*\*$/ },
{ b: /^\-\-\- +\d+,\d+ +\-\-\-\-$/ }
]
},
{
cN: 'comment',
v: [
{ b: /Index: /, e: /$/ },
{ b: /={3,}/, e: /$/ },
{ b: /^\-{3}/, e: /$/ },
{ b: /^\*{3} /, e: /$/ },
{ b: /^\+{3}/, e: /$/ },
{ b: /\*{5}/, e: /\*{5}$/ }
]
},
{ cN: 'addition', b: '^\\+', e: '$' },
{ cN: 'deletion', b: '^\\-', e: '$' },
{ cN: 'addition', b: '^\\!', e: '$' }
]
};
}), e.registerLanguage('http', function(e) {
var t = 'HTTP/[0-9\\.]+';
return {
aliases: ['https'],
i: '\\S',
c: [
{ b: '^' + t, e: '$', c: [{ cN: 'number', b: '\\b\\d{3}\\b' }] },
{
b: '^[A-Z]+ (.*?) ' + t + '$',
rB: !0,
e: '$',
c: [
{ cN: 'string', b: ' ', e: ' ', eB: !0, eE: !0 },
{ b: t },
{ cN: 'keyword', b: '[A-Z]+' }
]
},
{
cN: 'attribute',
b: '^\\w',
e: ': ',
eE: !0,
i: '\\n|\\s|=',
starts: { e: '$', r: 0 }
},
{ b: '\\n\\n', starts: { sL: [], eW: !0 } }
]
};
}), e.registerLanguage('ini', function(e) {
var t = {
cN: 'string',
c: [e.BE],
v: [
{ b: "'''", e: "'''", r: 10 },
{ b: '"""', e: '"""', r: 10 },
{ b: '"', e: '"' },
{ b: "'", e: "'" }
]
};
return {
aliases: ['toml'],
cI: !0,
i: /\S/,
c: [
e.C(';', '$'),
e.HCM,
{ cN: 'section', b: /^\s*\[+/, e: /\]+/ },
{
b: /^[a-z0-9\[\]_-]+\s*=\s*/,
e: '$',
rB: !0,
c: [
{ cN: 'attr', b: /[a-z0-9\[\]_-]+/ },
{
b: /=/,
eW: !0,
r: 0,
c: [
{ cN: 'literal', b: /\bon|off|true|false|yes|no\b/ },
{
cN: 'variable',
v: [{ b: /\$[\w\d"][\w\d_]*/ }, { b: /\$\{(.*?)}/ }]
},
t,
{ cN: 'number', b: /([\+\-]+)?[\d]+_[\d_]+/ },
e.NM
]
}
]
}
]
};
}), e.registerLanguage('java', function(e) {
var t = '[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*',
r = t + '(<' + t + '(\\s*,\\s*' + t + ')*>)?',
a =
'false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do',
n =
'\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?',
i = { cN: 'number', b: n, r: 0 };
return {
aliases: ['jsp'],
k: a,
i: /<\/|#/,
c: [
e.C('/\\*\\*', '\\*/', {
r: 0,
c: [{ b: /\w+@/, r: 0 }, { cN: 'doctag', b: '@[A-Za-z]+' }]
}),
e.CLCM,
e.CBCM,
e.ASM,
e.QSM,
{
cN: 'class',
bK: 'class interface',
e: /[{;=]/,
eE: !0,
k: 'class interface',
i: /[:"\[\]]/,
c: [{ bK: 'extends implements' }, e.UTM]
},
{ bK: 'new throw return else', r: 0 },
{
cN: 'function',
b: '(' + r + '\\s+)+' + e.UIR + '\\s*\\(',
rB: !0,
e: /[{;=]/,
eE: !0,
k: a,
c: [
{ b: e.UIR + '\\s*\\(', rB: !0, r: 0, c: [e.UTM] },
{
cN: 'params',
b: /\(/,
e: /\)/,
k: a,
r: 0,
c: [e.ASM, e.QSM, e.CNM, e.CBCM]
},
e.CLCM,
e.CBCM
]
},
i,
{ cN: 'meta', b: '@[A-Za-z]+' }
]
};
}), e.registerLanguage('javascript', function(e) {
var t = '[A-Za-z$_][0-9A-Za-z$_]*',
r = {
keyword: 'in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as',
literal: 'true false null undefined NaN Infinity',
built_in: 'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise'
},
a = {
cN: 'number',
v: [{ b: '\\b(0[bB][01]+)' }, { b: '\\b(0[oO][0-7]+)' }, { b: e.CNR }],
r: 0
},
n = { cN: 'subst', b: '\\$\\{', e: '\\}', k: r, c: [] },
i = { cN: 'string', b: '`', e: '`', c: [e.BE, n] };
n.c = [e.ASM, e.QSM, i, a, e.RM];
var s = n.c.concat([e.CBCM, e.CLCM]);
return {
aliases: ['js', 'jsx'],
k: r,
c: [
{ cN: 'meta', r: 10, b: /^\s*['"]use (strict|asm)['"]/ },
{ cN: 'meta', b: /^#!/, e: /$/ },
e.ASM,
e.QSM,
i,
e.CLCM,
e.CBCM,
a,
{
b: /[{,]\s*/,
r: 0,
c: [{ b: t + '\\s*:', rB: !0, r: 0, c: [{ cN: 'attr', b: t, r: 0 }] }]
},
{
b: '(' + e.RSR + '|\\b(case|return|throw)\\b)\\s*',
k: 'return throw case',
c: [
e.CLCM,
e.CBCM,
e.RM,
{
cN: 'function',
b: '(\\(.*?\\)|' + t + ')\\s*=>',
rB: !0,
e: '\\s*=>',
c: [
{
cN: 'params',
v: [
{ b: t },
{ b: /\(\s*\)/ },
{ b: /\(/, e: /\)/, eB: !0, eE: !0, k: r, c: s }
]
}
]
},
{
b: /</,
e: /(\/\w+|\w+\/)>/,
sL: 'xml',
c: [
{ b: /<\w+\s*\/>/, skip: !0 },
{
b: /<\w+/,
e: /(\/\w+|\w+\/)>/,
skip: !0,
c: [{ b: /<\w+\s*\/>/, skip: !0 }, 'self']
}
]
}
],
r: 0
},
{
cN: 'function',
bK: 'function',
e: /\{/,
eE: !0,
c: [
e.inherit(e.TM, { b: t }),
{ cN: 'params', b: /\(/, e: /\)/, eB: !0, eE: !0, c: s }
],
i: /\[|%/
},
{ b: /\$[(.]/ },
e.METHOD_GUARD,
{
cN: 'class',
bK: 'class',
e: /[{;=]/,
eE: !0,
i: /[:"\[\]]/,
c: [{ bK: 'extends' }, e.UTM]
},
{ bK: 'constructor', e: /\{/, eE: !0 }
],
i: /#(?!!)/
};
}), e.registerLanguage('json', function(e) {
var t = { literal: 'true false null' },
r = [e.QSM, e.CNM],
a = { e: ',', eW: !0, eE: !0, c: r, k: t },
n = {
b: '{',
e: '}',
c: [
{ cN: 'attr', b: /"/, e: /"/, c: [e.BE], i: '\\n' },
e.inherit(a, { b: /:/ })
],
i: '\\S'
},
i = { b: '\\[', e: '\\]', c: [e.inherit(a)], i: '\\S' };
return r.splice(r.length, 0, n, i), { c: r, k: t, i: '\\S' };
}), e.registerLanguage('makefile', function(e) {
var t = {
cN: 'variable',
v: [{ b: '\\$\\(' + e.UIR + '\\)', c: [e.BE] }, { b: /\$[@%<?\^\+\*]/ }]
},
r = { cN: 'string', b: /"/, e: /"/, c: [e.BE, t] },
a = {
cN: 'variable',
b: /\$\([\w-]+\s/,
e: /\)/,
k: {
built_in: 'subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value'
},
c: [t]
},
n = {
b: '^' + e.UIR + '\\s*[:+?]?=',
i: '\\n',
rB: !0,
c: [{ b: '^' + e.UIR, e: '[:+?]?=', eE: !0 }]
},
i = {
cN: 'meta',
b: /^\.PHONY:/,
e: /$/,
k: { 'meta-keyword': '.PHONY' },
l: /[\.\w]+/
},
s = { cN: 'section', b: /^[^\s]+:/, e: /$/, c: [t] };
return {
aliases: ['mk', 'mak'],
k: 'define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath',
l: /[\w-]+/,
c: [e.HCM, t, r, a, n, i, s]
};
}), e.registerLanguage('xml', function(e) {
var t = '[A-Za-z0-9\\._:-]+',
r = {
eW: !0,
i: /</,
r: 0,
c: [
{ cN: 'attr', b: t, r: 0 },
{
b: /=\s*/,
r: 0,
c: [
{
cN: 'string',
endsParent: !0,
v: [
{ b: /"/, e: /"/ },
{ b: /'/, e: /'/ },
{ b: /[^\s"'=<>`]+/ }
]
}
]
}
]
};
return {
aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist'],
cI: !0,
c: [
{
cN: 'meta',
b: '<!DOCTYPE',
e: '>',
r: 10,
c: [{ b: '\\[', e: '\\]' }]
},
e.C('<!--', '-->', { r: 10 }),
{ b: '<\\!\\[CDATA\\[', e: '\\]\\]>', r: 10 },
{
b: /<\?(php)?/,
e: /\?>/,
sL: 'php',
c: [{ b: '/\\*', e: '\\*/', skip: !0 }]
},
{
cN: 'tag',
b: '<style(?=\\s|>|$)',
e: '>',
k: { name: 'style' },
c: [r],
starts: { e: '</style>', rE: !0, sL: ['css', 'xml'] }
},
{
cN: 'tag',
b: '<script(?=\\s|>|$)',
e: '>',
k: { name: 'script' },
c: [r],
starts: {
e: '</script>',
rE: !0,
sL: ['actionscript', 'javascript', 'handlebars', 'xml']
}
},
{
cN: 'meta',
v: [{ b: /<\?xml/, e: /\?>/, r: 10 }, { b: /<\?\w+/, e: /\?>/ }]
},
{
cN: 'tag',
b: '</?',
e: '/?>',
c: [{ cN: 'name', b: /[^\/><\s]+/, r: 0 }, r]
}
]
};
}), e.registerLanguage('markdown', function(e) {
return {
aliases: ['md', 'mkdown', 'mkd'],
c: [
{
cN: 'section',
v: [{ b: '^#{1,6}', e: '$' }, { b: '^.+?\\n[=-]{2,}$' }]
},
{ b: '<', e: '>', sL: 'xml', r: 0 },
{ cN: 'bullet', b: '^([*+-]|(\\d+\\.))\\s+' },
{ cN: 'strong', b: '[*_]{2}.+?[*_]{2}' },
{ cN: 'emphasis', v: [{ b: '\\*.+?\\*' }, { b: '_.+?_', r: 0 }] },
{ cN: 'quote', b: '^>\\s+', e: '$' },
{
cN: 'code',
v: [
{ b: '^```w*s*$', e: '^```s*$' },
{ b: '`.+?`' },
{ b: '^( {4}| )', e: '$', r: 0 }
]
},
{ b: '^[-\\*]{3,}', e: '$' },
{
b: '\\[.+?\\][\\(\\[].*?[\\)\\]]',
rB: !0,
c: [
{ cN: 'string', b: '\\[', e: '\\]', eB: !0, rE: !0, r: 0 },
{ cN: 'link', b: '\\]\\(', e: '\\)', eB: !0, eE: !0 },
{ cN: 'symbol', b: '\\]\\[', e: '\\]', eB: !0, eE: !0 }
],
r: 10
},
{
b: /^\[[^\n]+\]:/,
rB: !0,
c: [
{ cN: 'symbol', b: /\[/, e: /\]/, eB: !0, eE: !0 },
{ cN: 'link', b: /:\s*/, e: /$/, eB: !0 }
]
}
]
};
}), e.registerLanguage('nginx', function(e) {
var t = {
cN: 'variable',
v: [{ b: /\$\d+/ }, { b: /\$\{/, e: /}/ }, { b: '[\\$\\@]' + e.UIR }]
},
r = {
eW: !0,
l: '[a-z/_]+',
k: {
literal: 'on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll'
},
r: 0,
i: '=>',
c: [
e.HCM,
{
cN: 'string',
c: [e.BE, t],
v: [{ b: /"/, e: /"/ }, { b: /'/, e: /'/ }]
},
{ b: '([a-z]+):/', e: '\\s', eW: !0, eE: !0, c: [t] },
{
cN: 'regexp',
c: [e.BE, t],
v: [
{ b: '\\s\\^', e: '\\s|{|;', rE: !0 },
{ b: '~\\*?\\s+', e: '\\s|{|;', rE: !0 },
{ b: '\\*(\\.[a-z\\-]+)+' },
{ b: '([a-z\\-]+\\.)+\\*' }
]
},
{
cN: 'number',
b: '\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b'
},
{ cN: 'number', b: '\\b\\d+[kKmMgGdshdwy]*\\b', r: 0 },
t
]
};
return {
aliases: ['nginxconf'],
c: [
e.HCM,
{
b: e.UIR + '\\s+{',
rB: !0,
e: '{',
c: [{ cN: 'section', b: e.UIR }],
r: 0
},
{
b: e.UIR + '\\s',
e: ';|{',
rB: !0,
c: [{ cN: 'attribute', b: e.UIR, starts: r }],
r: 0
}
],
i: '[^\\s\\}]'
};
}), e.registerLanguage('objectivec', function(e) {
var t = {
cN: 'built_in',
b: '\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+'
},
r = {
keyword: 'int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN',
literal: 'false true FALSE TRUE nil YES NO NULL',
built_in: 'BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once'
},
a = /[a-zA-Z@][a-zA-Z0-9_]*/,
n = '@interface @class @protocol @implementation';
return {
aliases: ['mm', 'objc', 'obj-c'],
k: r,
l: a,
i: '</',
c: [
t,
e.CLCM,
e.CBCM,
e.CNM,
e.QSM,
{
cN: 'string',
v: [
{ b: '@"', e: '"', i: '\\n', c: [e.BE] },
{ b: "'", e: "[^\\\\]'", i: "[^\\\\][^']" }
]
},
{
cN: 'meta',
b: '#',
e: '$',
c: [
{ cN: 'meta-string', v: [{ b: '"', e: '"' }, { b: '<', e: '>' }] }
]
},
{
cN: 'class',
b: '(' + n.split(' ').join('|') + ')\\b',
e: '({|$)',
eE: !0,
k: n,
l: a,
c: [e.UTM]
},
{ b: '\\.' + e.UIR, r: 0 }
]
};
}), e.registerLanguage('perl', function(e) {
var t =
'getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when',
r = { cN: 'subst', b: '[$@]\\{', e: '\\}', k: t },
a = { b: '->{', e: '}' },
n = {
v: [
{ b: /\$\d/ },
{ b: /[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/ },
{ b: /[\$%@][^\s\w{]/, r: 0 }
]
},
i = [e.BE, r, n],
s = [
n,
e.HCM,
e.C('^\\=\\w', '\\=cut', { eW: !0 }),
a,
{
cN: 'string',
c: i,
v: [
{ b: 'q[qwxr]?\\s*\\(', e: '\\)', r: 5 },
{ b: 'q[qwxr]?\\s*\\[', e: '\\]', r: 5 },
{ b: 'q[qwxr]?\\s*\\{', e: '\\}', r: 5 },
{ b: 'q[qwxr]?\\s*\\|', e: '\\|', r: 5 },
{ b: 'q[qwxr]?\\s*\\<', e: '\\>', r: 5 },
{ b: 'qw\\s+q', e: 'q', r: 5 },
{ b: "'", e: "'", c: [e.BE] },
{ b: '"', e: '"' },
{ b: '`', e: '`', c: [e.BE] },
{ b: '{\\w+}', c: [], r: 0 },
{ b: '-?\\w+\\s*\\=\\>', c: [], r: 0 }
]
},
{
cN: 'number',
b: '(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b',
r: 0
},
{
b: '(\\/\\/|' +
e.RSR +
'|\\b(split|return|print|reverse|grep)\\b)\\s*',
k: 'split return print reverse grep',
r: 0,
c: [
e.HCM,
{
cN: 'regexp',
b: '(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*',
r: 10
},
{ cN: 'regexp', b: '(m|qr)?/', e: '/[a-z]*', c: [e.BE], r: 0 }
]
},
{
cN: 'function',
bK: 'sub',
e: '(\\s*\\(.*?\\))?[;{]',
eE: !0,
r: 5,
c: [e.TM]
},
{ b: '-\\w\\b', r: 0 },
{
b: '^__DATA__$',
e: '^__END__$',
sL: 'mojolicious',
c: [{ b: '^@@.*', e: '$', cN: 'comment' }]
}
];
return (r.c = s), (a.c = s), { aliases: ['pl', 'pm'], l: /[\w\.]+/, k: t, c: s };
}), e.registerLanguage('php', function(e) {
var t = { b: '\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*' },
r = { cN: 'meta', b: /<\?(php)?|\?>/ },
a = {
cN: 'string',
c: [e.BE, r],
v: [
{ b: 'b"', e: '"' },
{ b: "b'", e: "'" },
e.inherit(e.ASM, { i: null }),
e.inherit(e.QSM, { i: null })
]
},
n = { v: [e.BNM, e.CNM] };
return {
aliases: ['php3', 'php4', 'php5', 'php6'],
cI: !0,
k: 'and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally',
c: [
e.HCM,
e.C('//', '$', { c: [r] }),
e.C('/\\*', '\\*/', { c: [{ cN: 'doctag', b: '@[A-Za-z]+' }] }),
e.C('__halt_compiler.+?;', !1, {
eW: !0,
k: '__halt_compiler',
l: e.UIR
}),
{
cN: 'string',
b: /<<<['"]?\w+['"]?$/,
e: /^\w+;?$/,
c: [
e.BE,
{ cN: 'subst', v: [{ b: /\$\w+/ }, { b: /\{\$/, e: /\}/ }] }
]
},
r,
{ cN: 'keyword', b: /\$this\b/ },
t,
{ b: /(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/ },
{
cN: 'function',
bK: 'function',
e: /[;{]/,
eE: !0,
i: '\\$|\\[|%',
c: [
e.UTM,
{ cN: 'params', b: '\\(', e: '\\)', c: ['self', t, e.CBCM, a, n] }
]
},
{
cN: 'class',
bK: 'class interface',
e: '{',
eE: !0,
i: /[:\(\$"]/,
c: [{ bK: 'extends implements' }, e.UTM]
},
{ bK: 'namespace', e: ';', i: /[\.']/, c: [e.UTM] },
{ bK: 'use', e: ';', c: [e.UTM] },
{ b: '=>' },
a,
n
]
};
}), e.registerLanguage('python', function(e) {
var t = {
keyword: 'and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False',
built_in: 'Ellipsis NotImplemented'
},
r = { cN: 'meta', b: /^(>>>|\.\.\.) / },
a = { cN: 'subst', b: /\{/, e: /\}/, k: t, i: /#/ },
n = {
cN: 'string',
c: [e.BE],
v: [
{ b: /(u|b)?r?'''/, e: /'''/, c: [r], r: 10 },
{ b: /(u|b)?r?"""/, e: /"""/, c: [r], r: 10 },
{ b: /(fr|rf|f)'''/, e: /'''/, c: [r, a] },
{ b: /(fr|rf|f)"""/, e: /"""/, c: [r, a] },
{ b: /(u|r|ur)'/, e: /'/, r: 10 },
{ b: /(u|r|ur)"/, e: /"/, r: 10 },
{ b: /(b|br)'/, e: /'/ },
{ b: /(b|br)"/, e: /"/ },
{ b: /(fr|rf|f)'/, e: /'/, c: [a] },
{ b: /(fr|rf|f)"/, e: /"/, c: [a] },
e.ASM,
e.QSM
]
},
i = {
cN: 'number',
r: 0,
v: [
{ b: e.BNR + '[lLjJ]?' },
{ b: '\\b(0o[0-7]+)[lLjJ]?' },
{ b: e.CNR + '[lLjJ]?' }
]
},
s = { cN: 'params', b: /\(/, e: /\)/, c: ['self', r, i, n] };
return (a.c = [
n,
i,
r
]), { aliases: ['py', 'gyp'], k: t, i: /(<\/|->|\?)|=>/, c: [r, i, n, e.HCM, { v: [{ cN: 'function', bK: 'def' }, { cN: 'class', bK: 'class' }], e: /:/, i: /[${=;\n,]/, c: [e.UTM, s, { b: /->/, eW: !0, k: 'None' }] }, { cN: 'meta', b: /^[\t ]*@/, e: /$/ }, { b: /\b(print|exec)\(/ }] };
}), e.registerLanguage('ruby', function(e) {
var t =
'[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?',
r = {
keyword: 'and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor',
literal: 'true false nil'
},
a = { cN: 'doctag', b: '@[A-Za-z]+' },
n = { b: '#<', e: '>' },
i = [
e.C('#', '$', { c: [a] }),
e.C('^\\=begin', '^\\=end', { c: [a], r: 10 }),
e.C('^__END__', '\\n$')
],
s = { cN: 'subst', b: '#\\{', e: '}', k: r },
c = {
cN: 'string',
c: [e.BE, s],
v: [
{ b: /'/, e: /'/ },
{ b: /"/, e: /"/ },
{ b: /`/, e: /`/ },
{ b: '%[qQwWx]?\\(', e: '\\)' },
{ b: '%[qQwWx]?\\[', e: '\\]' },
{ b: '%[qQwWx]?{', e: '}' },
{ b: '%[qQwWx]?<', e: '>' },
{ b: '%[qQwWx]?/', e: '/' },
{ b: '%[qQwWx]?%', e: '%' },
{ b: '%[qQwWx]?-', e: '-' },
{ b: '%[qQwWx]?\\|', e: '\\|' },
{
b: /\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/
},
{ b: /<<(-?)\w+$/, e: /^\s*\w+$/ }
]
},
o = { cN: 'params', b: '\\(', e: '\\)', endsParent: !0, k: r },
l = [
c,
n,
{
cN: 'class',
bK: 'class module',
e: '$|;',
i: /=/,
c: [
e.inherit(e.TM, { b: '[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?' }),
{ b: '<\\s*', c: [{ b: '(' + e.IR + '::)?' + e.IR }] }
].concat(i)
},
{
cN: 'function',
bK: 'def',
e: '$|;',
c: [e.inherit(e.TM, { b: t }), o].concat(i)
},
{ b: e.IR + '::' },
{ cN: 'symbol', b: e.UIR + '(\\!|\\?)?:', r: 0 },
{ cN: 'symbol', b: ':(?!\\s)', c: [c, { b: t }], r: 0 },
{
cN: 'number',
b: '(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b',
r: 0
},
{ b: '(\\$\\W)|((\\$|\\@\\@?)(\\w+))' },
{ cN: 'params', b: /\|/, e: /\|/, k: r },
{
b: '(' + e.RSR + '|unless)\\s*',
k: 'unless',
c: [
n,
{
cN: 'regexp',
c: [e.BE, s],
i: /\n/,
v: [
{ b: '/', e: '/[a-z]*' },
{ b: '%r{', e: '}[a-z]*' },
{ b: '%r\\(', e: '\\)[a-z]*' },
{ b: '%r!', e: '![a-z]*' },
{ b: '%r\\[', e: '\\][a-z]*' }
]
}
].concat(i),
r: 0
}
].concat(i);
(s.c = l), (o.c = l);
var u = '[>?]>',
d = '[\\w#]+\\(\\w+\\):\\d+:\\d+>',
b = '(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>',
p = [
{ b: /^\s*=>/, starts: { e: '$', c: l } },
{
cN: 'meta',
b: '^(' + u + '|' + d + '|' + b + ')',
starts: { e: '$', c: l }
}
];
return {
aliases: ['rb', 'gemspec', 'podspec', 'thor', 'irb'],
k: r,
i: /\/\*/,
c: i.concat(p).concat(l)
};
}), e.registerLanguage('shell', function(e) {
return {
aliases: ['console'],
c: [
{
cN: 'meta',
b: '^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]',
starts: { e: '$', sL: 'bash' }
}
]
};
}), e.registerLanguage('sql', function(e) {
var t = e.C('--', '$');
return {
cI: !0,
i: /[<>{}*#]/,
c: [
{
bK: 'begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment',
e: /;/,
eW: !0,
l: /[\w\.]+/,
k: {
keyword: 'abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek',
literal: 'true false null',
built_in: 'array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void'
},
c: [
{ cN: 'string', b: "'", e: "'", c: [e.BE, { b: "''" }] },
{ cN: 'string', b: '"', e: '"', c: [e.BE, { b: '""' }] },
{ cN: 'string', b: '`', e: '`', c: [e.BE] },
e.CNM,
e.CBCM,
t
]
},
e.CBCM,
t
]
};
}), e;
});
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' />
<title>big</title>
<link href='big.css' rel='stylesheet' type='text/css' />
<link href='highlight.css' rel='stylesheet' type='text/css' />
<style>
.hljs { line-height: 1.5em; }
.whiteBg { background-color:white; }
ul { margin:0; padding-left: 0.7em; }
li, p { padding-bottom: 0.3em; }
body.bgimgcontain div.slide-container {
background-size: contain !important;
background-repeat: no-repeat;
background-position: center center;
}
</style>
<script src='big.js'></script>
<script src='highlight.js'></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class='light'>
<div>
<h1 style="text-align:center;">OSM History Analysis Using Big&nbsp;Data Technology</h1>
<p style="text-align:center;">
<img src="http://www2.geog.uni-heidelberg.de/media/lehrstuehle/gis/HeiGIT_Logo_base_286x60.png" style="height:2em; width:auto; display:inline-block; border:solid 0.2em transparent; border-top-width:1.5em;" />
</p>
</div>
<div data-bodyclass="something">
<h2>Motivation</h2>
<p>evaluation of OSM data quality</p>
<p>by generating statistics about OSM's data over time</p>
<p>efficient data processing → tight feedback loop</p>
</div>
<div>
<h2>Data Quality</h2>
<p>Aspects like <i>completeness</i>, <i>accuracy</i>, <i>consistency</i>, …</p>
<p>Depends on use case → <i>fitness for purpose</i></p>
</div>
<div>
<p>Intrinsic Data Quality Measures</p>
</div>
<!--
<div>
<p>?? Other Use Cases</p>
<notes>
??
?general geo data statistics?
</notes>
</div>
-->
<div>
<h2>Requirements</h2>
<ul>
<li>flexible system</li>
<li>works at global scale</li>
<li>provides full raw OSM data</li>
</ul>
</div>
<div>
<h2>existing methods</h2>
<ul>
<li>using archived planet dumps</li>
<li>osm-history-renderer importer</li>
<li>Overpass API</li>
<li>…</li>
</ul>
</div>
<div>
<h2>oshdb</h2>
</div>
<div>
<p>System&nbsp;Design:<br>Map-Reduce</p>
</div>
<div>
<p>System&nbsp;Design:<br>Data Partitioning &amp; Format</p>
</div>
<div>
<p>System&nbsp;Design:<br>Usage</p>
</div>
<div>
<p>code examples</p>
</div>
<div>
<pre><code class="java">
oshdb = new OSHDB_Ignite();
result = OSMEntitySnapshotMapper.using(oshdb)
.timestamps(…)
.boundingBox(…)
.osmTypes(OSMType.WAY)
.filterByTagKey("highway")
.sumAggregateByTimestamp(entitySnapshot -&gt;
lengthOf(entitySnapshot.getGeometry())
);
</code></pre>
</div>
<div>
<pre><code class="java">
oshdb = new OSHDB_Ignite();
result = OSMContributionMapper.using(oshdb)
.timestamps(…)
.boundingBox(…)
.osmTypes(OSMType.WAY)
.filterByTagKey("highway")
.sumAggregateByTimestamp(contrib -&gt;
contrib.getContributionTypes().contains(<b>DELETION</b>)
? lengthOf(contrib.getGeometryBefore()) : 0.0
);
</code></pre>
</div>
<!--
<div>
<p></p>
<notes>
</notes>
</div>
-->
<div>
<h2>Analyzing of history OSM data</h2>
<ul>
<li>OSM-API changes</li>
<li>OSM Tagging changes</li>
<li>ODbL</li>
</ul>
</div>
<div>
<p>Examples</p>
</div>
<div data-background-image="roads-total.svg" data-bodyclass="bgimgcontain">
</div>
<div data-background-image="roads-bytype1b.svg" data-bodyclass="bgimgcontain">
</div>
<div data-background-image="roads-bytype2.svg" data-bodyclass="bgimgcontain">
</div>
<div data-background-image="roads-countvslength.svg" data-bodyclass="bgimgcontain">
</div>
<div data-background-image="roads-uniqueusers.svg" data-bodyclass="bgimgcontain">
</div>
<div data-background-image="landuse.svg" data-bodyclass="bgimgcontain">
</div>
<!--Fragen/Contact-->
<div data-bodyclass="awhiteBg">
<p>
<em><span style="white-space:nowrap;">martin.raifer@uni-heidelberg.de</span></em>
</p>
<p style="padding-left: 2.5em; text-align:left;">
<img src="http://www2.geog.uni-heidelberg.de/media/lehrstuehle/gis/HeiGIT_Logo_base_286x60.png" style="height:2em; width:auto; display:inline-block; border:solid 0.2em transparent; border-top-width:1.5em;" /><br>
core funded by <img src="http://www.geog.uni-heidelberg.de/md/chemgeo/geog/gis/kts_rgb.jpg" style="height:3em; width:auto; display:inline-block; border:solid 0.2em transparent; vertical-align: middle;" />
</p>
</div>
</body>
</html>
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="223mm" height="163mm" viewBox="0 0 22300 16300" version="1.1" xmlns="http://www.w3.org/2000/svg" stroke-width="28.222" stroke-linejoin="round" xml:space="preserve">
<path fill="rgb(216,191,216)" stroke="none" d="M 3162,14582 L 3327,14576 3493,14566 3658,14555 3823,14543 3989,14532 4154,14524 4319,14514 4484,14503 4650,14482 4815,14455 4980,14440 5145,14428 5311,14409 5476,14399 5641,14387 5807,14374 5972,14358 6137,14341 6302,14324 6468,14304 6633,14288 6798,14273 6963,14258 7129,14247 7294,14229 7459,14213 7625,14201 7790,14186 7955,14159 8120,14136 8286,14112 8451,14078 8616,14045 8781,14024 8947,13994 9112,13972 9277,13944 9443,13917 9608,13887 9773,13857 9938,13836 10104,13807 10269,13770 10434,13742 10599,13715 10765,13694 10930,13673 11095,13653 11260,13632 11425,13614 11590,13590 11755,13570 11921,13553 12086,13534 12251,13515 12417,13487 12582,13461 12747,13439 12912,13419 13078,13398 13243,13376 13408,13361 13573,13343 13739,13327 13904,13312 14069,13301 14235,13286 14400,13272 14565,13258 14730,13247 14896,13231 15061,13215 15226,13203 15391,13189 15557,13174 15722,13161 15887,13150 16053,13139 16218,13130 16383,13121 16548,13112 16714,13107 16879,13098 17044,13089 17209,13078 17375,13070 17540,13062 17705,13053 17871,13045 18036,13037 18201,13030 18366,13023 18532,13016 18697,13011 18862,13001 19027,12989 19193,12977 19358,12970 19523,12960 19689,12951 19854,12944 20019,12935 20184,12929 20350,12919 20515,12910 20680,12904 20845,12895 21011,12887 21176,12878 21341,12873 21507,12867 21672,12860 21755,12858 21755,14602 3162,14602 3162,14582 Z"/>
<path fill="rgb(221,160,221)" stroke="none" d="M 3162,14535 L 3327,14516 3493,14498 3658,14468 3823,14435 3989,14390 4154,14359 4319,14317 4484,14271 4650,14214 4815,14143 4980,14109 5145,14082 5311,14044 5476,14016 5641,13986 5807,13945 5972,13900 6137,13847 6302,13798 6468,13729 6633,13671 6798,13622 6963,13583 7129,13550 7294,13507 7459,13473 7625,13435 7790,13394 7955,13305 8120,13245 8286,13186 8451,13073 8616,12952 8781,12871 8947,12803 9112,12716 9277,12636 9443,12569 9608,12469 9773,12394 9938,12327 10104,12262 10269,12203 10434,12146 10599,12075 10765,12025 10930,11968 11095,11904 11260,11841 11425,11795 11590,11738 11755,11685 11921,11639 12086,11590 12251,11541 12417,11488 12582,11434 12747,11373 12912,11305 13078,11256 13243,11193 13408,11162 13573,11110 13739,11074 13904,11027 14069,10990 14235,10958 14400,10930 14565,10911 14730,10890 14896,10859 15061,10839 15226,10826 15391,10804 15557,10776 15722,10754 15887,10736 16053,10722 16218,10715 16383,10701 16548,10684 16714,10675 16879,10670 17044,10659 17209,10653 17375,10644 17540,10633 17705,10625 17871,10620 18036,10609 18201,10601 18366,10595 18532,10587 18697,10577 18862,10560 19027,10532 19193,10505 19358,10494 19523,10485 19689,10472 19854,10467 20019,10461 20184,10454 20350,10440 20515,10432 20680,10424 20845,10412 21011,10399 21176,10391 21341,10384 21507,10379 21672,10372 21755,10368 21755,12858 21672,12860 21507,12867 21341,12873 21176,12878 21011,12887 20845,12895 20680,12904 20515,12910 20350,12919 20184,12929 20019,12935 19854,12944 19689,12951 19523,12960 19358,12970 19193,12977 19027,12989 18862,13001 18697,13011 18532,13016 18366,13023 18201,13030 18036,13037 17871,13045 17705,13053 17540,13062 17375,13070 17209,13078 17044,13089 16879,13098 16714,13107 16548,13112 16383,13121 16218,13130 16053,13139 15887,13150 15722,13161 15557,13174 15391,13189 15226,13203 15061,13215 14896,13231 14730,13247 14565,13258 14400,13272 14235,13286 14069,13301 13904,13312 13739,13327 13573,13343 13408,13361 13243,13376 13078,13398 12912,13419 12747,13439 12582,13461 12417,13487 12251,13515 12086,13534 11921,13553 11755,13570 11590,13590 11425,13614 11260,13632 11095,13653 10930,13673 10765,13694 10599,13715 10434,13742 10269,13770 10104,13807 9938,13836 9773,13857 9608,13887 9443,13917 9277,13944 9112,13972 8947,13994 8781,14024 8616,14045 8451,14078 8286,14112 8120,14136 7955,14159 7790,14186 7625,14201 7459,14213 7294,14229 7129,14247 6963,14258 6798,14273 6633,14288 6468,14304 6302,14324 6137,14341 5972,14358 5807,14374 5641,14387 5476,14399 5311,14409 5145,14428 4980,14440 4815,14455 4650,14482 4484,14503 4319,14514 4154,14524 3989,14532 3823,14543 3658,14555 3493,14566 3327,14576 3162,14582 3162,14535 Z"/>
<path fill="rgb(238,130,238)" stroke="none" d="M 3162,14492 L 3327,14465 3493,14433 3658,14387 3823,14320 3989,14256 4154,14199 4319,14136 4484,14063 4650,13969 4815,13868 4980,13816 5145,13780 5311,13719 5476,13676 5641,13630 5807,13576 5972,13485 6137,13382 6302,13318 6468,13225 6633,13143 6798,13078 6963,13027 7129,12979 7294,12919 7459,12870 7625,12818 7790,12762 7955,12652 8120,12578 8286,12497 8451,12350 8616,12211 8781,12122 8947,12044 9112,11925 9277,11825 9443,11748 9608,11598 9773,11457 9938,11375 10104,11302 10269,11239 10434,11171 10599,11090 10765,11031 10930,10968 11095,10896 11260,10823 11425,10774 11590,10707 11755,10648 11921,10597 12086,10544 12251,10488 12417,10428 12582,10367 12747,10306 12912,10231 13078,10177 13243,10112 13408,10075 13573,10017 13739,9976 13904,9926 14069,9884 14235,9847 14400,9817 14565,9789 14730,9764 14896,9727 15061,9704 15226,9705 15391,9680 15557,9649 15722,9624 15887,9603 16053,9587 16218,9566 16383,9543 16548,9517 16714,9507 16879,9495 17044,9471 17209,9500 17375,9488 17540,9474 17705,9462 17871,9456 18036,9446 18201,9435 18366,9427 18532,9416 18697,9405 18862,9389 19027,9359 19193,9326 19358,9310 19523,9297 19689,9282 19854,9274 20019,9260 20184,9252 20350,9240 20515,9230 20680,9221 20845,9209 21011,9197 21176,9191 21341,9184 21507,9179 21672,9169 21755,9165 21755,10368 21672,10372 21507,10379 21341,10384 21176,10391 21011,10399 20845,10412 20680,10424 20515,10432 20350,10440 20184,10454 20019,10461 19854,10467 19689,10472 19523,10485 19358,10494 19193,10505 19027,10532 18862,10560 18697,10577 18532,10587 18366,10595 18201,10601 18036,10609 17871,10620 17705,10625 17540,10633 17375,10644 17209,10653 17044,10659 16879,10670 16714,10675 16548,10684 16383,10701 16218,10715 16053,10722 15887,10736 15722,10754 15557,10776 15391,10804 15226,10826 15061,10839 14896,10859 14730,10890 14565,10911 14400,10930 14235,10958 14069,10990 13904,11027 13739,11074 13573,11110 13408,11162 13243,11193 13078,11256 12912,11305 12747,11373 12582,11434 12417,11488 12251,11541 12086,11590 11921,11639 11755,11685 11590,11738 11425,11795 11260,11841 11095,11904 10930,11968 10765,12025 10599,12075 10434,12146 10269,12203 10104,12262 9938,12327 9773,12394 9608,12469 9443,12569 9277,12636 9112,12716 8947,12803 8781,12871 8616,12952 8451,13073 8286,13186 8120,13245 7955,13305 7790,13394 7625,13435 7459,13473 7294,13507 7129,13550 6963,13583 6798,13622 6633,13671 6468,13729 6302,13798 6137,13847 5972,13900 5807,13945 5641,13986 5476,14016 5311,14044 5145,14082 4980,14109 4815,14143 4650,14214 4484,14271 4319,14317 4154,14359 3989,14390 3823,14435 3658,14468 3493,14498 3327,14516 3162,14535 3162,14492 Z"/>
<path fill="rgb(255,0,255)" stroke="none" d="M 3162,14425 L 3327,14388 3493,14335 3658,14272 3823,14179 3989,14075 4154,13998 4319,13920 4484,13821 4650,13690 4815,13569 4980,13508 5145,13461 5311,13388 5476,13340 5641,13286 5807,13218 5972,13108 6137,12982 6302,12904 6468,12800 6633,12703 6798,12629 6963,12571 7129,12516 7294,12451 7459,12400 7625,12342 7790,12279 7955,12151 8120,12076 8286,11981 8451,11824 8616,11676 8781,11576 8947,11490 9112,11363 9277,11263 9443,11179 9608,11017 9773,10867 9938,10784 10104,10708 10269,10641 10434,10570 10599,10483 10765,10423 10930,10359 11095,10286 11260,10211 11425,10159 11590,10089 11755,10024 11921,9969 12086,9908 12251,9856 12417,9787 12582,9720 12747,9654 12912,9580 13078,9523 13243,9457 13408,9420 13573,9360 13739,9321 13904,9269 14069,9225 14235,9187 14400,9155 14565,9128 14730,9098 14896,9062 15061,9037 15226,9014 15391,8989 15557,8956 15722,8926 15887,8905 16053,8887 16218,8865 16383,8839 16548,8813 16714,8800 16879,8779 17044,8754 17209,8737 17375,8723 17540,8707 17705,8693 17871,8679 18036,8668 18201,8655 18366,8645 18532,8633 18697,8619 18862,8603 19027,8573 19193,8540 19358,8522 19523,8508 19689,8491 19854,8481 20019,8467 20184,8459 20350,8445 20515,8437 20680,8428 20845,8416 21011,8403 21176,8394 21341,8387 21507,8381 21672,8369 21755,8365 21755,9165 21672,9169 21507,9179 21341,9184 21176,9191 21011,9197 20845,9209 20680,9221 20515,9230 20350,9240 20184,9252 20019,9260 19854,9274 19689,9282 19523,9297 19358,9310 19193,9326 19027,9359 18862,9389 18697,9405 18532,9416 18366,9427 18201,9435 18036,9446 17871,9456 17705,9462 17540,9474 17375,9488 17209,9500 17044,9471 16879,9495 16714,9507 16548,9517 16383,9543 16218,9566 16053,9587 15887,9603 15722,9624 15557,9649 15391,9680 15226,9705 15061,9704 14896,9727 14730,9764 14565,9789 14400,9817 14235,9847 14069,9884 13904,9926 13739,9976 13573,10017 13408,10075 13243,10112 13078,10177 12912,10231 12747,10306 12582,10367 12417,10428 12251,10488 12086,10544 11921,10597 11755,10648 11590,10707 11425,10774 11260,10823 11095,10896 10930,10968 10765,11031 10599,11090 10434,11171 10269,11239 10104,11302 9938,11375 9773,11457 9608,11598 9443,11748 9277,11825 9112,11925 8947,12044 8781,12122 8616,12211 8451,12350 8286,12497 8120,12578 7955,12652 7790,12762 7625,12818 7459,12870 7294,12919 7129,12979 6963,13027 6798,13078 6633,13143 6468,13225 6302,13318 6137,13382 5972,13485 5807,13576 5641,13630 5476,13676 5311,13719 5145,13780 4980,13816 4815,13868 4650,13969 4484,14063 4319,14136 4154,14199 3989,14256 3823,14320 3658,14387 3493,14433 3327,14465 3162,14492 3162,14425 Z"/>
<path fill="rgb(186,85,211)" stroke="none" d="M 3162,14344 L 3327,14306 3493,14238 3658,14158 3823,14049 3989,13916 4154,13818 4319,13729 4484,13611 4650,13461 4815,13318 4980,13251 5145,13201 5311,13117 5476,13060 5641,13003 5807,12934 5972,12815 6137,12678 6302,12591 6468,12480 6633,12381 6798,12307 6963,12244 7129,12191 7294,12123 7459,12072 7625,12013 7790,11950 7955,11822 8120,11742 8286,11648 8451,11488 8616,11339 8781,11239 8947,11154 9112,11023 9277,10920 9443,10836 9608,10672 9773,10523 9938,10436 10104,10357 10269,10289 10434,10218 10599,10129 10765,10067 10930,10002 11095,9928 11260,9852 11425,9801 11590,9733 11755,9667 11921,9613 12086,9552 12251,9493 12417,9425 12582,9360 12747,9292 12912,9215 13078,9154 13243,9086 13408,9047 13573,8987 13739,8947 13904,8894 14069,8849 14235,8811 14400,8783 14565,8756 14730,8727 14896,8690 15061,8661 15226,8639 15391,8613 15557,8581 15722,8553 15887,8532 16053,8515 16218,8493 16383,8469 16548,8443 16714,8430 16879,8410 17044,8384 17209,8364 17375,8351 17540,8337 17705,8322 17871,8312 18036,8301 18201,8287 18366,8278 18532,8268 18697,8255 18862,8238 19027,8208 19193,8176 19358,8159 19523,8144 19689,8128 19854,8116 20019,8102 20184,8095 20350,8081 20515,8072 20680,8062 20845,8051 21011,8038 21176,8029 21341,8022 21507,8017 21672,8005 21755,8001 21755,8365 21672,8369 21507,8381 21341,8387 21176,8394 21011,8403 20845,8416 20680,8428 20515,8437 20350,8445 20184,8459 20019,8467 19854,8481 19689,8491 19523,8508 19358,8522 19193,8540 19027,8573 18862,8603 18697,8619 18532,8633 18366,8645 18201,8655 18036,8668 17871,8679 17705,8693 17540,8707 17375,8723 17209,8737 17044,8754 16879,8779 16714,8800 16548,8813 16383,8839 16218,8865 16053,8887 15887,8905 15722,8926 15557,8956 15391,8989 15226,9014 15061,9037 14896,9062 14730,9098 14565,9128 14400,9155 14235,9187 14069,9225 13904,9269 13739,9321 13573,9360 13408,9420 13243,9457 13078,9523 12912,9580 12747,9654 12582,9720 12417,9787 12251,9856 12086,9908 11921,9969 11755,10024 11590,10089 11425,10159 11260,10211 11095,10286 10930,10359 10765,10423 10599,10483 10434,10570 10269,10641 10104,10708 9938,10784 9773,10867 9608,11017 9443,11179 9277,11263 9112,11363 8947,11490 8781,11576 8616,11676 8451,11824 8286,11981 8120,12076 7955,12151 7790,12279 7625,12342 7459,12400 7294,12451 7129,12516 6963,12571 6798,12629 6633,12703 6468,12800 6302,12904 6137,12982 5972,13108 5807,13218 5641,13286 5476,13340 5311,13388 5145,13461 4980,13508 4815,13569 4650,13690 4484,13821 4319,13920 4154,13998 3989,14075 3823,14179 3658,14272 3493,14335 3327,14388 3162,14425 3162,14344 Z"/>
<path fill="rgb(147,112,219)" stroke="none" d="M 3162,14323 L 3327,14283 3493,14209 3658,14125 3823,14013 3989,13880 4154,13777 4319,13686 4484,13559 4650,13403 4815,13259 4980,13191 5145,13141 5311,13055 5476,12996 5641,12936 5807,12863 5972,12745 6137,12606 6302,12516 6468,12404 6633,12304 6798,12229 6963,12166 7129,12112 7294,12045 7459,11993 7625,11933 7790,11870 7955,11740 8120,11658 8286,11563 8451,11403 8616,11253 8781,11153 8947,11068 9112,10937 9277,10834 9443,10748 9608,10585 9773,10433 9938,10344 10104,10264 10269,10198 10434,10127 10599,10037 10765,9976 10930,9910 11095,9837 11260,9759 11425,9708 11590,9640 11755,9574 11921,9516 12086,9455 12251,9393 12417,9325 12582,9262 12747,9194 12912,9117 13078,9056 13243,8988 13408,8949 13573,8889 13739,8848 13904,8796 14069,8753 14235,8713 14400,8682 14565,8656 14730,8627 14896,8590 15061,8560 15226,8538 15391,8513 15557,8481 15722,8453 15887,8432 16053,8415 16218,8392 16383,8368 16548,8342 16714,8329 16879,8307 17044,8282 17209,8263 17375,8249 17540,8234 17705,8219 17871,8206 18036,8194 18201,8180 18366,8170 18532,8159 18697,8145 18862,8128 19027,8097 19193,8064 19358,8047 19523,8032 19689,8015 19854,8004 20019,7989 20184,7981 20350,7966 20515,7957 20680,7946 20845,7934 21011,7920 21176,7912 21341,7904 21507,7899 21672,7887 21755,7882 21755,8001 21672,8005 21507,8017 21341,8022 21176,8029 21011,8038 20845,8051 20680,8062 20515,8072 20350,8081 20184,8095 20019,8102 19854,8116 19689,8128 19523,8144 19358,8159 19193,8176 19027,8208 18862,8238 18697,8255 18532,8268 18366,8278 18201,8287 18036,8301 17871,8312 17705,8322 17540,8337 17375,8351 17209,8364 17044,8384 16879,8410 16714,8430 16548,8443 16383,8469 16218,8493 16053,8515 15887,8532 15722,8553 15557,8581 15391,8613 15226,8639 15061,8661 14896,8690 14730,8727 14565,8756 14400,8783 14235,8811 14069,8849 13904,8894 13739,8947 13573,8987 13408,9047 13243,9086 13078,9154 12912,9215 12747,9292 12582,9360 12417,9425 12251,9493 12086,9552 11921,9613 11755,9667 11590,9733 11425,9801 11260,9852 11095,9928 10930,10002 10765,10067 10599,10129 10434,10218 10269,10289 10104,10357 9938,10436 9773,10523 9608,10672 9443,10836 9277,10920 9112,11023 8947,11154 8781,11239 8616,11339 8451,11488 8286,11648 8120,11742 7955,11822 7790,11950 7625,12013 7459,12072 7294,12123 7129,12191 6963,12244 6798,12307 6633,12381 6468,12480 6302,12591 6137,12678 5972,12815 5807,12934 5641,13003 5476,13060 5311,13117 5145,13201 4980,13251 4815,13318 4650,13461 4484,13611 4319,13729 4154,13818 3989,13916 3823,14049 3658,14158 3493,14238 3327,14306 3162,14344 3162,14323 Z"/>
<path fill="rgb(138,43,226)" stroke="none" d="M 3162,14204 L 3327,14156 3493,14082 3658,13992 3823,13876 3989,13731 4154,13626 4319,13531 4484,13402 4650,13244 4815,13099 4980,13031 5145,12977 5311,12890 5476,12830 5641,12768 5807,12692 5972,12571 6137,12432 6302,12342 6468,12230 6633,12130 6798,12055 6963,11993 7129,11940 7294,11874 7459,11821 7625,11761 7790,11698 7955,11570 8120,11483 8286,11390 8451,11231 8616,11081 8781,10982 8947,10896 9112,10766 9277,10663 9443,10578 9608,10415 9773,10264 9938,10174 10104,10094 10269,10028 10434,9957 10599,9867 10765,9806 10930,9740 11095,9666 11260,9589 11425,9537 11590,9469 11755,9403 11921,9345 12086,9284 12251,9225 12417,9157 12582,9092 12747,9025 12912,8947 13078,8886 13243,8818 13408,8779 13573,8719 13739,8679 13904,8627 14069,8583 14235,8544 14400,8513 14565,8486 14730,8457 14896,8420 15061,8390 15226,8369 15391,8343 15557,8311 15722,8283 15887,8262 16053,8245 16218,8221 16383,8197 16548,8171 16714,8158 16879,8137 17044,8112 17209,8091 17375,8077 17540,8061 17705,8047 17871,8033 18036,8020 18201,8006 18366,7996 18532,7985 18697,7971 18862,7952 19027,7921 19193,7888 19358,7870 19523,7856 19689,7838 19854,7828 20019,7813 20184,7805 20350,7790 20515,7781 20680,7770 20845,7758 21011,7745 21176,7736 21341,7729 21507,7723 21672,7711 21755,7707 21755,7882 21672,7887 21507,7899 21341,7904 21176,7912 21011,7920 20845,7934 20680,7946 20515,7957 20350,7966 20184,7981 20019,7989 19854,8004 19689,8015 19523,8032 19358,8047 19193,8064 19027,8097 18862,8128 18697,8145 18532,8159 18366,8170 18201,8180 18036,8194 17871,8206 17705,8219 17540,8234 17375,8249 17209,8263 17044,8282 16879,8307 16714,8329 16548,8342 16383,8368 16218,8392 16053,8415 15887,8432 15722,8453 15557,8481 15391,8513 15226,8538 15061,8560 14896,8590 14730,8627 14565,8656 14400,8682 14235,8713 14069,8753 13904,8796 13739,8848 13573,8889 13408,8949 13243,8988 13078,9056 12912,9117 12747,9194 12582,9262 12417,9325 12251,9393 12086,9455 11921,9516 11755,9574 11590,9640 11425,9708 11260,9759 11095,9837 10930,9910 10765,9976 10599,10037 10434,10127 10269,10198 10104,10264 9938,10344 9773,10433 9608,10585 9443,10748 9277,10834 9112,10937 8947,11068 8781,11153 8616,11253 8451,11403 8286,11563 8120,11658 7955,11740 7790,11870 7625,11933 7459,11993 7294,12045 7129,12112 6963,12166 6798,12229 6633,12304 6468,12404 6302,12516 6137,12606 5972,12745 5807,12863 5641,12936 5476,12996 5311,13055 5145,13141 4980,13191 4815,13259 4650,13403 4484,13559 4319,13686 4154,13777 3989,13880 3823,14013 3658,14125 3493,14209 3327,14283 3162,14323 3162,14204 Z"/>
<path fill="rgb(0,69,134)" stroke="none" d="M 3162,14204 L 3327,14156 3493,14082 3658,13992 3823,13876 3989,13731 4154,13626 4319,13531 4484,13402 4650,13244 4815,13098 4980,13031 5145,12976 5311,12889 5476,12829 5641,12768 5807,12691 5972,12570 6137,12431 6302,12340 6468,12228 6633,12128 6798,12053 6963,11991 7129,11938 7294,11872 7459,11819 7625,11759 7790,11696 7955,11568 8120,11481 8286,11388 8451,11229 8616,11078 8781,10980 8947,10894 9112,10763 9277,10660 9443,10575 9608,10412 9773,10259 9938,10170 10104,10089 10269,10022 10434,9951 10599,9862 10765,9800 10930,9734 11095,9659 11260,9582 11425,9530 11590,9461 11755,9395 11921,9337 12086,9276 12251,9217 12417,9147 12582,9082 12747,9014 12912,8936 13078,8875 13243,8806 13408,8767 13573,8707 13739,8666 13904,8613 14069,8569 14235,8530 14400,8499 14565,8472 14730,8443 14896,8406 15061,8376 15226,8355 15391,8329 15557,8297 15722,8269 15887,8248 16053,8231 16218,8207 16383,8184 16548,8158 16714,8145 16879,8125 17044,8099 17209,8078 17375,8064 17540,8048 17705,8034 17871,8019 18036,8007 18201,7992 18366,7983 18532,7971 18697,7957 18862,7939 19027,7907 19193,7875 19358,7857 19523,7842 19689,7823 19854,7813 20019,7799 20184,7790 20350,7776 20515,7766 20680,7756 20845,7744 21011,7730 21176,7722 21341,7714 21507,7709 21672,7697 21755,7693 21755,7707 21672,7711 21507,7723 21341,7729 21176,7736 21011,7745 20845,7758 20680,7770 20515,7781 20350,7790 20184,7805 20019,7813 19854,7828 19689,7838 19523,7856 19358,7870 19193,7888 19027,7921 18862,7952 18697,7971 18532,7985 18366,7996 18201,8006 18036,8020 17871,8033 17705,8047 17540,8061 17375,8077 17209,8091 17044,8112 16879,8137 16714,8158 16548,8171 16383,8197 16218,8221 16053,8245 15887,8262 15722,8283 15557,8311 15391,8343 15226,8369 15061,8390 14896,8420 14730,8457 14565,8486 14400,8513 14235,8544 14069,8583 13904,8627 13739,8679 13573,8719 13408,8779 13243,8818 13078,8886 12912,8947 12747,9025 12582,9092 12417,9157 12251,9225 12086,9284 11921,9345 11755,9403 11590,9469 11425,9537 11260,9589 11095,9666 10930,9740 10765,9806 10599,9867 10434,9957 10269,10028 10104,10094 9938,10174 9773,10264 9608,10415 9443,10578 9277,10663 9112,10766 8947,10896 8781,10982 8616,11081 8451,11231 8286,11390 8120,11483 7955,11570 7790,11698 7625,11761 7459,11821 7294,11874 7129,11940 6963,11993 6798,12055 6633,12130 6468,12230 6302,12342 6137,12432 5972,12571 5807,12692 5641,12768 5476,12830 5311,12890 5145,12977 4980,13031 4815,13099 4650,13244 4484,13402 4319,13531 4154,13626 3989,13731 3823,13876 3658,13992 3493,14082 3327,14156 3162,14204 Z"/>
<path fill="rgb(139,0,139)" stroke="none" d="M 3162,14204 L 3327,14156 3493,14082 3658,13992 3823,13876 3989,13731 4154,13625 4319,13527 4484,13397 4650,13238 4815,13093 4980,13025 5145,12970 5311,12882 5476,12821 5641,12758 5807,12680 5972,12553 6137,12413 6302,12322 6468,12210 6633,12108 6798,12034 6963,11971 7129,11916 7294,11850 7459,11791 7625,11731 7790,11669 7955,11535 8120,11442 8286,11341 8451,11176 8616,11020 8781,10919 8947,10831 9112,10700 9277,10595 9443,10512 9608,10343 9773,10178 9938,10078 10104,9998 10269,9934 10434,9860 10599,9764 10765,9701 10930,9632 11095,9555 11260,9476 11425,9428 11590,9361 11755,9297 11921,9242 12086,9184 12251,9125 12417,9055 12582,8994 12747,8927 12912,8853 13078,8795 13243,8728 13408,8691 13573,8633 13739,8599 13904,8551 14069,8511 14235,8475 14400,8444 14565,8420 14730,8393 14896,8357 15061,8328 15226,8306 15391,8280 15557,8252 15722,8228 15887,8208 16053,8191 16218,8169 16383,8147 16548,8123 16714,8111 16879,8091 17044,8069 17209,8050 17375,8036 17540,8021 17705,8007 17871,7993 18036,7982 18201,7967 18366,7958 18532,7947 18697,7933 18862,7915 19027,7883 19193,7852 19358,7835 19523,7820 19689,7803 19854,7794 20019,7779 20184,7771 20350,7757 20515,7747 20680,7736 20845,7725 21011,7711 21176,7703 21341,7695 21507,7690 21672,7678 21755,7674 21755,7693 21672,7697 21507,7709 21341,7714 21176,7722 21011,7730 20845,7744 20680,7756 20515,7766 20350,7776 20184,7790 20019,7799 19854,7813 19689,7823 19523,7842 19358,7857 19193,7875 19027,7907 18862,7939 18697,7957 18532,7971 18366,7983 18201,7992 18036,8007 17871,8019 17705,8034 17540,8048 17375,8064 17209,8078 17044,8099 16879,8125 16714,8145 16548,8158 16383,8184 16218,8207 16053,8231 15887,8248 15722,8269 15557,8297 15391,8329 15226,8355 15061,8376 14896,8406 14730,8443 14565,8472 14400,8499 14235,8530 14069,8569 13904,8613 13739,8666 13573,8707 13408,8767 13243,8806 13078,8875 12912,8936 12747,9014 12582,9082 12417,9147 12251,9217 12086,9276 11921,9337 11755,9395 11590,9461 11425,9530 11260,9582 11095,9659 10930,9734 10765,9800 10599,9862 10434,9951 10269,10022 10104,10089 9938,10170 9773,10259 9608,10412 9443,10575 9277,10660 9112,10763 8947,10894 8781,10980 8616,11078 8451,11229 8286,11388 8120,11481 7955,11568 7790,11696 7625,11759 7459,11819 7294,11872 7129,11938 6963,11991 6798,12053 6633,12128 6468,12228 6302,12340 6137,12431 5972,12570 5807,12691 5641,12768 5476,12829 5311,12889 5145,12976 4980,13031 4815,13098 4650,13244 4484,13402 4319,13531 4154,13626 3989,13731 3823,13876 3658,13992 3493,14082 3327,14156 3162,14204 Z"/>
<path fill="rgb(75,0,130)" stroke="none" d="M 3162,14204 L 3327,14156 3493,14082 3658,13992 3823,13876 3989,13731 4154,13625 4319,13527 4484,13397 4650,13238 4815,13093 4980,13025 5145,12970 5311,12882 5476,12821 5641,12758 5807,12680 5972,12553 6137,12413 6302,12322 6468,12210 6633,12108 6798,12033 6963,11970 7129,11915 7294,11849 7459,11791 7625,11730 7790,11668 7955,11534 8120,11441 8286,11341 8451,11175 8616,11019 8781,10918 8947,10830 9112,10698 9277,10594 9443,10511 9608,10341 9773,10176 9938,10075 10104,9996 10269,9932 10434,9857 10599,9761 10765,9698 10930,9629 11095,9552 11260,9473 11425,9425 11590,9357 11755,9294 11921,9238 12086,9180 12251,9121 12417,9051 12582,8990 12747,8922 12912,8848 13078,8789 13243,8723 13408,8686 13573,8628 13739,8593 13904,8546 14069,8505 14235,8469 14400,8438 14565,8414 14730,8387 14896,8351 15061,8322 15226,8300 15391,8274 15557,8246 15722,8222 15887,8201 16053,8185 16218,8162 16383,8140 16548,8117 16714,8104 16879,8084 17044,8063 17209,8044 17375,8030 17540,8015 17705,8001 17871,7987 18036,7975 18201,7961 18366,7951 18532,7940 18697,7927 18862,7908 19027,7876 19193,7845 19358,7828 19523,7814 19689,7796 19854,7787 20019,7773 20184,7764 20350,7750 20515,7740 20680,7729 20845,7718 21011,7704 21176,7696 21341,7688 21507,7683 21672,7671 21755,7667 21755,7674 21672,7678 21507,7690 21341,7695 21176,7703 21011,7711 20845,7725 20680,7736 20515,7747 20350,7757 20184,7771 20019,7779 19854,7794 19689,7803 19523,7820 19358,7835 19193,7852 19027,7883 18862,7915 18697,7933 18532,7947 18366,7958 18201,7967 18036,7982 17871,7993 17705,8007 17540,8021 17375,8036 17209,8050 17044,8069 16879,8091 16714,8111 16548,8123 16383,8147 16218,8169 16053,8191 15887,8208 15722,8228 15557,8252 15391,8280 15226,8306 15061,8328 14896,8357 14730,8393 14565,8420 14400,8444 14235,8475 14069,8511 13904,8551 13739,8599 13573,8633 13408,8691 13243,8728 13078,8795 12912,8853 12747,8927 12582,8994 12417,9055 12251,9125 12086,9184 11921,9242 11755,9297 11590,9361 11425,9428 11260,9476 11095,9555 10930,9632 10765,9701 10599,9764 10434,9860 10269,9934 10104,9998 9938,10078 9773,10178 9608,10343 9443,10512 9277,10595 9112,10700 8947,10831 8781,10919 8616,11020 8451,11176 8286,11341 8120,11442 7955,11535 7790,11669 7625,11731 7459,11791 7294,11850 7129,11916 6963,11971 6798,12034 6633,12108 6468,12210 6302,12322 6137,12413 5972,12553 5807,12680 5641,12758 5476,12821 5311,12882 5145,12970 4980,13025 4815,13093 4650,13238 4484,13397 4319,13527 4154,13625 3989,13731 3823,13876 3658,13992 3493,14082 3327,14156 3162,14204 Z"/>
<path fill="rgb(148,0,211)" stroke="none" d="M 3162,14203 L 3327,14155 3493,14080 3658,13990 3823,13874 3989,13729 4154,13623 4319,13525 4484,13394 4650,13235 4815,13090 4980,13021 5145,12966 5311,12878 5476,12817 5641,12754 5807,12676 5972,12548 6137,12407 6302,12316 6468,12203 6633,12101 6798,12026 6963,11962 7129,11907 7294,11840 7459,11782 7625,11721 7790,11659 7955,11524 8120,11430 8286,11329 8451,11163 8616,11006 8781,10904 8947,10816 9112,10684 9277,10580 9443,10496 9608,10327 9773,10160 9938,10059 10104,9980 10269,9915 10434,9840 10599,9744 10765,9681 10930,9611 11095,9534 11260,9455 11425,9406 11590,9339 11755,9274 11921,9219 12086,9161 12251,9101 12417,9031 12582,8970 12747,8902 12912,8827 13078,8768 13243,8702 13408,8665 13573,8606 13739,8572 13904,8523 14069,8482 14235,8446 14400,8416 14565,8392 14730,8365 14896,8329 15061,8301 15226,8278 15391,8253 15557,8225 15722,8201 15887,8180 16053,8164 16218,8141 16383,8120 16548,8096 16714,8083 16879,8063 17044,8042 17209,8022 17375,8009 17540,7994 17705,7980 17871,7967 18036,7955 18201,7941 18366,7932 18532,7921 18697,7908 18862,7890 19027,7858 19193,7827 19358,7810 19523,7796 19689,7779 19854,7769 20019,7755 20184,7746 20350,7732 20515,7723 20680,7712 20845,7700 21011,7687 21176,7678 21341,7671 21507,7665 21672,7653 21755,7649 21755,7667 21672,7671 21507,7683 21341,7688 21176,7696 21011,7704 20845,7718 20680,7729 20515,7740 20350,7750 20184,7764 20019,7773 19854,7787 19689,7796 19523,7814 19358,7828 19193,7845 19027,7876 18862,7908 18697,7927 18532,7940 18366,7951 18201,7961 18036,7975 17871,7987 17705,8001 17540,8015 17375,8030 17209,8044 17044,8063 16879,8084 16714,8104 16548,8117 16383,8140 16218,8162 16053,8185 15887,8201 15722,8222 15557,8246 15391,8274 15226,8300 15061,8322 14896,8351 14730,8387 14565,8414 14400,8438 14235,8469 14069,8505 13904,8546 13739,8593 13573,8628 13408,8686 13243,8723 13078,8789 12912,8848 12747,8922 12582,8990 12417,9051 12251,9121 12086,9180 11921,9238 11755,9294 11590,9357 11425,9425 11260,9473 11095,9552 10930,9629 10765,9698 10599,9761 10434,9857 10269,9932 10104,9996 9938,10075 9773,10176 9608,10341 9443,10511 9277,10594 9112,10698 8947,10830 8781,10918 8616,11019 8451,11175 8286,11341 8120,11441 7955,11534 7790,11668 7625,11730 7459,11791 7294,11849 7129,11915 6963,11970 6798,12033 6633,12108 6468,12210 6302,12322 6137,12413 5972,12553 5807,12680 5641,12758 5476,12821 5311,12882 5145,12970 4980,13025 4815,13093 4650,13238 4484,13397 4319,13527 4154,13625 3989,13731 3823,13876 3658,13992 3493,14082 3327,14156 3162,14204 3162,14203 Z"/>
<path fill="rgb(126,0,33)" stroke="none" d="M 3162,14203 L 3327,14154 3493,14079 3658,13989 3823,13872 3989,13727 4154,13621 4319,13522 4484,13390 4650,13231 4815,13085 4980,13015 5145,12960 5311,12870 5476,12809 5641,12746 5807,12667 5972,12538 6137,12398 6302,12305 6468,12192 6633,12090 6798,12014 6963,11951 7129,11895 7294,11828 7459,11770 7625,11708 7790,11646 7955,11510 8120,11415 8286,11314 8451,11147 8616,10990 8781,10888 8947,10799 9112,10667 9277,10562 9443,10478 9608,10308 9773,10141 9938,10039 10104,9959 10269,9894 10434,9819 10599,9723 10765,9659 10930,9590 11095,9513 11260,9433 11425,9384 11590,9317 11755,9252 11921,9196 12086,9137 12251,9076 12417,9006 12582,8945 12747,8877 12912,8803 13078,8743 13243,8676 13408,8639 13573,8580 13739,8546 13904,8497 14069,8456 14235,8419 14400,8389 14565,8365 14730,8338 14896,8302 15061,8273 15226,8251 15391,8225 15557,8197 15722,8173 15887,8152 16053,8137 16218,8114 16383,8092 16548,8068 16714,8055 16879,8035 17044,8014 17209,7995 17375,7981 17540,7966 17705,7952 17871,7938 18036,7926 18201,7912 18366,7903 18532,7892 18697,7878 18862,7860 19027,7828 19193,7796 19358,7779 19523,7765 19689,7748 19854,7738 20019,7724 20184,7715 20350,7701 20515,7691 20680,7680 20845,7668 21011,7654 21176,7646 21341,7638 21507,7633 21672,7620 21755,7616 21755,7649 21672,7653 21507,7665 21341,7671 21176,7678 21011,7687 20845,7700 20680,7712 20515,7723 20350,7732 20184,7746 20019,7755 19854,7769 19689,7779 19523,7796 19358,7810 19193,7827 19027,7858 18862,7890 18697,7908 18532,7921 18366,7932 18201,7941 18036,7955 17871,7967 17705,7980 17540,7994 17375,8009 17209,8022 17044,8042 16879,8063 16714,8083 16548,8096 16383,8120 16218,8141 16053,8164 15887,8180 15722,8201 15557,8225 15391,8253 15226,8278 15061,8301 14896,8329 14730,8365 14565,8392 14400,8416 14235,8446 14069,8482 13904,8523 13739,8572 13573,8606 13408,8665 13243,8702 13078,8768 12912,8827 12747,8902 12582,8970 12417,9031 12251,9101 12086,9161 11921,9219 11755,9274 11590,9339 11425,9406 11260,9455 11095,9534 10930,9611 10765,9681 10599,9744 10434,9840 10269,9915 10104,9980 9938,10059 9773,10160 9608,10327 9443,10496 9277,10580 9112,10684 8947,10816 8781,10904 8616,11006 8451,11163 8286,11329 8120,11430 7955,11524 7790,11659 7625,11721 7459,11782 7294,11840 7129,11907 6963,11962 6798,12026 6633,12101 6468,12203 6302,12316 6137,12407 5972,12548 5807,12676 5641,12754 5476,12817 5311,12878 5145,12966 4980,13021 4815,13090 4650,13235 4484,13394 4319,13525 4154,13623 3989,13729 3823,13874 3658,13990 3493,14080 3327,14155 3162,14203 Z"/>
<path fill="rgb(139,0,139)" stroke="none" d="M 3162,14199 L 3327,14149 3493,14073 3658,13982 3823,13865 3989,13718 4154,13611 4319,13512 4484,13380 4650,13219 4815,13072 4980,13002 5145,12946 5311,12856 5476,12795 5641,12731 5807,12651 5972,12522 6137,12381 6302,12288 6468,12173 6633,12070 6798,11994 6963,11929 7129,11873 7294,11805 7459,11747 7625,11685 7790,11623 7955,11485 8120,11390 8286,11288 8451,11121 8616,10964 8781,10861 8947,10773 9112,10640 9277,10534 9443,10451 9608,10281 9773,10113 9938,10012 10104,9931 10269,9867 10434,9791 10599,9695 10765,9631 10930,9562 11095,9484 11260,9405 11425,9356 11590,9288 11755,9224 11921,9168 12086,9109 12251,9048 12417,8978 12582,8917 12747,8848 12912,8774 13078,8714 13243,8647 13408,8610 13573,8551 13739,8516 13904,8467 14069,8426 14235,8390 14400,8359 14565,8335 14730,8308 14896,8272 15061,8243 15226,8221 15391,8195 15557,8167 15722,8143 15887,8123 16053,8107 16218,8084 16383,8062 16548,8038 16714,8025 16879,8005 17044,7983 17209,7964 17375,7950 17540,7935 17705,7921 17871,7907 18036,7895 18201,7881 18366,7871 18532,7860 18697,7847 18862,7828 19027,7796 19193,7765 19358,7747 19523,7733 19689,7716 19854,7706 20019,7692 20184,7683 20350,7669 20515,7659 20680,7647 20845,7636 21011,7622 21176,7614 21341,7606 21507,7601 21672,7588 21755,7584 21755,7616 21672,7620 21507,7633 21341,7638 21176,7646 21011,7654 20845,7668 20680,7680 20515,7691 20350,7701 20184,7715 20019,7724 19854,7738 19689,7748 19523,7765 19358,7779 19193,7796 19027,7828 18862,7860 18697,7878 18532,7892 18366,7903 18201,7912 18036,7926 17871,7938 17705,7952 17540,7966 17375,7981 17209,7995 17044,8014 16879,8035 16714,8055 16548,8068 16383,8092 16218,8114 16053,8137 15887,8152 15722,8173 15557,8197 15391,8225 15226,8251 15061,8273 14896,8302 14730,8338 14565,8365 14400,8389 14235,8419 14069,8456 13904,8497 13739,8546 13573,8580 13408,8639 13243,8676 13078,8743 12912,8803 12747,8877 12582,8945 12417,9006 12251,9076 12086,9137 11921,9196 11755,9252 11590,9317 11425,9384 11260,9433 11095,9513 10930,9590 10765,9659 10599,9723 10434,9819 10269,9894 10104,9959 9938,10039 9773,10141 9608,10308 9443,10478 9277,10562 9112,10667 8947,10799 8781,10888 8616,10990 8451,11147 8286,11314 8120,11415 7955,11510 7790,11646 7625,11708 7459,11770 7294,11828 7129,11895 6963,11951 6798,12014 6633,12090 6468,12192 6302,12305 6137,12398 5972,12538 5807,12667 5641,12746 5476,12809 5311,12870 5145,12960 4980,13015 4815,13085 4650,13231 4484,13390 4319,13522 4154,13621 3989,13727 3823,13872 3658,13989 3493,14079 3327,14154 3162,14203 3162,14199 Z"/>
<path fill="rgb(152,251,152)" stroke="none" d="M 3162,14198 L 3327,14148 3493,14071 3658,13980 3823,13862 3989,13715 4154,13607 4319,13506 4484,13373 4650,13211 4815,13062 4980,12991 5145,12934 5311,12843 5476,12781 5641,12715 5807,12634 5972,12502 6137,12359 6302,12263 6468,12145 6633,12039 6798,11959 6963,11893 7129,11835 7294,11763 7459,11702 7625,11639 7790,11575 7955,11429 8120,11328 8286,11222 8451,11047 8616,10881 8781,10773 8947,10679 9112,10542 9277,10431 9443,10342 9608,10165 9773,9989 9938,9881 10104,9796 10269,9725 10434,9646 10599,9543 10765,9474 10930,9400 11095,9316 11260,9230 11425,9172 11590,9091 11755,9018 11921,8952 12086,8885 12251,8816 12417,8737 12582,8665 12747,8585 12912,8502 13078,8434 13243,8357 13408,8312 13573,8245 13739,8199 13904,8138 14069,8088 14235,8042 14400,8002 14565,7968 14730,7931 14896,7884 15061,7846 15226,7814 15391,7780 15557,7741 15722,7706 15887,7676 16053,7651 16218,7615 16383,7582 16548,7547 16714,7527 16879,7496 17044,7462 17209,7430 17375,7410 17540,7387 17705,7365 17871,7344 18036,7324 18201,7304 18366,7286 18532,7266 18697,7242 18862,7212 19027,7168 19193,7127 19358,7100 19523,7077 19689,7052 19854,7034 20019,7013 20184,6999 20350,6976 20515,6960 20680,6942 20845,6920 21011,6898 21176,6881 21341,6868 21507,6856 21672,6836 21755,6830 21755,7584 21672,7588 21507,7601 21341,7606 21176,7614 21011,7622 20845,7636 20680,7647 20515,7659 20350,7669 20184,7683 20019,7692 19854,7706 19689,7716 19523,7733 19358,7747 19193,7765 19027,7796 18862,7828 18697,7847 18532,7860 18366,7871 18201,7881 18036,7895 17871,7907 17705,7921 17540,7935 17375,7950 17209,7964 17044,7983 16879,8005 16714,8025 16548,8038 16383,8062 16218,8084 16053,8107 15887,8123 15722,8143 15557,8167 15391,8195 15226,8221 15061,8243 14896,8272 14730,8308 14565,8335 14400,8359 14235,8390 14069,8426 13904,8467 13739,8516 13573,8551 13408,8610 13243,8647 13078,8714 12912,8774 12747,8848 12582,8917 12417,8978 12251,9048 12086,9109 11921,9168 11755,9224 11590,9288 11425,9356 11260,9405 11095,9484 10930,9562 10765,9631 10599,9695 10434,9791 10269,9867 10104,9931 9938,10012 9773,10113 9608,10281 9443,10451 9277,10534 9112,10640 8947,10773 8781,10861 8616,10964 8451,11121 8286,11288 8120,11390 7955,11485 7790,11623 7625,11685 7459,11747 7294,11805 7129,11873 6963,11929 6798,11994 6633,12070 6468,12173 6302,12288 6137,12381 5972,12522 5807,12651 5641,12731 5476,12795 5311,12856 5145,12946 4980,13002 4815,13072 4650,13219 4484,13380 4319,13512 4154,13611 3989,13718 3823,13865 3658,13982 3493,14073 3327,14149 3162,14199 3162,14198 Z"/>
<path fill="rgb(154,205,50)" stroke="none" d="M 3162,14196 L 3327,14146 3493,14069 3658,13977 3823,13859 3989,13710 4154,13590 4319,13485 4484,13342 4650,13170 4815,13010 4980,12933 5145,12872 5311,12774 5476,12706 5641,12634 5807,12547 5972,12401 6137,12237 6302,12124 6468,11982 6633,11852 6798,11730 6963,11633 7129,11554 7294,11456 7459,11382 7625,11300 7790,11215 7955,11030 8120,10897 8286,10758 8451,10538 8616,10325 8781,10175 8947,10049 9112,9873 9277,9716 9443,9584 9608,9336 9773,9111 9938,8955 10104,8815 10269,8697 10434,8566 10599,8411 10765,8298 10930,8181 11095,8049 11260,7923 11425,7836 11590,7711 11755,7594 11921,7479 12086,7374 12251,7268 12417,7139 12582,7015 12747,6883 12912,6746 13078,6643 13243,6503 13408,6418 13573,6312 13739,6236 13904,6134 14069,6052 14235,5970 14400,5896 14565,5829 14730,5755 14896,5666 15061,5588 15226,5528 15391,5472 15557,5403 15722,5331 15887,5272 16053,5224 16218,5167 16383,5103 16548,5039 16714,4985 16879,4918 17044,4851 17209,4784 17375,4729 17540,4677 17705,4628 17871,4581 18036,4540 18201,4496 18366,4450 18532,4404 18697,4356 18862,4298 19027,4212 19193,4133 19358,4078 19523,4036 19689,3986 19854,3949 20019,3911 20184,3880 20350,3820 20515,3781 20680,3736 20845,3688 21011,3632 21176,3569 21341,3516 21507,3475 21672,3417 21755,3403 21755,6830 21672,6836 21507,6856 21341,6868 21176,6881 21011,6898 20845,6920 20680,6942 20515,6960 20350,6976 20184,6999 20019,7013 19854,7034 19689,7052 19523,7077 19358,7100 19193,7127 19027,7168 18862,7212 18697,7242 18532,7266 18366,7286 18201,7304 18036,7324 17871,7344 17705,7365 17540,7387 17375,7410 17209,7430 17044,7462 16879,7496 16714,7527 16548,7547 16383,7582 16218,7615 16053,7651 15887,7676 15722,7706 15557,7741 15391,7780 15226,7814 15061,7846 14896,7884 14730,7931 14565,7968 14400,8002 14235,8042 14069,8088 13904,8138 13739,8199 13573,8245 13408,8312 13243,8357 13078,8434 12912,8502 12747,8585 12582,8665 12417,8737 12251,8816 12086,8885 11921,8952 11755,9018 11590,9091 11425,9172 11260,9230 11095,9316 10930,9400 10765,9474 10599,9543 10434,9646 10269,9725 10104,9796 9938,9881 9773,9989 9608,10165 9443,10342 9277,10431 9112,10542 8947,10679 8781,10773 8616,10881 8451,11047 8286,11222 8120,11328 7955,11429 7790,11575 7625,11639 7459,11702 7294,11763 7129,11835 6963,11893 6798,11959 6633,12039 6468,12145 6302,12263 6137,12359 5972,12502 5807,12634 5641,12715 5476,12781 5311,12843 5145,12934 4980,12991 4815,13062 4650,13211 4484,13373 4319,13506 4154,13607 3989,13715 3823,13862 3658,13980 3493,14071 3327,14148 3162,14198 3162,14196 Z"/>
<path fill="rgb(250,128,114)" stroke="none" d="M 3162,14195 L 3327,14144 3493,14067 3658,13975 3823,13855 3989,13705 4154,13584 4319,13479 4484,13333 4650,13157 4815,12996 4980,12919 5145,12858 5311,12758 5476,12689 5641,12616 5807,12527 5972,12374 6137,12208 6302,12095 6468,11950 6633,11817 6798,11696 6963,11597 7129,11518 7294,11419 7459,11344 7625,11261 7790,11176 7955,10990 8120,10856 8286,10714 8451,10492 8616,10277 8781,10126 8947,9998 9112,9822 9277,9666 9443,9533 9608,9283 9773,9057 9938,8900 10104,8760 10269,8641 10434,8508 10599,8353 10765,8239 10930,8123 11095,7989 11260,7863 11425,7775 11590,7649 11755,7530 11921,7415 12086,7309 12251,7201 12417,7070 12582,6944 12747,6811 12912,6673 13078,6569 13243,6428 13408,6343 13573,6236 13739,6160 13904,6056 14069,5973 14235,5891 14400,5816 14565,5749 14730,5674 14896,5585 15061,5505 15226,5444 15391,5387 15557,5316 15722,5243 15887,5183 16053,5134 16218,5075 16383,5010 16548,4945 16714,4889 16879,4822 17044,4753 17209,4685 17375,4629 17540,4577 17705,4526 17871,4479 18036,4437 18201,4392 18366,4346 18532,4299 18697,4249 18862,4191 19027,4105 19193,4024 19358,3968 19523,3925 19689,3875 19854,3837 20019,3797 20184,3765 20350,3705 20515,3664 20680,3618 20845,3570 21011,3513 21176,3450 21341,3396 21507,3356 21672,3297 21755,3283 21755,3403 21672,3417 21507,3475 21341,3516 21176,3569 21011,3632 20845,3688 20680,3736 20515,3781 20350,3820 20184,3880 20019,3911 19854,3949 19689,3986 19523,4036 19358,4078 19193,4133 19027,4212 18862,4298 18697,4356 18532,4404 18366,4450 18201,4496 18036,4540 17871,4581 17705,4628 17540,4677 17375,4729 17209,4784 17044,4851 16879,4918 16714,4985 16548,5039 16383,5103 16218,5167 16053,5224 15887,5272 15722,5331 15557,5403 15391,5472 15226,5528 15061,5588 14896,5666 14730,5755 14565,5829 14400,5896 14235,5970 14069,6052 13904,6134 13739,6236 13573,6312 13408,6418 13243,6503 13078,6643 12912,6746 12747,6883 12582,7015 12417,7139 12251,7268 12086,7374 11921,7479 11755,7594 11590,7711 11425,7836 11260,7923 11095,8049 10930,8181 10765,8298 10599,8411 10434,8566 10269,8697 10104,8815 9938,8955 9773,9111 9608,9336 9443,9584 9277,9716 9112,9873 8947,10049 8781,10175 8616,10325 8451,10538 8286,10758 8120,10897 7955,11030 7790,11215 7625,11300 7459,11382 7294,11456 7129,11554 6963,11633 6798,11730 6633,11852 6468,11982 6302,12124 6137,12237 5972,12401 5807,12547 5641,12634 5476,12706 5311,12774 5145,12872 4980,12933 4815,13010 4650,13170 4484,13342 4319,13485 4154,13590 3989,13710 3823,13859 3658,13977 3493,14069 3327,14146 3162,14196 3162,14195 Z"/>
<path fill="rgb(255,182,193)" stroke="none" d="M 3162,14192 L 3327,14141 3493,14063 3658,13970 3823,13849 3989,13698 4154,13574 4319,13463 4484,13310 4650,13121 4815,12955 4980,12874 5145,12811 5311,12710 5476,12640 5641,12564 5807,12472 5972,12294 6137,12122 6302,12008 6468,11863 6633,11732 6798,11609 6963,11510 7129,11430 7294,11329 7459,11255 7625,11170 7790,11083 7955,10896 8120,10759 8286,10618 8451,10392 8616,10173 8781,10021 8947,9893 9112,9716 9277,9557 9443,9423 9608,9173 9773,8943 9938,8786 10104,8642 10269,8527 10434,8394 10599,8240 10765,8126 10930,8009 11095,7876 11260,7764 11425,7683 11590,7555 11755,7435 11921,7319 12086,7214 12251,7106 12417,6975 12582,6848 12747,6713 12912,6574 13078,6470 13243,6328 13408,6242 13573,6134 13739,6056 13904,5951 14069,5867 14235,5784 14400,5708 14565,5639 14730,5562 14896,5471 15061,5391 15226,5328 15391,5269 15557,5196 15722,5121 15887,5059 16053,5006 16218,4944 16383,4876 16548,4802 16714,4745 16879,4676 17044,4608 17209,4539 17375,4483 17540,4431 17705,4379 17871,4331 18036,4287 18201,4241 18366,4193 18532,4144 18697,4093 18862,4033 19027,3945 19193,3863 19358,3804 19523,3759 19689,3707 19854,3667 20019,3625 20184,3591 20350,3529 20515,3487 20680,3439 20845,3389 21011,3330 21176,3263 21341,3208 21507,3166 21672,3106 21755,3092 21755,3283 21672,3297 21507,3356 21341,3396 21176,3450 21011,3513 20845,3570 20680,3618 20515,3664 20350,3705 20184,3765 20019,3797 19854,3837 19689,3875 19523,3925 19358,3968 19193,4024 19027,4105 18862,4191 18697,4249 18532,4299 18366,4346 18201,4392 18036,4437 17871,4479 17705,4526 17540,4577 17375,4629 17209,4685 17044,4753 16879,4822 16714,4889 16548,4945 16383,5010 16218,5075 16053,5134 15887,5183 15722,5243 15557,5316 15391,5387 15226,5444 15061,5505 14896,5585 14730,5674 14565,5749 14400,5816 14235,5891 14069,5973 13904,6056 13739,6160 13573,6236 13408,6343 13243,6428 13078,6569 12912,6673 12747,6811 12582,6944 12417,7070 12251,7201 12086,7309 11921,7415 11755,7530 11590,7649 11425,7775 11260,7863 11095,7989 10930,8123 10765,8239 10599,8353 10434,8508 10269,8641 10104,8760 9938,8900 9773,9057 9608,9283 9443,9533 9277,9666 9112,9822 8947,9998 8781,10126 8616,10277 8451,10492 8286,10714 8120,10856 7955,10990 7790,11176 7625,11261 7459,11344 7294,11419 7129,11518 6963,11597 6798,11696 6633,11817 6468,11950 6302,12095 6137,12208 5972,12374 5807,12527 5641,12616 5476,12689 5311,12758 5145,12858 4980,12919 4815,12996 4650,13157 4484,13333 4319,13479 4154,13584 3989,13705 3823,13855 3658,13975 3493,14067 3327,14144 3162,14195 3162,14192 Z"/>
<path fill="rgb(139,0,0)" stroke="none" d="M 3162,14192 L 3327,14141 3493,14063 3658,13970 3823,13849 3989,13698 4154,13574 4319,13463 4484,13306 4650,13116 4815,12949 4980,12866 5145,12800 5311,12696 5476,12625 5641,12547 5807,12453 5972,12266 6137,12086 6302,11958 6468,11794 6633,11648 6798,11510 6963,11398 7129,11307 7294,11189 7459,11107 7625,11016 7790,10922 7955,10718 8120,10569 8286,10412 8451,10165 8616,9927 8781,9759 8947,9622 9112,9440 9277,9270 9443,9129 9608,8869 9773,8623 9938,8447 10104,8288 10269,8152 10434,7998 10599,7823 10765,7691 10930,7559 11095,7412 11260,7265 11425,7166 11590,7024 11755,6886 11921,6754 12086,6630 12251,6503 12417,6351 12582,6206 12747,6052 12912,5899 13078,5785 13243,5632 13408,5535 13573,5413 13739,5323 13904,5206 14069,5109 14235,5007 14400,4916 14565,4832 14730,4741 14896,4639 15061,4548 15226,4475 15391,4408 15557,4322 15722,4236 15887,4160 16053,4095 16218,4018 16383,3934 16548,3850 16714,3779 16879,3695 17044,3617 17209,3531 17375,3462 17540,3395 17705,3330 17871,3271 18036,3216 18201,3156 18366,3092 18532,3027 18697,2961 18862,2885 19027,2785 19193,2688 19358,2617 19523,2558 19689,2494 19854,2441 20019,2389 20184,2346 20350,2270 20515,2219 20680,2162 20845,2100 21011,2024 21176,1946 21341,1879 21507,1824 21672,1750 21755,1733 21755,3092 21672,3106 21507,3166 21341,3208 21176,3263 21011,3330 20845,3389 20680,3439 20515,3487 20350,3529 20184,3591 20019,3625 19854,3667 19689,3707 19523,3759 19358,3804 19193,3863 19027,3945 18862,4033 18697,4093 18532,4144 18366,4193 18201,4241 18036,4287 17871,4331 17705,4379 17540,4431 17375,4483 17209,4539 17044,4608 16879,4676 16714,4745 16548,4802 16383,4876 16218,4944 16053,5006 15887,5059 15722,5121 15557,5196 15391,5269 15226,5328 15061,5391 14896,5471 14730,5562 14565,5639 14400,5708 14235,5784 14069,5867 13904,5951 13739,6056 13573,6134 13408,6242 13243,6328 13078,6470 12912,6574 12747,6713 12582,6848 12417,6975 12251,7106 12086,7214 11921,7319 11755,7435 11590,7555 11425,7683 11260,7764 11095,7876 10930,8009 10765,8126 10599,8240 10434,8394 10269,8527 10104,8642 9938,8786 9773,8943 9608,9173 9443,9423 9277,9557 9112,9716 8947,9893 8781,10021 8616,10173 8451,10392 8286,10618 8120,10759 7955,10896 7790,11083 7625,11170 7459,11255 7294,11329 7129,11430 6963,11510 6798,11609 6633,11732 6468,11863 6302,12008 6137,12122 5972,12294 5807,12472 5641,12564 5476,12640 5311,12710 5145,12811 4980,12874 4815,12955 4650,13121 4484,13310 4319,13463 4154,13574 3989,13698 3823,13849 3658,13970 3493,14063 3327,14141 3162,14192 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="2791" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2008</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4774" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2009</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="6758" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2010</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="8741" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2011</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="10724" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2012</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="12708" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2013</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="14691" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2014</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="16674" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2015</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="18657" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2016</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="20641" y="15143"><tspan fill="rgb(0,0,0)" stroke="none">2017</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="1507" y="15895"><tspan fill="rgb(0,0,0)" stroke="none">-100,000</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="1613" y="13550"><tspan fill="rgb(0,0,0)" stroke="none">100,000</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="1613" y="11206"><tspan fill="rgb(0,0,0)" stroke="none">300,000</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="1613" y="8862"><tspan fill="rgb(0,0,0)" stroke="none">500,000</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="1613" y="6517"><tspan fill="rgb(0,0,0)" stroke="none">700,000</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="1613" y="4173"><tspan fill="rgb(0,0,0)" stroke="none">900,000</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="1322" y="1829"><tspan fill="rgb(0,0,0)" stroke="none">1,100,000</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="459px" font-weight="400"><tspan class="TextPosition" x="9780" y="995"><tspan fill="rgb(0,0,0)" stroke="none">Roads in Italy</tspan></tspan></tspan></text>
<path fill="rgb(216,191,216)" stroke="none" d="M 6903,5061 L 6798,5061 6798,4850 7009,4850 7009,5061 6903,5061 Z"/>
<path fill="rgb(221,160,221)" stroke="none" d="M 4195,5061 L 4090,5061 4090,4850 4301,4850 4301,5061 4195,5061 Z"/>
<path fill="rgb(238,130,238)" stroke="none" d="M 6903,4674 L 6798,4674 6798,4463 7009,4463 7009,4674 6903,4674 Z"/>
<path fill="rgb(255,0,255)" stroke="none" d="M 4195,4674 L 4090,4674 4090,4463 4301,4463 4301,4674 4195,4674 Z"/>
<path fill="rgb(186,85,211)" stroke="none" d="M 6903,4287 L 6798,4287 6798,4076 7009,4076 7009,4287 6903,4287 Z"/>
<path fill="rgb(147,112,219)" stroke="none" d="M 4195,4287 L 4090,4287 4090,4076 4301,4076 4301,4287 4195,4287 Z"/>
<path fill="rgb(138,43,226)" stroke="none" d="M 6903,3900 L 6798,3900 6798,3689 7009,3689 7009,3900 6903,3900 Z"/>
<path fill="rgb(0,69,134)" stroke="none" d="M 4195,3900 L 4090,3900 4090,3689 4301,3689 4301,3900 4195,3900 Z"/>
<path fill="rgb(139,0,139)" stroke="none" d="M 6903,3513 L 6798,3513 6798,3302 7009,3302 7009,3513 6903,3513 Z"/>
<path fill="rgb(75,0,130)" stroke="none" d="M 4195,3513 L 4090,3513 4090,3302 4301,3302 4301,3513 4195,3513 Z"/>
<path fill="rgb(148,0,211)" stroke="none" d="M 6903,3126 L 6798,3126 6798,2915 7009,2915 7009,3126 6903,3126 Z"/>
<path fill="rgb(126,0,33)" stroke="none" d="M 4195,3126 L 4090,3126 4090,2915 4301,2915 4301,3126 4195,3126 Z"/>
<path fill="rgb(139,0,139)" stroke="none" d="M 6903,2739 L 6798,2739 6798,2528 7009,2528 7009,2739 6903,2739 Z"/>
<path fill="rgb(152,251,152)" stroke="none" d="M 4195,2739 L 4090,2739 4090,2528 4301,2528 4301,2739 4195,2739 Z"/>
<path fill="rgb(154,205,50)" stroke="none" d="M 6903,2352 L 6798,2352 6798,2141 7009,2141 7009,2352 6903,2352 Z"/>
<path fill="rgb(250,128,114)" stroke="none" d="M 4195,2352 L 4090,2352 4090,2141 4301,2141 4301,2352 4195,2352 Z"/>
<path fill="rgb(255,182,193)" stroke="none" d="M 6903,1965 L 6798,1965 6798,1754 7009,1754 7009,1965 6903,1965 Z"/>
<path fill="rgb(139,0,0)" stroke="none" d="M 4195,1965 L 4090,1965 4090,1754 4301,1754 4301,1965 4195,1965 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="1978"><tspan fill="rgb(0,0,0)" stroke="none">path</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="1978"><tspan fill="rgb(0,0,0)" stroke="none">footway</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="2365"><tspan fill="rgb(0,0,0)" stroke="none">cycleway</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="2365"><tspan fill="rgb(0,0,0)" stroke="none">track</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="2752"><tspan fill="rgb(0,0,0)" stroke="none">service</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="2752"><tspan fill="rgb(0,0,0)" stroke="none">motorway_link</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="3139"><tspan fill="rgb(0,0,0)" stroke="none">trunk_link</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="3139"><tspan fill="rgb(0,0,0)" stroke="none">primary_link</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="3526"><tspan fill="rgb(0,0,0)" stroke="none">secondary_link</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="3526"><tspan fill="rgb(0,0,0)" stroke="none">road</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="3913"><tspan fill="rgb(0,0,0)" stroke="none">living_street</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="3913"><tspan fill="rgb(0,0,0)" stroke="none">motorway</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="4300"><tspan fill="rgb(0,0,0)" stroke="none">trunk</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="4300"><tspan fill="rgb(0,0,0)" stroke="none">primary</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="4687"><tspan fill="rgb(0,0,0)" stroke="none">secondary</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="4687"><tspan fill="rgb(0,0,0)" stroke="none">tertiary</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="4401" y="5074"><tspan fill="rgb(0,0,0)" stroke="none">unclassified</tspan></tspan></tspan></text>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="7109" y="5074"><tspan fill="rgb(0,0,0)" stroke="none">residential</tspan></tspan></tspan></text>
<text class="TextShape" transform="translate(812,9576) rotate(-90) translate(-812,-9576)"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="812" y="9576"><tspan fill="rgb(0,0,0)" stroke="none">Length / km</tspan></tspan></tspan></text>
</svg>
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment