UNPKG

material-dashboard

Version:
1,076 lines (1,065 loc) 260 kB
! function(t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).jsVectorMap = e() }(this, (function() { "use strict"; Element.prototype.matches || (Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function(t) { for (var e = (this.document || this.ownerDocument).querySelectorAll(t), i = e.length; --i >= 0 && e.item(i) !== this;); return i > -1 }), Object.assign || Object.defineProperty(Object, "assign", { enumerable: !1, configurable: !0, writable: !0, value: function(t) { if (null == t) throw new TypeError("Cannot convert first argument to object"); for (var e = Object(t), i = 1; i < arguments.length; i++) { var s = arguments[i]; if (null != s) { s = Object(s); for (var a = Object.keys(Object(s)), r = 0, n = a.length; r < n; r++) { var o = a[r], h = Object.getOwnPropertyDescriptor(s, o); void 0 !== h && h.enumerable && (e[o] = s[o]) } } } return e } }); var t = {}, e = 1, i = function(i, s, a, r) { void 0 === r && (r = {}), t["jvm:" + s + "::" + e++] = { selector: i, handler: a }, i.addEventListener(s, a, r) }, s = function(e, i, s) { var a = i.split(":")[1]; e.removeEventListener(a, s), delete t[i] }, a = function() { return t }, r = function() { function t(t) { return t instanceof Element ? (this.selector = t, this) : (this.selector = document.querySelector(t), this) } var e = t.prototype; return e.on = function(t, e, s) { return void 0 === s && (s = {}), i(this.selector, t, e, s), this }, e.delegate = function(t, e, i) { for (var s in e = e.split(" ")) this.on(e[s], (function(e) { var s = e.target; s.matches(t) && i.call(s, e) })) }, e.css = function(t) { for (var e in t) this.selector.style[e] = t[e]; return this }, e.text = function(t) { return t ? (this.selector.textContent = t, this) : this.selector.textContent }, e.attr = function(t, e) { return t && e ? (this.selector.setAttribute(t, e), this) : this.selector.getAttribute(t) }, e.addClass = function(t) { return this.selector.classList ? (this.selector.classList.add(t), this) : (-1 == this.selector.className.split(" ").indexOf(t) && (this.selector.className += " " + t), this) }, e.append = function(t) { return this.selector.appendChild(t), this }, e.show = function() { this.css({ display: "block" }) }, e.hide = function() { this.css({ display: "none" }) }, e.height = function() { return this.selector.offsetHeight }, e.width = function() { return this.selector.offsetWidth }, t }(), n = function(t) { return function(t) { return !!t && "object" == typeof t }(t) && ! function(t) { var e = Object.prototype.toString.call(t); return "[object RegExp]" === e || "[object Date]" === e || function(t) { return t.$$typeof === o }(t) }(t) }; var o = "function" == typeof Symbol && Symbol.for ? Symbol.for("react.element") : 60103; function h(t, e) { return !1 !== e.clone && e.isMergeableObject(t) ? d((i = t, Array.isArray(i) ? [] : {}), t, e) : t; var i } function l(t, e, i) { return t.concat(e).map((function(t) { return h(t, i) })) } function c(t) { return Object.keys(t).concat(function(t) { return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(t).filter((function(e) { return t.propertyIsEnumerable(e) })) : [] }(t)) } function u(t, e) { try { return e in t } catch (t) { return !1 } } function p(t, e, i) { var s = {}; return i.isMergeableObject(t) && c(t).forEach((function(e) { s[e] = h(t[e], i) })), c(e).forEach((function(a) { (function(t, e) { return u(t, e) && !(Object.hasOwnProperty.call(t, e) && Object.propertyIsEnumerable.call(t, e)) })(t, a) || (u(t, a) && i.isMergeableObject(e[a]) ? s[a] = function(t, e) { if (!e.customMerge) return d; var i = e.customMerge(t); return "function" == typeof i ? i : d }(a, i)(t[a], e[a], i) : s[a] = h(e[a], i)) })), s } var d = function(t, e, i) { (i = i || {}).arrayMerge = i.arrayMerge || l, i.isMergeableObject = i.isMergeableObject || n, i.cloneUnlessOtherwiseSpecified = h; var s = Array.isArray(e); return s === Array.isArray(t) ? s ? i.arrayMerge(t, e, i) : p(t, e, i) : h(e, i) }, f = { isImageUrl: function(t) { return /\.(jpg|gif|png)$/.test(t) }, createElement: function(t, e, i, s) { void 0 === s && (s = !1); var a = document.createElement(t); return i && (a[s ? "innerHTML" : "textContent"] = i), e && (a.className = e), a }, removeElement: function(t) { t.parentNode.removeChild(t) }, $: function(t) { return new r(t) }, hyphenate: function(t) { return t.replace(/[\w]([A-Z])/g, (function(t) { return t[0] + "-" + t[1] })).toLowerCase() }, isFunc: function(t) { return "function" == typeof t }, isObj: function(t) { return "object" == typeof t }, isStr: function(t) { return "string" == typeof t }, isArr: function(t) { return Array.isArray(t) }, merge: function(t, e) { return Object.assign(t, e) }, mergeDeeply: function(t, e) { return d(t, e) }, keys: function(t) { return Object.keys(t) } }; function m(t, e) { t.prototype = Object.create(e.prototype), t.prototype.constructor = t, g(t, e) } function g(t, e) { return (g = Object.setPrototypeOf || function(t, e) { return t.__proto__ = e, t })(t, e) } var v = function() { function t(t, e) { this._name = t, this.node = this.createElement(t), e && this.set(e) } var e = t.prototype; return e.createElement = function(t) { return document.createElementNS("http://www.w3.org/2000/svg", t) }, e.addClass = function(t) { this.node.setAttribute("class", t) }, e.getBBox = function() { return this.node.getBBox() }, e.set = function(t, e) { if (f.isObj(t)) for (var i in t) this.applyAttr(i, t[i]); else this.applyAttr(t, e) }, e.get = function(t) { return this.style.initial[t] }, e.applyAttr = function(t, e) { this.node.setAttribute(f.hyphenate(t), e) }, e.remove = function() { this.node.parentNode.removeChild(this.node) }, t }(), y = function(t) { function e(e, i, s) { var a; return void 0 === s && (s = {}), (a = t.call(this, e, i) || this).isHovered = !1, a.isSelected = !1, a.style = s, a.style.current = {}, a.updateStyle(), a } m(e, t); var i = e.prototype; return i.setStyle = function(t, e) { var i; f.isObj(t) ? f.merge(this.style.current, t) : f.merge(this.style.current, ((i = {})[t] = e, i)); this.updateStyle() }, i.updateStyle = function() { var t = {}; f.merge(t, this.style.initial), f.merge(t, this.style.current), this.isHovered && f.merge(t, this.style.hover), this.isSelected && (f.merge(t, this.style.selected), this.isHovered && f.merge(t, this.style.selectedHover)), this.set(t) }, e }(v), b = function(t) { function e(e, i) { return t.call(this, "text", e, i) || this } return m(e, t), e.prototype.applyAttr = function(e, i) { "text" === e ? this.node.textContent = i : t.prototype.applyAttr.call(this, e, i) }, e }(y), S = function(t) { function e(e, i) { return t.call(this, "image", e, i) || this } return m(e, t), e.prototype.applyAttr = function(e, i) { var s; "image" === e ? (f.isObj(i) ? (s = i.url, this.offset = i.offset || [0, 0]) : (s = i, this.offset = [0, 0]), this.node.setAttributeNS("http://www.w3.org/1999/xlink", "href", s), this.width = 23, this.height = 23, this.applyAttr("width", this.width), this.applyAttr("height", this.height), this.applyAttr("x", this.cx - this.width / 2 + this.offset[0]), this.applyAttr("y", this.cy - this.height / 2 + this.offset[1])) : "cx" == e ? (this.cx = i, this.width && this.applyAttr("x", i - this.width / 2 + this.offset[0])) : "cy" == e ? (this.cy = i, this.height && this.applyAttr("y", i - this.height / 2 + this.offset[1])) : t.prototype.applyAttr.apply(this, arguments) }, e }(y), w = function(t) { function e(e) { var i; return (i = t.call(this, "svg") || this)._container = e, i._defsElement = new v("defs"), i._rootElement = new v("g", { id: "jvm-regions-group" }), i.node.appendChild(i._defsElement.node), i.node.appendChild(i._rootElement.node), i._container.append(i.node), i } m(e, t); var i = e.prototype; return i.setSize = function(t, e) { this.node.setAttribute("width", t), this.node.setAttribute("height", e) }, i.applyTransformParams = function(t, e, i) { this._rootElement.node.setAttribute("transform", "scale(" + t + ") translate(" + e + ", " + i + ")") }, i.createPath = function(t, e) { var i = new y("path", t, e); return i.node.setAttribute("fill-rule", "evenodd"), this.add(i) }, i.createCircle = function(t, e, i) { var s = new y("circle", t, e); return this.add(s, i) }, i.createLine = function(t, e, i) { var s = new y("line", t, e); return this.add(s, i) }, i.createText = function(t, e, i) { var s = new b(t, e); return this.add(s, i) }, i.createImage = function(t, e, i) { var s = new S(t, e); return this.add(s, i) }, i.createGroup = function(t) { var e = new v("g"); return this.node.appendChild(e.node), t && (e.node.id = t), e.canvas = this, e }, i.add = function(t, e) { return (e = e || this._rootElement).node.appendChild(t.node), t }, e }(v); function k(t, e, i) { var s = f.$(e), a = -1 === s.attr("class").indexOf("jvm-region") ? "marker" : "region", r = "region" === a ? s.attr("data-code") : s.attr("data-index"), n = a + ":select"; return i && (n = a + ".tooltip:show"), { event: n, type: a, code: r, element: "region" === a ? t.regions[r].element : t.markers[r].element, tooltipText: "region" === a ? t.mapData.paths[r].name || "" : t.markers[r].config.name || "" } } var x = function() { function t() {} var e = t.prototype; return e.getLabelText = function(t, e) { if (e) { if (f.isFunc(e.render)) { var i = []; return this.config.marker && i.push(this.config.marker), i.push(t), e.render.apply(this, i) } return t } }, e.getLabelOffsets = function(t, e) { return f.isFunc(e.offsets) ? e.offsets(t) : f.isArr(e.offsets) ? e.offsets[t] : [0, 0] }, e.setStyle = function(t, e) { this.shape.setStyle(t, e) }, e.remove = function() { this.shape.remove(), this.label && this.label.remove() }, e.hover = function(t) { this._setStatus("isHovered", t) }, e.select = function(t) { this._setStatus("isSelected", t) }, e._setStatus = function(t, e) { this.shape[t] = e, this.shape.updateStyle(), this[t] = e, this.label && (this.label[t] = e, this.label.updateStyle()) }, t }(), M = function(t) { function e(e) { var i, s = e.map, a = e.code, r = e.path, n = e.style, o = e.label, h = e.labelStyle, l = e.labelsGroup; (i = t.call(this) || this).config = arguments[0], i.canvas = s.canvas, i.map = s, i.shape = i.canvas.createPath({ d: r, dataCode: a }, n), i.shape.addClass("jvm-region jvm-element"); var c = i.shape.getBBox(), u = i.getLabelText(a, o); if (o && u) { var p = i.getLabelOffsets(a); i.labelX = c.x + c.width / 2 + p[0], i.labelY = c.y + c.height / 2 + p[1], i.label = i.canvas.createText({ text: u, textAnchor: "middle", alignmentBaseline: "central", dataCode: a, x: i.labelX, y: i.labelY }, h, l), i.label.addClass("jvm-region jvm-element") } return i } return m(e, t), e.prototype.updateLabelPosition = function() { this.label && this.label.set({ x: this.labelX * this.map.scale + this.map.transX * this.map.scale, y: this.labelY * this.map.scale + this.map.transY * this.map.scale }) }, e }(x); var _ = function(t) { function e(e) { var i, s = e.index, a = e.map, r = e.style, n = e.x1, o = e.y1, h = e.x2, l = e.y2, c = e.group; return (i = t.call(this) || this).shape = a.canvas.createLine({ x1: n, y1: o, x2: h, y2: l, dataIndex: s }, r, c), i.shape.addClass("jvm-line"), i } return m(e, t), e }(x); function j(t, e) { return t.toLowerCase() + ":to:" + e.toLowerCase() } var E = function(t) { function e(e) { var i, s = e.index, a = e.style, r = e.label, n = e.cx, o = e.cy, h = e.map, l = e.group; return (i = t.call(this) || this)._map = h, i._isImage = !!a.initial.image, i.config = arguments[0], i.shape = h.canvas[i._isImage ? "createImage" : "createCircle"]({ dataIndex: s, cx: n, cy: o }, i._getStyle(), l), i.shape.addClass("jvm-marker jvm-element"), i._isImage && i.updateLabelPosition(), r && i._createLabel(i.config), i } m(e, t); var i = e.prototype; return i.updateLabelPosition = function() { this.label && this.label.set({ x: this._labelX * this._map.scale + this._offsets[0] + this._map.transX * this._map.scale + 5 + (this._isImage ? (this.shape.width || 0) / 2 : this.shape.node.r.baseVal.value), y: this._labelY * this._map.scale + this._map.transY * this._map.scale + this._offsets[1] }) }, i._createLabel = function(t) { var e = t.index, i = t.map, s = t.label, a = t.labelsGroup, r = t.cx, n = t.cy, o = t.marker, h = t.isRecentlyCreated, l = this.getLabelText(e, s); this._labelX = r / i.scale - i.transX, this._labelY = n / i.scale - i.transY, this._offsets = h && o.offsets ? o.offsets : this.getLabelOffsets(e, s), this.label = i.canvas.createText({ text: l, dataIndex: e, x: this._labelX, y: this._labelY, dy: "0.6ex" }, i.params.markerLabelStyle, a), this.label.addClass("jvm-marker jvm-element"), h && this.updateLabelPosition() }, i._getStyle = function() { var t = {}; return this._isImage ? t.initial = { image: this.config.style.initial.image } : t = this.config.style, t }, e }(x); var O = function() { function t(t) { void 0 === t && (t = {}), this._options = t, this._map = this._options.map, this._series = this._options.series, this._body = f.createElement("div", "jvm-legend"), this._options.cssClass && this._body.setAttribute("class", this._options.cssClass), t.vertical ? this._map.legendVertical.appendChild(this._body) : this._map.legendHorizontal.appendChild(this._body), this.render() } return t.prototype.render = function() { var t, e, i, s = this._series.scale.getTicks(), a = f.createElement("div", "jvm-legend-inner"); if (this._body.innderHTML = "", this._options.title) { var r = f.createElement("div", "jvm-legend-title", this._options.title); this._body.appendChild(r) } this._body.appendChild(a); for (var n = 0; n < s.length; n++) { switch (t = f.createElement("div", "jvm-legend-tick"), e = f.createElement("div", "jvm-legend-tick-sample"), this._series.config.attribute) { case "fill": f.isImageUrl(s[n].value) ? e.style.background = "url(" + s[n].value + ")" : e.style.background = s[n].value; break; case "stroke": e.style.background = s[n].value; break; case "image": e.style.background = "url(" + (f.isObj(s[n].value) ? s[n].value.url : s[n].value) + ") no-repeat center center", e.style.backgroundSize = "cover" } t.appendChild(e), i = s[n].label, this._options.labelRender && (i = this._options.labelRender(i)); var o = f.createElement("div", "jvm-legend-tick-text", i); t.appendChild(o), a.appendChild(t) } }, t }(), C = function() { function t(t) { this._scale = t } var e = t.prototype; return e.getValue = function(t) { return this._scale[t] }, e.getTicks = function() { var t = []; for (var e in this._scale) t.push({ label: e, value: this._scale[e] }); return t }, t }(), X = function() { function t(t, e, i) { void 0 === t && (t = {}), this._map = i, this._elements = e, this._values = t.values || {}, this.config = t, this.config.attribute = t.attribute || "fill", t.attributes && this.setAttributes(t.attributes), f.isObj(t.scale) && (this.scale = new C(t.scale)), this.config.legend && (this.legend = new O(f.merge({ map: this._map, series: this }, this.config.legend))), this.setValues(this._values) } var e = t.prototype; return e.setValues = function(t) { var e = {}; for (var i in t) t[i] && (e[i] = this.scale.getValue(t[i])); this.setAttributes(e) }, e.setAttributes = function(t) { for (var e in t) this._elements[e] && this._elements[e].element.setStyle(this.config.attribute, t[e]) }, e.clear = function() { var t, e = {}; for (t in this._values) this._elements[t] && (e[t] = this._elements[t].element.shape.style.initial[this.config.attribute]); this.setAttributes(e), this._values = {} }, t }(); var Y = { mill: function(t, e, i) { return { x: this.radius * (e - i) * this.radDeg, y: -this.radius * Math.log(Math.tan((45 + .4 * t) * this.radDeg)) / .8 } }, merc: function(t, e, i) { return { x: this.radius * (e - i) * this.radDeg, y: -this.radius * Math.log(Math.tan(Math.PI / 4 + t * Math.PI / 360)) } }, aea: function(t, e, i) { var s = i * this.radDeg, a = 29.5 * this.radDeg, r = 45.5 * this.radDeg, n = t * this.radDeg, o = e * this.radDeg, h = (Math.sin(a) + Math.sin(r)) / 2, l = Math.cos(a) * Math.cos(a) + 2 * h * Math.sin(a), c = h * (o - s), u = Math.sqrt(l - 2 * h * Math.sin(n)) / h, p = Math.sqrt(l - 2 * h * Math.sin(0)) / h; return { x: u * Math.sin(c) * this.radius, y: -(p - u * Math.cos(c)) * this.radius } }, lcc: function(t, e, i) { var s = i * this.radDeg, a = e * this.radDeg, r = 33 * this.radDeg, n = 45 * this.radDeg, o = t * this.radDeg, h = Math.log(Math.cos(r) * (1 / Math.cos(n))) / Math.log(Math.tan(Math.PI / 4 + n / 2) * (1 / Math.tan(Math.PI / 4 + r / 2))), l = Math.cos(r) * Math.pow(Math.tan(Math.PI / 4 + r / 2), h) / h, c = l * Math.pow(1 / Math.tan(Math.PI / 4 + o / 2), h), u = l * Math.pow(1 / Math.tan(Math.PI / 4 + 0), h); return { x: c * Math.sin(h * (a - s)) * this.radius, y: -(u - c * Math.cos(h * (a - s))) * this.radius } } }; Y.degRad = 180 / Math.PI, Y.radDeg = Math.PI / 180, Y.radius = 6381372; var L = function() { function t(t, e) { var i = t.scale, s = t.values; this._scale = i, this._values = s, this._fromColor = this.hexToRgb(i[0]), this._toColor = this.hexToRgb(i[1]), this._map = e, this.setMinMaxValues(s), this.visualize() } var e = t.prototype; return e.setMinMaxValues = function(t) { for (var e in this.min = Number.MAX_VALUE, this.max = 0, t)(e = parseFloat(t[e])) > this.max && (this.max = e), e < this.min && (this.min = e) }, e.visualize = function() { var t, e = {}; for (var i in this._values) t = parseFloat(this._values[i]), isNaN(t) || (e[i] = this.getValue(t)); this.setAttributes(e) }, e.setAttributes = function(t) { for (var e in t) this._map.regions[e] && this._map.regions[e].element.setStyle("fill", t[e]) }, e.getValue = function(t) { for (var e, i = "#", s = 0; s < 3; s++) i += (1 === (e = Math.round(this._fromColor[s] + (this._toColor[s] - this._fromColor[s]) * ((t - this.min) / (this.max - this.min))).toString(16)).length ? "0" : "") + e; return i }, e.hexToRgb = function(t) { var e = 0, i = 0, s = 0; return 4 == t.length ? (e = "0x" + t[1] + t[1], i = "0x" + t[2] + t[2], s = "0x" + t[3] + t[3]) : 7 == t.length && (e = "0x" + t[1] + t[2], i = "0x" + t[3] + t[4], s = "0x" + t[5] + t[6]), [parseInt(e), parseInt(i), parseInt(s)] }, t }(); var T = Object.freeze({ __proto__: null, handleContainerEvents: function() { var t, e, i = this, s = !1, a = this; this.params.draggable && (this.container.on("mousemove", (function(i) { return s && (a.transX -= (t - i.pageX) / a.scale, a.transY -= (e - i.pageY) / a.scale, a.applyTransform(), t = i.pageX, e = i.pageY), !1 })).on("mousedown", (function(i) { return s = !0, t = i.pageX, e = i.pageY, !1 })), f.$("body").on("mouseup", (function() { s = !1 }))), this.params.zoomOnScroll && this.container.on("wheel", (function(t) { var e = 0; e = (t.deltaY || -t.wheelDelta || t.detail) >> 10 || 1, e *= 75; var s = i.container.selector.getBoundingClientRect(), r = t.pageX - s.left - window.pageXOffset, n = t.pageY - s.top - window.pageYOffset, o = Math.pow(1 + a.params.zoomOnScrollSpeed / 1e3, -1.5 * e); a.tooltip && a.tooltip.hide(), a.setScale(a.scale * o, r, n) }), { passive: !0 }) }, handleElementEvents: function() { var t = this; this.container.delegate(".jvm-element", "mouseover mouseout", (function(e) { var i = k(t, this, !0), s = t.params.showTooltip; "mouseover" === e.type ? e.defaultPrevented || (i.element.hover(!0), s && (t.tooltip.text(i.tooltipText), t.tooltip.show(), t.emit(i.event, [t.tooltip, i.code]))) : (i.element.hover(!1), s && t.tooltip.hide()) })), this.container.delegate(".jvm-element", "mouseup", (function(e) { var i = k(t, this); if ("region" === i.type && t.params.regionsSelectable || "marker" === i.type && t.params.markersSelectable && !e.defaultPrevented) { var s = i.element; t.params[i.type + "sSelectableOne"] && t.clearSelected(i.type + "s"), i.element.isSelected ? s.select(!1) : s.select(!0), t.emit(i.event, [i.code, s.isSelected, t.getSelected(i.type + "s")]) } })) }, handleZoomButtons: function() { var t = this, e = this, s = f.createElement("div", "jvm-zoom-btn jvm-zoomin", "&#43;", !0), a = f.createElement("div", "jvm-zoom-btn jvm-zoomout", "&#x2212", !0); this.container.append(s).append(a), i(s, "click", (function() { t.setScale(e.scale * e.params.zoomStep, e.width / 2, e.height / 2, !1, e.params.zoomAnimate) })), i(a, "click", (function() { t.setScale(e.scale / e.params.zoomStep, e.width / 2, e.height / 2, !1, e.params.zoomAnimate) })) }, bindContainerTouchEvents: function() { var t, e, i, s, a, r, n, o = this, h = function(h) { var l, c, u, p, d = h.touches; if ("touchstart" == h.type && (n = 0), 1 == d.length) 1 == n && (u = o.transX, p = o.transY, o.transX -= (i - d[0].pageX) / o.scale, o.transY -= (s - d[0].pageY) / o.scale, o.tooltip.hide(), o.applyTransform(), u == o.transX && p == o.transY || h.preventDefault()), i = d[0].pageX, s = d[0].pageY; else if (2 == d.length) if (2 == n) c = Math.sqrt(Math.pow(d[0].pageX - d[1].pageX, 2) + Math.pow(d[0].pageY - d[1].pageY, 2)) / e, o.setScale(t * c, a, r), o.tooltip.hide(), h.preventDefault(); else { var f = o.container.selector.getBoundingClientRect(); l = { top: f.top + window.scrollY, left: f.left + window.scrollX }, a = d[0].pageX > d[1].pageX ? d[1].pageX + (d[0].pageX - d[1].pageX) / 2 : d[0].pageX + (d[1].pageX - d[0].pageX) / 2, r = d[0].pageY > d[1].pageY ? d[1].pageY + (d[0].pageY - d[1].pageY) / 2 : d[0].pageY + (d[1].pageY - d[0].pageY) / 2, a -= l.left, r -= l.top, t = o.scale, e = Math.sqrt(Math.pow(d[0].pageX - d[1].pageX, 2) + Math.pow(d[0].pageY - d[1].pageY, 2)) } n = d.length }; this.container.on("touchstart", h).on("touchmove", h) }, createRegions: function() { var t, e; for (t in this.regionLabelsGroup = this.regionLabelsGroup || this.canvas.createGroup("jvm-regions-labels-group"), this.mapData.paths) e = new M({ map: this, code: t, path: this.mapData.paths[t].path, style: f.merge({}, this.params.regionStyle), labelStyle: this.params.regionLabelStyle, labelsGroup: this.regionLabelsGroup, label: this.params.labels && this.params.labels.regions }), this.regions[t] = { config: this.mapData.paths[t], element: e } }, createLines: function(t, e, i) { var s = this; void 0 === i && (i = !1); var a, r = !1, n = !1; for (var o in this.linesGroup = this.linesGroup || this.canvas.createGroup("jvm-lines-group"), t) { var h = t[o]; for (var l in e) { var c = i ? e[l].config : e[l]; c.name === h.from && (r = this.getMarkerPosition(c)), c.name === h.to && (n = this.getMarkerPosition(c)) }!1 !== r && !1 !== n && (a = new _({ index: o, map: this, style: f.mergeDeeply({ initial: this.params.lineStyle }, { initial: h.style || {} }), x1: r.x, y1: r.y, x2: n.x, y2: n.y, group: this.linesGroup }), i && Object.keys(this.lines).forEach((function(e) { e === j(t[0].from, t[0].to) && s.lines[e].element.remove() })), this.lines[j(h.from, h.to)] = { element: a, config: h }) } }, createMarkers: function(t, e) { var i, s, a, r, n = this; for (var o in void 0 === t && (t = {}), void 0 === e && (e = !1), this.markersGroup = this.markersGroup || this.canvas.createGroup("jvm-markers-group"), this.markerLabelsGroup = this.markerLabelsGroup || this.canvas.createGroup("jvm-markers-labels-group"), t) { if (i = t[o], a = this.getMarkerPosition(i), r = i.coords.join(":"), e) { if (f.keys(this.markers).filter((function(t) { return n.markers[t]._uid === r })).length) continue; o = f.keys(this.markers).length }!1 !== a && (s = new E({ index: o, map: this, style: f.mergeDeeply(this.params.markerStyle, { initial: i.style || {} }), label: this.params.labels && this.params.labels.markers, labelsGroup: this.markerLabelsGroup, cx: a.x, cy: a.y, group: this.markersGroup, marker: i, isRecentlyCreated: e }), this.markers[o] && this.removeMarkers([o]), this.markers[o] = { _uid: r, config: i, element: s }) } }, createTooltip: function() { var t = this, e = f.createElement("div", "jvm-tooltip"); this.tooltip = f.$(document.body.appendChild(e)), this.container.on("mousemove", (function(i) { if ("block" === t.tooltip.selector.style.display) { var s = t.container.selector.querySelector("#jvm-regions-group").getBoundingClientRect(), a = e.getBoundingClientRect(), r = a.height, n = a.width, o = i.clientY <= s.top + r + 5, h = i.pageY - r - 5, l = i.pageX - n - 5; o && (h += r + 5, l -= 10), i.clientX < s.left + n + 5 && (l = i.pageX + 5 + 2, o && (l += 10)), t.tooltip.css({ top: h + "px", left: l + "px" }) } })) }, createSeries: function() { for (var t in this.series = { markers: [], regions: [] }, this.params.series) for (var e = 0; e < this.params.series[t].length; e++) this.series[t][e] = new X(this.params.series[t][e], this[t], this) }, applyTransform: function() { var t, e, i, s; this.defaultWidth * this.scale <= this.width ? (t = (this.width - this.defaultWidth * this.scale) / (2 * this.scale), i = (this.width - this.defaultWidth * this.scale) / (2 * this.scale)) : (t = 0, i = (this.width - this.defaultWidth * this.scale) / this.scale), this.defaultHeight * this.scale <= this.height ? (e = (this.height - this.defaultHeight * this.scale) / (2 * this.scale), s = (this.height - this.defaultHeight * this.scale) / (2 * this.scale)) : (e = 0, s = (this.height - this.defaultHeight * this.scale) / this.scale), this.transY > e ? this.transY = e : this.transY < s && (this.transY = s), this.transX > t ? this.transX = t : this.transX < i && (this.transX = i), this.canvas.applyTransformParams(this.scale, this.transX, this.transY), this.markers && this.repositionMarkers(), this.lines && this.repositionLines(), this.repositionLabels() }, setFocus: function(t) { var e = this; void 0 === t && (t = {}); var i, s = []; if (t.region ? s.push(t.region) : t.regions && (s = t.regions), s.length) return s.forEach((function(t) { if (e.regions[t]) { var s = e.regions[t].element.shape.getBBox(); s && (i = void 0 === i ? s : { x: Math.min(i.x, s.x), y: Math.min(i.y, s.y), width: Math.max(i.x + i.width, s.x + s.width) - Math.min(i.x, s.x), height: Math.max(i.y + i.height, s.y + s.height) - Math.min(i.y, s.y) }) } })), this.setScale(Math.min(this.width / i.width, this.height / i.height), -(i.x + i.width / 2), -(i.y + i.height / 2), !0, t.animate); if (t.coords) { var a = this.coordsToPoint(t.coords[0], t.coords[1]), r = this.transX - a.x / this.scale, n = this.transY - a.y / this.scale; return this.setScale(t.scale * this.baseScale, r, n, !0, t.animate) } }, resize: function() { var t = this.baseScale; this.width / this.height > this.defaultWidth / this.defaultHeight ? (this.baseScale = this.height / this.defaultHeight, this.baseTransX = Math.abs(this.width - this.defaultWidth * this.baseScale) / (2 * this.baseScale)) : (this.baseScale = this.width / this.defaultWidth, this.baseTransY = Math.abs(this.height - this.defaultHeight * this.baseScale) / (2 * this.baseScale)), this.scale *= this.baseScale / t, this.transX *= this.baseScale / t, this.transY *= this.baseScale / t }, setScale: function(t, e, i, s, a) { var r, n, o, h, l, c, u, p, d, f, m = this, g = 0, v = Math.abs(Math.round(60 * (t - this.scale) / Math.max(t, this.scale))); t > this.params.zoomMax * this.baseScale ? t = this.params.zoomMax * this.baseScale : t < this.params.zoomMin * this.baseScale && (t = this.params.zoomMin * this.baseScale), void 0 !== e && void 0 !== i && (r = t / this.scale, s ? (d = e + this.defaultWidth * (this.width / (this.defaultWidth * t)) / 2, f = i + this.defaultHeight * (this.height / (this.defaultHeight * t)) / 2) : (d = this.transX - (r - 1) / t * e, f = this.transY - (r - 1) / t * i)), a && v > 0 ? (o = this.scale, h = (t - o) / v, l = this.transX * this.scale, u = this.transY * this.scale, c = (d * t - l) / v, p = (f * t - u) / v, n = setInterval((function() { g += 1, m.scale = o + h * g, m.transX = (l + c * g) / m.scale, m.transY = (u + p * g) / m.scale, m.applyTransform(), g == v && (clearInterval(n), m.emit("viewport:changed", [m.scale, m.transX, m.transY])) }), 10)) : (this.transX = d, this.transY = f, this.scale = t, this.applyTransform(), this.emit("viewport:changed", [this.scale, this.transX, this.transY])) }, updateSize: function() { this.width = this.container.width(), this.height = this.container.height(), this.resize(), this.canvas.setSize(this.width, this.height), this.applyTransform() }, coordsToPoint: function(t, e) { var i, s, a, r = z.maps[this.params.map].projection, n = r.centralMeridian; return i = Y[r.type](t, e, n), !!(s = this.getInsetForPoint(i.x, i.y)) && (a = s.bbox, i.x = (i.x - a[0].x) / (a[1].x - a[0].x) * s.width * this.scale, i.y = (i.y - a[0].y) / (a[1].y - a[0].y) * s.height * this.scale, { x: i.x + this.transX * this.scale + s.left * this.scale, y: i.y + this.transY * this.scale + s.top * this.scale }) }, getInsetForPoint: function(t, e) { var i, s, a = z.maps[this.params.map].insets; for (i = 0; i < a.length; i++) if (t > (s = a[i].bbox)[0].x && t < s[1].x && e > s[0].y && e < s[1].y) return a[i] }, getMarkerPosition: function(t) { var e = t.coords; return z.maps[this.params.map].projection ? this.coordsToPoint.apply(this, e) : { x: e[0] * this.scale + this.transX * this.scale, y: e[1] * this.scale + this.transY * this.scale } }, repositionLines: function() { var t = !1, e = !1; for (var i in this.lines) { for (var s in this.markers) { var a = this.markers[s]; a.config.name === this.lines[i].config.from && (t = this.getMarkerPosition(a.config)), a.config.name === this.lines[i].config.to && (e = this.getMarkerPosition(a.config)) }!1 !== t && !1 !== e && this.lines[i].element.setStyle({ x1: t.x, y1: t.y, x2: e.x, y2: e.y }) } }, repositionMarkers: function() { var t; for (var e in this.markers) !1 !== (t = this.getMarkerPosition(this.markers[e].config)) && this.markers[e].element.setStyle({ cx: t.x, cy: t.y }) }, repositionLabels: function() { var t = this.params.labels; if (t) { if (t.regions) for (var e in this.regions) this.regions[e].element.updateLabelPosition(); if (t.markers) for (var i in this.markers) this.markers[i].element.updateLabelPosition() } }, visualizeData: function(t) { f.isObj(t) && (this.dataVisualization = new L(t, this)) } }), A = { onViewportChange: "viewport:changed", onRegionSelected: "region:select", onMarkerSelected: "marker:select", onRegionTooltipShow: "region.tooltip:show", onMarkerTooltipShow: "marker.tooltip:show", onLoaded: "map:loaded" }, z = function() { function t(e) { if (void 0 === e && (e = {}), this.params = f.mergeDeeply(t.defaults, e), !t.maps[this.params.map]) throw new Error("Attempt to use map which was not loaded: " + e.map); this.mapData = t.maps[this.params.map], this.regions = {}, this.markers = {}, this.lines = {}, this.defaultWidth = this.mapData.width, this.defaultHeight = this.mapData.height, this.height = 0, this.width = 0, this.scale = 1, this.baseScale = 1, this.transX = 0, this.transY = 0, this.baseTransX = 0, this.baseTransY = 0, this.selector = e.selector, "loading" !== window.document.readyState ? this.init(e.selector) : window.addEventListener("DOMContentLoaded", this.init.bind(this, e.selector)) } var e = t.prototype; return e.init = function(t) { var e = this.params; this.container = f.$(t).addClass("jvm-container"), this.canvas = new w(this.container, this.width, this.height), this.setBackgroundColor(e.backgroundColor), this.handleContainerEvents(), this.createRegions(), this.updateSize(), this.createLines(e.lines || {}, e.markers || {}), this.createMarkers(e.markers), this.handleElementEvents(), this.repositionLabels(), e.showTooltip && this.createTooltip(), e.zoomButtons && this.handleZoomButtons(), e.selectedRegions && this.setSelected("regions", e.selectedRegions), e.selectedMarkers && this.setSelected("markers", e.selectedMarkers), e.focusOn && this.setFocus(e.focusOn), e.visualizeData && this.visualizeData(e.visualizeData), e.bindTouchEvents && ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch) && this.bindContainerTouchEvents(), e.series && (this.container.append(this.legendHorizontal = f.createElement("div", "jvm-series-container jvm-series-h")).append(this.legendVertical = f.createElement("div", "jvm-series-container jvm-series-v")), this.createSeries()), this.emit("map:loaded", [this]) }, e.emit = function(t, e) { for (var i in A) A[i] === t && f.isFunc(this.params[i]) && this.params[i].apply(this, e) }, e.setBackgroundColor = function(t) { this.container.css({ backgroundColor: t }) }, e.getSelected = function(t) { var e, i = []; for (e in this[t]) this[t][e].element.isSelected && i.push(e); return i }, e.clearSelected = function(t) { var e = this; this.getSelected(t).forEach((function(i) { e[t][i].element.select(!1) })) }, e.setSelected = function(t, e) { var i = this; e.forEach((function(e) { i[t][e] && i[t][e].element.select(!0) })) }, e.getSelectedRegions = function() { return this.getSelected("regions") }, e.clearSelectedRegions = function() { var t = this; this.getSelected("regions").forEach((function(e) { t.regions[e].element.select(!1) })) }, e.getSelectedMarkers = function() { return this.getSelected("markers") }, e.clearSelectedMarkers = function() { var t = this; this.getSelected("markers").forEach((function(e) { t.markers[e].element.select(!1) })) }, e.addMarker = function(t) { console.warn("`addMarker` method is depreacted, please use `addMarkers` instead."), this.createMarkers([t], !0) }, e.addMarkers = function(t) { this.createMarkers(t, !0) }, e.removeMarkers = function(t) { var e = this; t || (t = Object.keys(this.markers)), t.forEach((function(t) { e.markers[t].element.remove(), delete e.markers[t] })) }, e.addLine = function(t, e, i) { void 0 === i && (i = {}), this.createLines([{ from: t, to: e, style: i }], this.markers, !0) }, e.reset = function() { for (var t in this.series) for (var e = 0; e < this.series[t].length; e++) this.series[t][e].clear(); this.legendHorizontal && (f.removeElement(this.legendHorizontal), this.legendHorizontal = null), this.legendVertical && (f.removeElement(this.legendVertical), this.legendVertical = null), this.scale = this.baseScale, this.transX = this.baseTransX, this.transY = this.baseTransY, this.applyTransform(), this.clearSelectedMarkers(), this.clearSelectedRegions(), this.removeMarkers() }, e.destroy = function(t) { var e = this; void 0 === t && (t = !0); var i = a(), r = this.tooltip.selector, n = Object.keys; f.removeElement(r), n(i).forEach((function(t) { s(i[t].selector, t, i[t].handler) })), t && n(this).forEach((function(t) { try { delete e[t] } catch (t) {} })) }, e.extend = function(e, i) { t.prototype[e] = i }, e.getUtils = function() { return f }, t }(); z.maps = {}, z.defaults = { map: "world", backgroundColor: "tranparent", draggable: !0, zoomButtons: !0, zoomOnScroll: !0, zoomOnScrollSpeed: 3, zoomMax: 12, zoomMin: 1, zoomAnimate: !0, showTooltip: !0, zoomStep: 1.5, bindTouchEvents: !0, lineStyle: { stroke: "#808080", strokeWidth: 1, strokeLinecap: "round" }, markersSelectable: !1, markersSelectableOne: !1, markerStyle: { initial: { r: 7, fill: "#374151", fillOpacity: 1, stroke: "#FFF", strokeWidth: 5, strokeOpacity: .5 }, hover: { fill: "#3cc0ff", cursor: "pointer" }, selected: { fill: "blue" }, selectedHover: {} }, markerLabelStyle: { initial: { fontFamily: "Verdana", fontSize: 12, fontWeight: 500, cursor: "default", fill: "#374151" }, hover: { cursor: "pointer" }, selected: {}, selectedHover: {} }, regionsSelectable: !1, regionsSelectableOne: !1, regionStyle: { initial: { fill: "#dee2e8", fillOpacity: 1, stroke: "none", strokeWidth: 0 }, hover: { fillOpacity: .7, cursor: "pointer" }, selected: { fill: "#9ca3af" }, selectedHover: {} }, regionLabelStyle: { initial: { fontFamily: "Verdana", fontSize: "12", fontWeight: "bold", cursor: "default", fill: "#35373e" }, hover: { cursor: "pointer" } } }, Object.assign(z.prototype, T); var P = function() { function t(t) { if (void 0 === t && (t = {}), !t.selector) throw new Error("Selector is not given."); return new z(t) } return t.prototype.addMap = function(t, e) { z.maps[t] = e }, t }(); return window.jsVectorMap = P })); jsVectorMap.prototype.addMap("world", { insets: [{ width: 900, top: 0, left: 0, height: 440.70631074413296, bbox: [{ y: -12671671.123330014, x: -20004297.151525836 }, { y: 6930392.025135122, x: 20026572.39474939 }] }], paths: { BD: { path: "M651.84,230.21l-0.6,-2.0l-1.36,-1.71l-2.31,-0.11l-0.41,0.48l0.2,0.94l-0.53,0.99l-0.72,-0.36l-0.68,0.35l-1.2,-0.36l-0.37,-2.0l-0.81,-1.86l0.39,-1.46l-0.22,-0.47l-1.14,-0.53l0.29,-0.5l1.48,-0.94l0.03,-0.65l-1.55,-1.22l0.55,-1.14l1.61,0.94l1.04,0.15l0.18,1.54l0.34,0.35l5.64,0.63l-0.84,1.64l-1.22,0.34l-0.77,1.51l0.07,0.47l1.37,1.37l0.67,-0.19l0.42,-1.39l1.21,3.84l-0.03,1.21l-0.33,-0.15l-0.4,0.28Z", name: "Bangladesh" }, BE: { path: "M429.29,144.05l1.91,0.24l2.1,-0.63l2.63,1.99l-0.21,1.66l-0.69,0.4l-0.18,1.2l-1.66,-1.13l-1.39,0.15l-2.73,-2.7l-1.17,-0.18l-0.16,-0.52l1.54,-0.5Z", name: "Belgium" }, BF: { path: "M421.42,247.64l-0.11,0.95l0.34,1.16l1.4,1.71l0.07,1.1l0.32,0.37l2.55,0.51l-0.04,1.28l-0.38,0.53l-1.07,0.21l-0.72,1.18l-0.63,0.21l-3.22,-0.25l-0.94,0.39l-5.4,-0.05l-0.39,0.38l0.16,2.73l-1.23,-0.43l-1.17,0.1l-0.89,0.57l-2.27,-1.72l-0.13,-1.11l0.61,-0.96l0.02,-0.93l1.87,-1.98l0.44,-1.81l0.43,-0.39l1.28,0.26l1.05,-0.52l0.47,-0.73l1.84,-1.09l0.55,-0.83l2.2,-1.0l1.15,-0.3l0.72,0.45l1.13,-0.01Z", name: "Burkina Faso" }, BG: { path: "M491.65,168.18l-0.86,0.88l-0.91,2.17l0.48,1.34l-1.6,-0.24l-2.55,0.95l-0.28,1.51l-1.8,0.22l-2.0,-1.0l-1.92,0.79l-1.42,-0.07l-0.15,-1.63l-1.05,-0.97l0.0,-0.8l1.2,-1.57l0.01,-0.56l-1.14,-1.23l-0.05,-0.94l0.88,0.97l0.88,-0.2l1.91,0.47l3.68,0.16l1.42,-0.81l2.72,-0.66l2.55,1.24Z", name: "Bulgaria" }, BA: { path: "M463.49,163.65l2.1,0.5l1.72,-0.03l1.52,0.68l-0.36,0.78l0.08,0.45l1.04,1.02l-0.25,0.98l-1.81,1.15l-0.38,1.38l-1.67,-0.87l-0.89,-1.2l-2.11,-1.83l-1.63,-2.22l0.23,-0.57l0.48,0.38l0.55,-0.06l0.43,-0.51l0.94,-0.06Z", name: "Bosnia and Herz." }, BN: { path: "M707.48,273.58l0.68,-0.65l1.41,-0.91l-0.15,1.63l-0.81,-0.05l-0.61,0.58l-0.53,-0.6Z", name: "Brunei" }, BO: { path: "M263.83,340.69l-3.09,-0.23l-0.38,0.23l-0.7,1.52l-1.31,-1.53l-3.28,-0.64l-2.37,2.4l-1.31,0.26l-0.88,-3.26l-1.3,-2.86l0.74,-2.37l-0.13,-0.43l-1.2,-1.01l-0.37,-1.89l-1.08,-1.55l1.45,-2.56l-0.96,-2.33l0.47,-1.06l-0.34,-0.73l0.91,-1.32l0.16,-3.84l0.5,-1.18l-1.81,-3.41l2.46,0.07l0.8,-0.85l3.4,-1.91l2.66,-0.35l-0.19,1.38l0.3,1.07l-0.05,1.97l2.72,2.27l2.88,0.49l0.89,0.86l1.79,0.58l0.98,0.7l1.71,0.05l1.17,0.61l0.6,2.7l-0.7,0.54l0.96,2.99l0.37,0.28l4.3,0.1l-0.25,1.2l0.27,1.02l1.43,0.9l0.5,1.35l-0.41,1.86l-0.65,1.08l0.12,1.35l-2.69,-1.65l-2.4,-0.03l-4.36,0.76l-1.49,2.5l-0.11,1.52l-0.75,2.37Z", name: "Bolivia" }, JP: { path: "M781.12,166.87l1.81,0.68l1.62,-0.97l0.39,2.42l-3.35,0.75l-2.23,2.88l-3.63,-1.9l-0.56,0.2l-1.26,3.05l-2.16,0.03l-0.29,-2.51l1.08,-2.03l2.45,-0.16l0.37,-0.33l1.25,-5.94l2.47,2.71l2.03,1.12ZM773.56,187.34l-0.91,2.22l0.37,1.52l-1.14,1.75l-3.02,1.26l-4.58,0.27l-3.34,3.01l-1.25,-0.8l-0.09,-1.9l-0.46,-0.38l-4.35,0.62l-3.0,1.32l-2.85,0.05l-0.37,0.27l0.13,0.44l2.32,1.89l-1.54,4.34l-1.26,0.9l-0.79,-0.7l0.56,-2.27l-0.21,-0.45l-1.47,-0.75l-0.74,-1.4l2.12,-0.84l1.26,-1.7l2.45,-1.42l1.83,-1.91l4.78,-0.81l2.6,0.57l0.44,-0.21l2.39,-4.66l1.29,1.06l0.5,0.01l5.1,-4.02l1.69,-3.73l-0.38,-3.4l0.9,-1.61l2.14,-0.44l1.23,3.72l-0.07,2.18l-2.23,2.84l-0.04,3.16ZM757.78,196.26l0.19,0.56l-1.01,1.21l-1.16,-0.68l-1.28,0.65l-0.69,1.45l-1.02,-0.5l0.01,-0.93l1.14,-1.38l1.57,0.14l0.85,-0.98l1.4,0.46Z", name: "Japan" }, BI: { path: "M495.45,295.49l-1.08,-2.99l1.14,-0.11l0.64,-1.19l0.76,0.09l0.65,1.83l-2.1,2.36Z", name: "Burundi" }, BJ: { path: "M429.57,255.75l-0.05,0.8l0.5,1.34l-0.42,0.86l0.17,0.79l-1.81,2.12l-0.57,1.76l-0.08,5.42l-1.41,0.2l-0.48,-1.36l0.11,-5.71l-0.52,-0.7l-0.2,-1.35l-1.48,-1.48l0.21,-0.9l0.89,-0.43l0.42,-0.92l1.27,-0.36l1.22,-1.34l0.61,-0.0l1.62,1.24Z", name: "Benin" }, BT: { path: "M650.32,213.86l0.84,0.71l-0.12,1.1l-3.76,-0.11l-1.57,0.4l-1.93,-0.87l1.48,-1.96l1.13,-0.57l1.63,0.57l1.33,0.08l0.99,0.65Z", name: "Bhutan" }, JM: { path: "M228.38,239.28l-0.8,0.4l-2.26,-1.06l0.84,-0.23l2.14,0.3l1.17,0.56l-1.08,0.03Z", name: "Jamaica" }, BW: { path: "M483.92,330.07l2.27,4.01l2.83,2.86l0.96,0.31l0.78,2.43l2.13,0.61l1.02,0.76l-3.0,1.64l-2.32,2.02l-1.54,2.69l-1.52,0.45l-0.64,1.94l-1.34,0.52l-1.85,-0.12l-1.21,-0.74l-1.35,-0.3l-1.22,0.62l-0.75,1.37l-2.31,1.9l-1.4,0.21l-0.35,-0.59l0.16,-1.75l-1.48,-2.54l-0.62,-0.43l-0.0,-7.1l2.08,-0.08l0.39,-0.4l0.07,-8.9l5.19,-0.93l0.8,0.89l0.51,0.07l1.5,-0.95l2.21,-0.49Z", name: "Botswana" }, BR: { path: "M259.98,275.05l3.24,0.7l0.65,-0.53l4.55,-1.32l1.08,-1.06l-0.02,-0.63l0.55,-0.05l0.28,0.28l-0.26,0.87l0.22,0.48l0.73,0.32l0.4,0.81l-0.62,0.86l-0.4,2.13l0.82,2.56l1.69,1.43l1.43,0.2l3.17,-1.68l3.18,0.3l0.65,-0.75l-0.27,-0.92l1.9,-0.09l2.39,0.99l1.06,-0.61l0.84,0.78l1.2,-0.18l1.18,-1.06l0.84,-1.94l1.36,-2.11l0.37,-0.05l1.89,5.45l1.33,0.59l0.05,1.28l-1.77,1.94l0.02,0.56l1.02,0.87l4.07,0.36l0.08,2.16l0.66,0.29l1.74,-1.5l6.97,2.32l1.02,1.22l-0.35,1.18l0.49,0.5l2.81,-0.74l4.77,1.3l3.75,-0.08l3.57,2.0l3.29,2.86l1.93,0.72l2.12,0.12l0.71,0.62l1.21,4.51l-0.95,3.98l-4.72,5.06l-1.64,2.92l-1.72,2.05l-0.8,0.3l-0.72,2.03l0.18,4.75l-0.94,5.53l-0.81,1.13l-0.43,3.36l-2.55,3.5l-0.4,2.51l-1.86,1.04l-0.67,1.53l-2.54,0.01l-3.94,1.01l-1.83,1.2l-2.87,0.82l-3.03,2.19l-2.2,2.83l-0.36,2.0l0.4,1.58l-0.44,2.6l-0.51,1.2l-1.77,1.54l-2.75,4.78l-3.83,3.42l-1.24,2.74l-1.18,1.15l-0.36,-0.83l0.95,-1.14l0.01,-0.5l-1.52,-1.97l-4.56,-3.32l-1.03,-0.0l-2.38,-2.02l-0.81,-0.0l5.34,-5.45l3.77,-2.58l0.22,-2.46l-1.35,-1.81l-0.91,0.07l0.58,-2.33l0.01,-1.54l-1.11,-0.83l-1.75,0.3l-0.44,-3.11l-0.52,-0.95l-1.88,-0.88l-1.24,0.47l-2.17,-0.41l0.15,-3.21l-0.62,-1.34l0.66,-0.73l-0.22,-1.34l0.66,-1.13l0.44,-2.04l-0.61,-1.83l-1.4,-0.86l-0.2,-0.75l0.34,-1.39l-0.38,-0.5l-4.52,-0.1l-0.72,-2.22l0.59,-0.42l-0.03,-1.1l-0.5,-0.87l-0.32,-1.7l-1.45,-0.76l-1.63,-0.02l-1.05,-0.72l-1.6,-0.48l-1.13,-0.99l-2.69,-0.4l-2.47,-2.06l0.13,-4.35l-0.45,-0.45l-3.46,0.5l-3.44,1.94l-0.6,0.74l-2.9,-0.17l-1.47,0.42l-0.72,-0.18l0.15,-3.52l-0.63,-0.34l-1.94,1.41l-1.87,-0.06l-0.83,-1.18l-1.37,-0.26l0.21,-1.01l-1.35,-1.49l-0.88,-1.91l0.56,-0.6l-0.0,-0.81l1.29,-0.62l0.22,-0.43l-0.22,-1.19l0.61,-0.91l0.15,-0.99l2.65,-1.58l1.99,-0.47l0.42,-0.36l2.06,0.11l0.42,-0.33l1.19,