/*
 Highcharts JS v5.0.6 (2016-12-07)

 (c) 2009-2016 Torstein Honsi

 License: www.highcharts.com/license
*/
(function (L, a) { "object" === typeof module && module.exports ? module.exports = L.document ? a(L) : a : L.Highcharts = a(L) })("undefined" !== typeof window ? window : this, function (L) {
    L = function () {
        var a = window, D = a.document, C = a.navigator && a.navigator.userAgent || "", G = D && D.createElementNS && !!D.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect, I = /(edge|msie|trident)/i.test(C) && !window.opera, h = !G, f = /Firefox/.test(C), p = f && 4 > parseInt(C.split("Firefox/")[1], 10); return a.Highcharts ? a.Highcharts.error(16, !0) : {
            product: "Highcharts",
            version: "5.0.6", deg2rad: 2 * Math.PI / 360, doc: D, hasBidiBug: p, hasTouch: D && void 0 !== D.documentElement.ontouchstart, isMS: I, isWebKit: /AppleWebKit/.test(C), isFirefox: f, isTouchDevice: /(Mobile|Android|Windows Phone)/.test(C), SVG_NS: "http://www.w3.org/2000/svg", chartCount: 0, seriesTypes: {}, symbolSizes: {}, svg: G, vml: h, win: a, charts: [], marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"], noop: function () { }
        }
    }(); (function (a) {
        var D = [], C = a.charts, G = a.doc, I = a.win; a.error = function (h, f) {
            h = a.isNumber(h) ? "Highcharts error #" +
            h + ": www.highcharts.com/errors/" + h : h; if (f) throw Error(h); I.console && console.log(h)
        }; a.Fx = function (a, f, p) { this.options = f; this.elem = a; this.prop = p }; a.Fx.prototype = {
            dSetter: function () { var a = this.paths[0], f = this.paths[1], p = [], v = this.now, l = a.length, u; if (1 === v) p = this.toD; else if (l === f.length && 1 > v) for (; l--;) u = parseFloat(a[l]), p[l] = isNaN(u) ? a[l] : v * parseFloat(f[l] - u) + u; else p = f; this.elem.attr("d", p, null, !0) }, update: function () {
                var a = this.elem, f = this.prop, p = this.now, v = this.options.step; if (this[f + "Setter"]) this[f +
                "Setter"](); else a.attr ? a.element && a.attr(f, p, null, !0) : a.style[f] = p + this.unit; v && v.call(a, p, this)
            }, run: function (a, f, p) { var h = this, l = function (a) { return l.stopped ? !1 : h.step(a) }, u; this.startTime = +new Date; this.start = a; this.end = f; this.unit = p; this.now = this.start; this.pos = 0; l.elem = this.elem; l.prop = this.prop; l() && 1 === D.push(l) && (l.timerId = setInterval(function () { for (u = 0; u < D.length; u++) D[u]() || D.splice(u--, 1); D.length || clearInterval(l.timerId) }, 13)) }, step: function (a) {
                var f = +new Date, h, v = this.options; h = this.elem;
                var l = v.complete, u = v.duration, d = v.curAnim, c; if (h.attr && !h.element) h = !1; else if (a || f >= u + this.startTime) { this.now = this.end; this.pos = 1; this.update(); a = d[this.prop] = !0; for (c in d) !0 !== d[c] && (a = !1); a && l && l.call(h); h = !1 } else this.pos = v.easing((f - this.startTime) / u), this.now = this.start + (this.end - this.start) * this.pos, this.update(), h = !0; return h
            }, initPath: function (h, f, p) {
                function v(a) {
                    var e, b; for (q = a.length; q--;) e = "M" === a[q] || "L" === a[q], b = /[a-zA-Z]/.test(a[q + 3]), e && b && a.splice(q + 1, 0, a[q + 1], a[q + 2], a[q + 1], a[q +
                    2])
                } function l(a, e) { for (; a.length < m;) { a[0] = e[m - a.length]; var b = a.slice(0, t);[].splice.apply(a, [0, 0].concat(b)); z && (b = a.slice(a.length - t), [].splice.apply(a, [a.length, 0].concat(b)), q--) } a[0] = "M" } function u(a, e) { for (var c = (m - a.length) / t; 0 < c && c--;) b = a.slice().splice(a.length / F - t, t * F), b[0] = e[m - t - c * t], y && (b[t - 6] = b[t - 2], b[t - 5] = b[t - 1]), [].splice.apply(a, [a.length / F, 0].concat(b)), z && c-- } f = f || ""; var d, c = h.startX, n = h.endX, y = -1 < f.indexOf("C"), t = y ? 7 : 3, m, b, q; f = f.split(" "); p = p.slice(); var z = h.isArea, F = z ? 2 : 1, e;
                y && (v(f), v(p)); if (c && n) { for (q = 0; q < c.length; q++) if (c[q] === n[0]) { d = q; break } else if (c[0] === n[n.length - c.length + q]) { d = q; e = !0; break } void 0 === d && (f = []) } f.length && a.isNumber(d) && (m = p.length + d * F * t, e ? (l(f, p), u(p, f)) : (l(p, f), u(f, p))); return [f, p]
            }
        }; a.extend = function (a, f) { var h; a || (a = {}); for (h in f) a[h] = f[h]; return a }; a.merge = function () {
            var h, f = arguments, p, v = {}, l = function (h, d) {
                var c, n; "object" !== typeof h && (h = {}); for (n in d) d.hasOwnProperty(n) && (c = d[n], a.isObject(c, !0) && "renderTo" !== n && "number" !== typeof c.nodeType ?
                h[n] = l(h[n] || {}, c) : h[n] = d[n]); return h
            }; !0 === f[0] && (v = f[1], f = Array.prototype.slice.call(f, 2)); p = f.length; for (h = 0; h < p; h++) v = l(v, f[h]); return v
        }; a.pInt = function (a, f) { return parseInt(a, f || 10) }; a.isString = function (a) { return "string" === typeof a }; a.isArray = function (a) { a = Object.prototype.toString.call(a); return "[object Array]" === a || "[object Array Iterator]" === a }; a.isObject = function (h, f) { return h && "object" === typeof h && (!f || !a.isArray(h)) }; a.isNumber = function (a) { return "number" === typeof a && !isNaN(a) }; a.erase =
        function (a, f) { for (var h = a.length; h--;) if (a[h] === f) { a.splice(h, 1); break } }; a.defined = function (a) { return void 0 !== a && null !== a }; a.attr = function (h, f, p) { var v, l; if (a.isString(f)) a.defined(p) ? h.setAttribute(f, p) : h && h.getAttribute && (l = h.getAttribute(f)); else if (a.defined(f) && a.isObject(f)) for (v in f) h.setAttribute(v, f[v]); return l }; a.splat = function (h) { return a.isArray(h) ? h : [h] }; a.syncTimeout = function (a, f, p) { if (f) return setTimeout(a, f, p); a.call(0, p) }; a.pick = function () {
            var a = arguments, f, p, v = a.length; for (f =
            0; f < v; f++) if (p = a[f], void 0 !== p && null !== p) return p
        }; a.css = function (h, f) { a.isMS && !a.svg && f && void 0 !== f.opacity && (f.filter = "alpha(opacity\x3d" + 100 * f.opacity + ")"); a.extend(h.style, f) }; a.createElement = function (h, f, p, v, l) { h = G.createElement(h); var u = a.css; f && a.extend(h, f); l && u(h, { padding: 0, border: "none", margin: 0 }); p && u(h, p); v && v.appendChild(h); return h }; a.extendClass = function (h, f) { var p = function () { }; p.prototype = new h; a.extend(p.prototype, f); return p }; a.pad = function (a, f, p) {
            return Array((f || 2) + 1 - String(a).length).join(p ||
            0) + a
        }; a.relativeLength = function (a, f) { return /%$/.test(a) ? f * parseFloat(a) / 100 : parseFloat(a) }; a.wrap = function (a, f, p) { var h = a[f]; a[f] = function () { var a = Array.prototype.slice.call(arguments), f = arguments, d = this; d.proceed = function () { h.apply(d, arguments.length ? arguments : f) }; a.unshift(h); a = p.apply(this, a); d.proceed = null; return a } }; a.getTZOffset = function (h) { var f = a.Date; return 6E4 * (f.hcGetTimezoneOffset && f.hcGetTimezoneOffset(h) || f.hcTimezoneOffset || 0) }; a.dateFormat = function (h, f, p) {
            if (!a.defined(f) || isNaN(f)) return a.defaultOptions.lang.invalidDate ||
            ""; h = a.pick(h, "%Y-%m-%d %H:%M:%S"); var v = a.Date, l = new v(f - a.getTZOffset(f)), u, d = l[v.hcGetHours](), c = l[v.hcGetDay](), n = l[v.hcGetDate](), y = l[v.hcGetMonth](), t = l[v.hcGetFullYear](), m = a.defaultOptions.lang, b = m.weekdays, q = m.shortWeekdays, z = a.pad, v = a.extend({
                a: q ? q[c] : b[c].substr(0, 3), A: b[c], d: z(n), e: z(n, 2, " "), w: c, b: m.shortMonths[y], B: m.months[y], m: z(y + 1), y: t.toString().substr(2, 2), Y: t, H: z(d), k: d, I: z(d % 12 || 12), l: d % 12 || 12, M: z(l[v.hcGetMinutes]()), p: 12 > d ? "AM" : "PM", P: 12 > d ? "am" : "pm", S: z(l.getSeconds()), L: z(Math.round(f %
                1E3), 3)
            }, a.dateFormats); for (u in v) for (; -1 !== h.indexOf("%" + u) ;) h = h.replace("%" + u, "function" === typeof v[u] ? v[u](f) : v[u]); return p ? h.substr(0, 1).toUpperCase() + h.substr(1) : h
        }; a.formatSingle = function (h, f) { var p = /\.([0-9])/, v = a.defaultOptions.lang; /f$/.test(h) ? (p = (p = h.match(p)) ? p[1] : -1, null !== f && (f = a.numberFormat(f, p, v.decimalPoint, -1 < h.indexOf(",") ? v.thousandsSep : ""))) : f = a.dateFormat(h, f); return f }; a.format = function (h, f) {
            for (var p = "{", v = !1, l, u, d, c, n = [], y; h;) {
                p = h.indexOf(p); if (-1 === p) break; l = h.slice(0,
                p); if (v) { l = l.split(":"); u = l.shift().split("."); c = u.length; y = f; for (d = 0; d < c; d++) y = y[u[d]]; l.length && (y = a.formatSingle(l.join(":"), y)); n.push(y) } else n.push(l); h = h.slice(p + 1); p = (v = !v) ? "}" : "{"
            } n.push(h); return n.join("")
        }; a.getMagnitude = function (a) { return Math.pow(10, Math.floor(Math.log(a) / Math.LN10)) }; a.normalizeTickInterval = function (h, f, p, v, l) {
            var u, d = h; p = a.pick(p, 1); u = h / p; f || (f = l ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === v && (1 === p ? f = a.grep(f, function (a) { return 0 === a % 1 }) : .1 >= p && (f = [1 / p])));
            for (v = 0; v < f.length && !(d = f[v], l && d * p >= h || !l && u <= (f[v] + (f[v + 1] || f[v])) / 2) ; v++); return d * p
        }; a.stableSort = function (a, f) { var p = a.length, h, l; for (l = 0; l < p; l++) a[l].safeI = l; a.sort(function (a, d) { h = f(a, d); return 0 === h ? a.safeI - d.safeI : h }); for (l = 0; l < p; l++) delete a[l].safeI }; a.arrayMin = function (a) { for (var f = a.length, p = a[0]; f--;) a[f] < p && (p = a[f]); return p }; a.arrayMax = function (a) { for (var f = a.length, p = a[0]; f--;) a[f] > p && (p = a[f]); return p }; a.destroyObjectProperties = function (a, f) {
            for (var p in a) a[p] && a[p] !== f && a[p].destroy &&
            a[p].destroy(), delete a[p]
        }; a.discardElement = function (h) { var f = a.garbageBin; f || (f = a.createElement("div")); h && f.appendChild(h); f.innerHTML = "" }; a.correctFloat = function (a, f) { return parseFloat(a.toPrecision(f || 14)) }; a.setAnimation = function (h, f) { f.renderer.globalAnimation = a.pick(h, f.options.chart.animation, !0) }; a.animObject = function (h) { return a.isObject(h) ? a.merge(h) : { duration: h ? 500 : 0 } }; a.timeUnits = { millisecond: 1, second: 1E3, minute: 6E4, hour: 36E5, day: 864E5, week: 6048E5, month: 24192E5, year: 314496E5 }; a.numberFormat =
        function (h, f, p, v) { h = +h || 0; f = +f; var l = a.defaultOptions.lang, u = (h.toString().split(".")[1] || "").length, d, c, n = Math.abs(h); -1 === f ? f = Math.min(u, 20) : a.isNumber(f) || (f = 2); d = String(a.pInt(n.toFixed(f))); c = 3 < d.length ? d.length % 3 : 0; p = a.pick(p, l.decimalPoint); v = a.pick(v, l.thousandsSep); h = (0 > h ? "-" : "") + (c ? d.substr(0, c) + v : ""); h += d.substr(c).replace(/(\d{3})(?=\d)/g, "$1" + v); f && (v = Math.abs(n - d + Math.pow(10, -Math.max(f, u) - 1)), h += p + v.toFixed(f).slice(2)); return h }; Math.easeInOutSine = function (a) {
            return -.5 * (Math.cos(Math.PI *
            a) - 1)
        }; a.getStyle = function (h, f) { return "width" === f ? Math.min(h.offsetWidth, h.scrollWidth) - a.getStyle(h, "padding-left") - a.getStyle(h, "padding-right") : "height" === f ? Math.min(h.offsetHeight, h.scrollHeight) - a.getStyle(h, "padding-top") - a.getStyle(h, "padding-bottom") : (h = I.getComputedStyle(h, void 0)) && a.pInt(h.getPropertyValue(f)) }; a.inArray = function (a, f) { return f.indexOf ? f.indexOf(a) : [].indexOf.call(f, a) }; a.grep = function (a, f) { return [].filter.call(a, f) }; a.find = function (a, f) { return [].find.call(a, f) }; a.map = function (a,
        f) { for (var p = [], h = 0, l = a.length; h < l; h++) p[h] = f.call(a[h], a[h], h, a); return p }; a.offset = function (a) { var f = G.documentElement; a = a.getBoundingClientRect(); return { top: a.top + (I.pageYOffset || f.scrollTop) - (f.clientTop || 0), left: a.left + (I.pageXOffset || f.scrollLeft) - (f.clientLeft || 0) } }; a.stop = function (a, f) { for (var p = D.length; p--;) D[p].elem !== a || f && f !== D[p].prop || (D[p].stopped = !0) }; a.each = function (a, f, p) { return Array.prototype.forEach.call(a, f, p) }; a.addEvent = function (h, f, p) {
            function v(a) {
                a.target = a.srcElement ||
                I; p.call(h, a)
            } var l = h.hcEvents = h.hcEvents || {}; h.addEventListener ? h.addEventListener(f, p, !1) : h.attachEvent && (h.hcEventsIE || (h.hcEventsIE = {}), h.hcEventsIE[p.toString()] = v, h.attachEvent("on" + f, v)); l[f] || (l[f] = []); l[f].push(p); return function () { a.removeEvent(h, f, p) }
        }; a.removeEvent = function (h, f, p) {
            function v(a, c) { h.removeEventListener ? h.removeEventListener(a, c, !1) : h.attachEvent && (c = h.hcEventsIE[c.toString()], h.detachEvent("on" + a, c)) } function l() {
                var a, c; if (h.nodeName) for (c in f ? (a = {}, a[f] = !0) : a = d, a) if (d[c]) for (a =
                d[c].length; a--;) v(c, d[c][a])
            } var u, d = h.hcEvents, c; d && (f ? (u = d[f] || [], p ? (c = a.inArray(p, u), -1 < c && (u.splice(c, 1), d[f] = u), v(f, p)) : (l(), d[f] = [])) : (l(), h.hcEvents = {}))
        }; a.fireEvent = function (h, f, p, v) {
            var l; l = h.hcEvents; var u, d; p = p || {}; if (G.createEvent && (h.dispatchEvent || h.fireEvent)) l = G.createEvent("Events"), l.initEvent(f, !0, !0), a.extend(l, p), h.dispatchEvent ? h.dispatchEvent(l) : h.fireEvent(f, l); else if (l) for (l = l[f] || [], u = l.length, p.target || a.extend(p, {
                    preventDefault: function () { p.defaultPrevented = !0 }, target: h,
                    type: f
            }), f = 0; f < u; f++) (d = l[f]) && !1 === d.call(h, p) && p.preventDefault(); v && !p.defaultPrevented && v(p)
        }; a.animate = function (h, f, p) {
            var v, l = "", u, d, c; a.isObject(p) || (v = arguments, p = { duration: v[2], easing: v[3], complete: v[4] }); a.isNumber(p.duration) || (p.duration = 400); p.easing = "function" === typeof p.easing ? p.easing : Math[p.easing] || Math.easeInOutSine; p.curAnim = a.merge(f); for (c in f) a.stop(h, c), d = new a.Fx(h, p, c), u = null, "d" === c ? (d.paths = d.initPath(h, h.d, f.d), d.toD = f.d, v = 0, u = 1) : h.attr ? v = h.attr(c) : (v = parseFloat(a.getStyle(h,
            c)) || 0, "opacity" !== c && (l = "px")), u || (u = f[c]), u.match && u.match("px") && (u = u.replace(/px/g, "")), d.run(v, u, l)
        }; a.seriesType = function (h, f, p, v, l) { var u = a.getOptions(), d = a.seriesTypes; u.plotOptions[h] = a.merge(u.plotOptions[f], p); d[h] = a.extendClass(d[f] || function () { }, v); d[h].prototype.type = h; l && (d[h].prototype.pointClass = a.extendClass(a.Point, l)); return d[h] }; a.uniqueKey = function () { var a = Math.random().toString(36).substring(2, 9), f = 0; return function () { return "highcharts-" + a + "-" + f++ } }(); I.jQuery && (I.jQuery.fn.highcharts =
        function () { var h = [].slice.call(arguments); if (this[0]) return h[0] ? (new (a[a.isString(h[0]) ? h.shift() : "Chart"])(this[0], h[0], h[1]), this) : C[a.attr(this[0], "data-highcharts-chart")] }); G && !G.defaultView && (a.getStyle = function (h, f) {
            var p = { width: "clientWidth", height: "clientHeight" }[f]; if (h.style[f]) return a.pInt(h.style[f]); "opacity" === f && (f = "filter"); if (p) return h.style.zoom = 1, Math.max(h[p] - 2 * a.getStyle(h, "padding"), 0); h = h.currentStyle[f.replace(/\-(\w)/g, function (a, l) { return l.toUpperCase() })]; "filter" ===
            f && (h = h.replace(/alpha\(opacity=([0-9]+)\)/, function (a, l) { return l / 100 })); return "" === h ? 1 : a.pInt(h)
        }); Array.prototype.forEach || (a.each = function (a, f, p) { for (var h = 0, l = a.length; h < l; h++) if (!1 === f.call(p, a[h], h, a)) return h }); Array.prototype.indexOf || (a.inArray = function (a, f) { var p, h = 0; if (f) for (p = f.length; h < p; h++) if (f[h] === a) return h; return -1 }); Array.prototype.filter || (a.grep = function (a, f) { for (var p = [], h = 0, l = a.length; h < l; h++) f(a[h], h) && p.push(a[h]); return p }); Array.prototype.find || (a.find = function (a, f) {
            var p,
            h = a.length; for (p = 0; p < h; p++) if (f(a[p], p)) return a[p]
        })
    })(L); (function (a) {
        var D = a.each, C = a.isNumber, G = a.map, I = a.merge, h = a.pInt; a.Color = function (f) { if (!(this instanceof a.Color)) return new a.Color(f); this.init(f) }; a.Color.prototype = {
            parsers: [{ regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/, parse: function (a) { return [h(a[1]), h(a[2]), h(a[3]), parseFloat(a[4], 10)] } }, {
                regex: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, parse: function (a) {
                    return [h(a[1],
                    16), h(a[2], 16), h(a[3], 16), 1]
                }
            }, { regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/, parse: function (a) { return [h(a[1]), h(a[2]), h(a[3]), 1] } }], names: { white: "#ffffff", black: "#000000" }, init: function (f) { var p, h, l, u; if ((this.input = f = this.names[f] || f) && f.stops) this.stops = G(f.stops, function (d) { return new a.Color(d[1]) }); else for (l = this.parsers.length; l-- && !h;) u = this.parsers[l], (p = u.regex.exec(f)) && (h = u.parse(p)); this.rgba = h || [] }, get: function (a) {
                var f = this.input, h = this.rgba, l; this.stops ?
                (l = I(f), l.stops = [].concat(l.stops), D(this.stops, function (f, d) { l.stops[d] = [l.stops[d][0], f.get(a)] })) : l = h && C(h[0]) ? "rgb" === a || !a && 1 === h[3] ? "rgb(" + h[0] + "," + h[1] + "," + h[2] + ")" : "a" === a ? h[3] : "rgba(" + h.join(",") + ")" : f; return l
            }, brighten: function (a) { var f, v = this.rgba; if (this.stops) D(this.stops, function (l) { l.brighten(a) }); else if (C(a) && 0 !== a) for (f = 0; 3 > f; f++) v[f] += h(255 * a), 0 > v[f] && (v[f] = 0), 255 < v[f] && (v[f] = 255); return this }, setOpacity: function (a) { this.rgba[3] = a; return this }
        }; a.color = function (f) { return new a.Color(f) }
    })(L);
    (function (a) {
        var D, C, G = a.addEvent, I = a.animate, h = a.attr, f = a.charts, p = a.color, v = a.css, l = a.createElement, u = a.defined, d = a.deg2rad, c = a.destroyObjectProperties, n = a.doc, y = a.each, t = a.extend, m = a.erase, b = a.grep, q = a.hasTouch, z = a.isArray, F = a.isFirefox, e = a.isMS, r = a.isObject, x = a.isString, A = a.isWebKit, k = a.merge, w = a.noop, K = a.pick, J = a.pInt, N = a.removeEvent, g = a.stop, B = a.svg, S = a.SVG_NS, M = a.symbolSizes, R = a.win; D = a.SVGElement = function () { return this }; D.prototype = {
            opacity: 1, SVG_NS: S, textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textDecoration textOverflow textOutline".split(" "),
            init: function (a, H) { this.element = "span" === H ? l(H) : n.createElementNS(this.SVG_NS, H); this.renderer = a }, animate: function (E, H, g) { H = a.animObject(K(H, this.renderer.globalAnimation, !0)); 0 !== H.duration ? (g && (H.complete = g), I(this, E, H)) : this.attr(E, null, g); return this }, colorGradient: function (E, H, g) {
                var e = this.renderer, c, b, B, r, m, w, q, d, x, n, P, t = [], A; E.linearGradient ? b = "linearGradient" : E.radialGradient && (b = "radialGradient"); if (b) {
                    B = E[b]; m = e.gradients; q = E.stops; n = g.radialReference; z(B) && (E[b] = B = {
                        x1: B[0], y1: B[1], x2: B[2],
                        y2: B[3], gradientUnits: "userSpaceOnUse"
                    }); "radialGradient" === b && n && !u(B.gradientUnits) && (r = B, B = k(B, e.getRadialAttr(n, r), { gradientUnits: "userSpaceOnUse" })); for (P in B) "id" !== P && t.push(P, B[P]); for (P in q) t.push(q[P]); t = t.join(","); m[t] ? n = m[t].attr("id") : (B.id = n = a.uniqueKey(), m[t] = w = e.createElement(b).attr(B).add(e.defs), w.radAttr = r, w.stops = [], y(q, function (E) {
                        0 === E[1].indexOf("rgba") ? (c = a.color(E[1]), d = c.get("rgb"), x = c.get("a")) : (d = E[1], x = 1); E = e.createElement("stop").attr({
                            offset: E[0], "stop-color": d,
                            "stop-opacity": x
                        }).add(w); w.stops.push(E)
                    })); A = "url(" + e.url + "#" + n + ")"; g.setAttribute(H, A); g.gradient = t; E.toString = function () { return A }
                }
            }, applyTextOutline: function (a) {
                var E = this.element, g, e, k, b; -1 !== a.indexOf("contrast") && (a = a.replace(/contrast/g, this.renderer.getContrast(E.style.fill))); this.fakeTS = !0; this.ySetter = this.xSetter; g = [].slice.call(E.getElementsByTagName("tspan")); a = a.split(" "); e = a[a.length - 1]; (k = a[0]) && "none" !== k && (k = k.replace(/(^[\d\.]+)(.*?)$/g, function (a, E, H) { return 2 * E + H }), y(g, function (a) {
                    "highcharts-text-outline" ===
                    a.getAttribute("class") && m(g, E.removeChild(a))
                }), b = E.firstChild, y(g, function (a, H) { 0 === H && (a.setAttribute("x", E.getAttribute("x")), H = E.getAttribute("y"), a.setAttribute("y", H || 0), null === H && E.setAttribute("y", 0)); a = a.cloneNode(1); h(a, { "class": "highcharts-text-outline", fill: e, stroke: e, "stroke-width": k, "stroke-linejoin": "round" }); E.insertBefore(a, b) }))
            }, attr: function (a, H, e, k) {
                var E, b = this.element, c, B = this, r; "string" === typeof a && void 0 !== H && (E = a, a = {}, a[E] = H); if ("string" === typeof a) B = (this[a + "Getter"] ||
                this._defaultGetter).call(this, a, b); else { for (E in a) H = a[E], r = !1, k || g(this, E), this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(E) && (c || (this.symbolAttr(a), c = !0), r = !0), !this.rotation || "x" !== E && "y" !== E || (this.doTransform = !0), r || (r = this[E + "Setter"] || this._defaultSetter, r.call(this, H, E, b), this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(E) && this.updateShadows(E, H, r)); this.doTransform && (this.updateTransform(), this.doTransform = !1) } e && e(); return B
            }, updateShadows: function (a,
            H, g) { for (var E = this.shadows, e = E.length; e--;) g.call(E[e], "height" === a ? Math.max(H - (E[e].cutHeight || 0), 0) : "d" === a ? this.d : H, a, E[e]) }, addClass: function (a, H) { var E = this.attr("class") || ""; -1 === E.indexOf(a) && (H || (a = (E + (E ? " " : "") + a).replace("  ", " ")), this.attr("class", a)); return this }, hasClass: function (a) { return -1 !== h(this.element, "class").indexOf(a) }, removeClass: function (a) { h(this.element, "class", (h(this.element, "class") || "").replace(a, "")); return this }, symbolAttr: function (a) {
                var E = this; y("x y r start end width height innerR anchorX anchorY".split(" "),
                function (g) { E[g] = K(a[g], E[g]) }); E.attr({ d: E.renderer.symbols[E.symbolName](E.x, E.y, E.width, E.height, E) })
            }, clip: function (a) { return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none") }, crisp: function (a, g) {
                var E, H = {}, e; g = g || a.strokeWidth || 0; e = Math.round(g) % 2 / 2; a.x = Math.floor(a.x || this.x || 0) + e; a.y = Math.floor(a.y || this.y || 0) + e; a.width = Math.floor((a.width || this.width || 0) - 2 * e); a.height = Math.floor((a.height || this.height || 0) - 2 * e); u(a.strokeWidth) && (a.strokeWidth = g); for (E in a) this[E] !== a[E] &&
                (this[E] = H[E] = a[E]); return H
            }, css: function (a) {
                var g = this.styles, E = {}, k = this.element, b, c, r = ""; b = !g; a && a.color && (a.fill = a.color); if (g) for (c in a) a[c] !== g[c] && (E[c] = a[c], b = !0); if (b) {
                    b = this.textWidth = a && a.width && "text" === k.nodeName.toLowerCase() && J(a.width) || this.textWidth; g && (a = t(g, E)); this.styles = a; b && !B && this.renderer.forExport && delete a.width; if (e && !B) v(this.element, a); else { g = function (a, g) { return "-" + g.toLowerCase() }; for (c in a) r += c.replace(/([A-Z])/g, g) + ":" + a[c] + ";"; h(k, "style", r) } this.added && (b &&
                    this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline))
                } return this
            }, strokeWidth: function () { return this["stroke-width"] || 0 }, on: function (a, g) { var E = this, e = E.element; q && "click" === a ? (e.ontouchstart = function (a) { E.touchEventFired = Date.now(); a.preventDefault(); g.call(e, a) }, e.onclick = function (a) { (-1 === R.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (E.touchEventFired || 0)) && g.call(e, a) }) : e["on" + a] = g; return this }, setRadialReference: function (a) {
                var g = this.renderer.gradients[this.element.gradient];
                this.element.radialReference = a; g && g.radAttr && g.animate(this.renderer.getRadialAttr(a, g.radAttr)); return this
            }, translate: function (a, g) { return this.attr({ translateX: a, translateY: g }) }, invert: function (a) { this.inverted = a; this.updateTransform(); return this }, updateTransform: function () {
                var a = this.translateX || 0, g = this.translateY || 0, e = this.scaleX, k = this.scaleY, b = this.inverted, c = this.rotation, B = this.element; b && (a += this.attr("width"), g += this.attr("height")); a = ["translate(" + a + "," + g + ")"]; b ? a.push("rotate(90) scale(-1,1)") :
                c && a.push("rotate(" + c + " " + (B.getAttribute("x") || 0) + " " + (B.getAttribute("y") || 0) + ")"); (u(e) || u(k)) && a.push("scale(" + K(e, 1) + " " + K(k, 1) + ")"); a.length && B.setAttribute("transform", a.join(" "))
            }, toFront: function () { var a = this.element; a.parentNode.appendChild(a); return this }, align: function (a, g, e) {
                var E, H, k, b, c = {}; H = this.renderer; k = H.alignedObjects; var B, r; if (a) { if (this.alignOptions = a, this.alignByTranslate = g, !e || x(e)) this.alignTo = E = e || "renderer", m(k, this), k.push(this), e = null } else a = this.alignOptions, g = this.alignByTranslate,
                E = this.alignTo; e = K(e, H[E], H); E = a.align; H = a.verticalAlign; k = (e.x || 0) + (a.x || 0); b = (e.y || 0) + (a.y || 0); "right" === E ? B = 1 : "center" === E && (B = 2); B && (k += (e.width - (a.width || 0)) / B); c[g ? "translateX" : "x"] = Math.round(k); "bottom" === H ? r = 1 : "middle" === H && (r = 2); r && (b += (e.height - (a.height || 0)) / r); c[g ? "translateY" : "y"] = Math.round(b); this[this.placed ? "animate" : "attr"](c); this.placed = !0; this.alignAttr = c; return this
            }, getBBox: function (a, g) {
                var E, H = this.renderer, k, b = this.element, c = this.styles, B, r = this.textStr, m, w = H.cache, q = H.cacheKeys,
                x; g = K(g, this.rotation); k = g * d; B = c && c.fontSize; void 0 !== r && (x = r.toString(), -1 === x.indexOf("\x3c") && (x = x.replace(/[0-9]/g, "0")), x += ["", g || 0, B, b.style.width, b.style["text-overflow"]].join()); x && !a && (E = w[x]); if (!E) {
                    if (b.namespaceURI === this.SVG_NS || H.forExport) {
                        try { (m = this.fakeTS && function (a) { y(b.querySelectorAll(".highcharts-text-outline"), function (g) { g.style.display = a }) }) && m("none"), E = b.getBBox ? t({}, b.getBBox()) : { width: b.offsetWidth, height: b.offsetHeight }, m && m("") } catch (T) { } if (!E || 0 > E.width) E = {
                            width: 0,
                            height: 0
                        }
                    } else E = this.htmlGetBBox(); H.isSVG && (a = E.width, H = E.height, e && c && "11px" === c.fontSize && "16.9" === H.toPrecision(3) && (E.height = H = 14), g && (E.width = Math.abs(H * Math.sin(k)) + Math.abs(a * Math.cos(k)), E.height = Math.abs(H * Math.cos(k)) + Math.abs(a * Math.sin(k)))); if (x && 0 < E.height) { for (; 250 < q.length;) delete w[q.shift()]; w[x] || q.push(x); w[x] = E }
                } return E
            }, show: function (a) { return this.attr({ visibility: a ? "inherit" : "visible" }) }, hide: function () { return this.attr({ visibility: "hidden" }) }, fadeOut: function (a) {
                var g =
                this; g.animate({ opacity: 0 }, { duration: a || 150, complete: function () { g.attr({ y: -9999 }) } })
            }, add: function (a) { var g = this.renderer, e = this.element, E; a && (this.parentGroup = a); this.parentInverted = a && a.inverted; void 0 !== this.textStr && g.buildText(this); this.added = !0; if (!a || a.handleZ || this.zIndex) E = this.zIndexSetter(); E || (a ? a.element : g.box).appendChild(e); if (this.onAdd) this.onAdd(); return this }, safeRemoveChild: function (a) { var g = a.parentNode; g && g.removeChild(a) }, destroy: function () {
                var a = this.element || {}, e = this.renderer.isSVG &&
                "SPAN" === a.nodeName && this.parentGroup, k, b; a.onclick = a.onmouseout = a.onmouseover = a.onmousemove = a.point = null; g(this); this.clipPath && (this.clipPath = this.clipPath.destroy()); if (this.stops) { for (b = 0; b < this.stops.length; b++) this.stops[b] = this.stops[b].destroy(); this.stops = null } this.safeRemoveChild(a); for (this.destroyShadows() ; e && e.div && 0 === e.div.childNodes.length;) a = e.parentGroup, this.safeRemoveChild(e.div), delete e.div, e = a; this.alignTo && m(this.renderer.alignedObjects, this); for (k in this) delete this[k]; return null
            },
            shadow: function (a, g, e) {
                var E = [], b, k, H = this.element, c, B, r, m; if (!a) this.destroyShadows(); else if (!this.shadows) {
                    B = K(a.width, 3); r = (a.opacity || .15) / B; m = this.parentInverted ? "(-1,-1)" : "(" + K(a.offsetX, 1) + ", " + K(a.offsetY, 1) + ")"; for (b = 1; b <= B; b++) k = H.cloneNode(0), c = 2 * B + 1 - 2 * b, h(k, { isShadow: "true", stroke: a.color || "#000000", "stroke-opacity": r * b, "stroke-width": c, transform: "translate" + m, fill: "none" }), e && (h(k, "height", Math.max(h(k, "height") - c, 0)), k.cutHeight = c), g ? g.element.appendChild(k) : H.parentNode.insertBefore(k,
                    H), E.push(k); this.shadows = E
                } return this
            }, destroyShadows: function () { y(this.shadows || [], function (a) { this.safeRemoveChild(a) }, this); this.shadows = void 0 }, xGetter: function (a) { "circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy")); return this._defaultGetter(a) }, _defaultGetter: function (a) { a = K(this[a], this.element ? this.element.getAttribute(a) : null, 0); /^[\-0-9\.]+$/.test(a) && (a = parseFloat(a)); return a }, dSetter: function (a, g, e) {
                a && a.join && (a = a.join(" ")); /(NaN| {2}|^$)/.test(a) && (a = "M 0 0"); e.setAttribute(g,
                a); this[g] = a
            }, dashstyleSetter: function (a) { var g, e = this["stroke-width"]; "inherit" === e && (e = 1); if (a = a && a.toLowerCase()) { a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(","); for (g = a.length; g--;) a[g] = J(a[g]) * e; a = a.join(",").replace(/NaN/g, "none"); this.element.setAttribute("stroke-dasharray", a) } }, alignSetter: function (a) {
                this.element.setAttribute("text-anchor",
                { left: "start", center: "middle", right: "end" }[a])
            }, opacitySetter: function (a, g, e) { this[g] = a; e.setAttribute(g, a) }, titleSetter: function (a) { var g = this.element.getElementsByTagName("title")[0]; g || (g = n.createElementNS(this.SVG_NS, "title"), this.element.appendChild(g)); g.firstChild && g.removeChild(g.firstChild); g.appendChild(n.createTextNode(String(K(a), "").replace(/<[^>]*>/g, ""))) }, textSetter: function (a) { a !== this.textStr && (delete this.bBox, this.textStr = a, this.added && this.renderer.buildText(this)) }, fillSetter: function (a,
            g, e) { "string" === typeof a ? e.setAttribute(g, a) : a && this.colorGradient(a, g, e) }, visibilitySetter: function (a, g, e) { "inherit" === a ? e.removeAttribute(g) : e.setAttribute(g, a) }, zIndexSetter: function (a, g) {
                var e = this.renderer, k = this.parentGroup, b = (k || e).element || e.box, c, B = this.element, H; c = this.added; var r; u(a) && (B.zIndex = a, a = +a, this[g] === a && (c = !1), this[g] = a); if (c) {
                    (a = this.zIndex) && k && (k.handleZ = !0); g = b.childNodes; for (r = 0; r < g.length && !H; r++) k = g[r], c = k.zIndex, k !== B && (J(c) > a || !u(a) && u(c) || 0 > a && !u(c) && b !== e.box) && (b.insertBefore(B,
                    k), H = !0); H || b.appendChild(B)
                } return H
            }, _defaultSetter: function (a, g, e) { e.setAttribute(g, a) }
        }; D.prototype.yGetter = D.prototype.xGetter; D.prototype.translateXSetter = D.prototype.translateYSetter = D.prototype.rotationSetter = D.prototype.verticalAlignSetter = D.prototype.scaleXSetter = D.prototype.scaleYSetter = function (a, g) { this[g] = a; this.doTransform = !0 }; D.prototype["stroke-widthSetter"] = D.prototype.strokeSetter = function (a, g, e) {
            this[g] = a; this.stroke && this["stroke-width"] ? (D.prototype.fillSetter.call(this, this.stroke,
            "stroke", e), e.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === g && 0 === a && this.hasStroke && (e.removeAttribute("stroke"), this.hasStroke = !1)
        }; C = a.SVGRenderer = function () { this.init.apply(this, arguments) }; C.prototype = {
            Element: D, SVG_NS: S, init: function (a, g, e, k, b, c) {
                var B; k = this.createElement("svg").attr({ version: "1.1", "class": "highcharts-root" }).css(this.getStyle(k)); B = k.element; a.appendChild(B); -1 === a.innerHTML.indexOf("xmlns") && h(B, "xmlns", this.SVG_NS); this.isSVG = !0;
                this.box = B; this.boxWrapper = k; this.alignedObjects = []; this.url = (F || A) && n.getElementsByTagName("base").length ? R.location.href.replace(/#.*?$/, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : ""; this.createElement("desc").add().element.appendChild(n.createTextNode("Created with Highcharts 5.0.6")); this.defs = this.createElement("defs").add(); this.allowHTML = c; this.forExport = b; this.gradients = {}; this.cache = {}; this.cacheKeys = []; this.imgCount = 0; this.setSize(g, e, !1); var H; F && a.getBoundingClientRect && (g = function () {
                    v(a,
                    { left: 0, top: 0 }); H = a.getBoundingClientRect(); v(a, { left: Math.ceil(H.left) - H.left + "px", top: Math.ceil(H.top) - H.top + "px" })
                }, g(), this.unSubPixelFix = G(R, "resize", g))
            }, getStyle: function (a) { return this.style = t({ fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif', fontSize: "12px" }, a) }, setStyle: function (a) { this.boxWrapper.css(this.getStyle(a)) }, isHidden: function () { return !this.boxWrapper.getBBox().width }, destroy: function () {
                var a = this.defs; this.box = null; this.boxWrapper = this.boxWrapper.destroy();
                c(this.gradients || {}); this.gradients = null; a && (this.defs = a.destroy()); this.unSubPixelFix && this.unSubPixelFix(); return this.alignedObjects = null
            }, createElement: function (a) { var g = new this.Element; g.init(this, a); return g }, draw: w, getRadialAttr: function (a, g) { return { cx: a[0] - a[2] / 2 + g.cx * a[2], cy: a[1] - a[2] / 2 + g.cy * a[2], r: g.r * a[2] } }, buildText: function (a) {
                for (var g = a.element, e = this, k = e.forExport, c = K(a.textStr, "").toString(), r = -1 !== c.indexOf("\x3c"), m = g.childNodes, w, E, q, x, d = h(g, "x"), t = a.styles, A = a.textWidth, z = t &&
                t.lineHeight, l = t && t.textOutline, F = t && "ellipsis" === t.textOverflow, f = m.length, u = A && !a.added && this.box, p = function (a) { var k; k = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : t && t.fontSize || e.style.fontSize || 12; return z ? J(z) : e.fontMetrics(k, a.getAttribute("style") ? a : g).h }; f--;) g.removeChild(m[f]); r || l || F || A || -1 !== c.indexOf(" ") ? (w = /<.*class="([^"]+)".*>/, E = /<.*style="([^"]+)".*>/, q = /<.*href="(http[^"]+)".*>/, u && u.appendChild(g), c = r ? c.replace(/<(b|strong)>/g, '\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,
                '\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g, "\x3cspan").replace(/<\/(b|strong|i|em|a)>/g, "\x3c/span\x3e").split(/<br.*?>/g) : [c], c = b(c, function (a) { return "" !== a }), y(c, function (b, c) {
                    var r, H = 0; b = b.replace(/^\s+|\s+$/g, "").replace(/<span/g, "|||\x3cspan").replace(/<\/span>/g, "\x3c/span\x3e|||"); r = b.split("|||"); y(r, function (b) {
                        if ("" !== b || 1 === r.length) {
                            var m = {}, l = n.createElementNS(e.SVG_NS, "tspan"), z, f; w.test(b) && (z = b.match(w)[1], h(l, "class", z)); E.test(b) && (f = b.match(E)[1].replace(/(;| |^)color([ :])/,
                            "$1fill$2"), h(l, "style", f)); q.test(b) && !k && (h(l, "onclick", 'location.href\x3d"' + b.match(q)[1] + '"'), v(l, { cursor: "pointer" })); b = (b.replace(/<(.|\n)*?>/g, "") || " ").replace(/&lt;/g, "\x3c").replace(/&gt;/g, "\x3e"); if (" " !== b) {
                                l.appendChild(n.createTextNode(b)); H ? m.dx = 0 : c && null !== d && (m.x = d); h(l, m); g.appendChild(l); !H && c && (!B && k && v(l, { display: "block" }), h(l, "dy", p(l))); if (A) {
                                    m = b.replace(/([^\^])-/g, "$1- ").split(" "); z = "nowrap" === t.whiteSpace; for (var K = 1 < r.length || c || 1 < m.length && !z, u, y, J = [], M = p(l), P = a.rotation,
                                    O = b, N = O.length; (K || F) && (m.length || J.length) ;) a.rotation = 0, u = a.getBBox(!0), y = u.width, !B && e.forExport && (y = e.measureSpanWidth(l.firstChild.data, a.styles)), u = y > A, void 0 === x && (x = u), F && x ? (N /= 2, "" === O || !u && .5 > N ? m = [] : (O = b.substring(0, O.length + (u ? -1 : 1) * Math.ceil(N)), m = [O + (3 < A ? "\u2026" : "")], l.removeChild(l.firstChild))) : u && 1 !== m.length ? (l.removeChild(l.firstChild), J.unshift(m.pop())) : (m = J, J = [], m.length && !z && (l = n.createElementNS(S, "tspan"), h(l, { dy: M, x: d }), f && h(l, "style", f), g.appendChild(l)), y > A && (A = y)), m.length &&
                                    l.appendChild(n.createTextNode(m.join(" ").replace(/- /g, "-"))); a.rotation = P
                                } H++
                            }
                        }
                    })
                }), x && a.attr("title", a.textStr), u && u.removeChild(g), l && a.applyTextOutline && a.applyTextOutline(l)) : g.appendChild(n.createTextNode(c.replace(/&lt;/g, "\x3c").replace(/&gt;/g, "\x3e")))
            }, getContrast: function (a) { a = p(a).rgba; return 510 < a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF" }, button: function (a, g, b, c, B, r, m, w, q) {
                var H = this.label(a, g, b, q, null, null, null, null, "button"), E = 0; H.attr(k({ padding: 8, r: 2 }, B)); var x, d, n, l; B = k({
                    fill: "#f7f7f7",
                    stroke: "#cccccc", "stroke-width": 1, style: { color: "#333333", cursor: "pointer", fontWeight: "normal" }
                }, B); x = B.style; delete B.style; r = k(B, { fill: "#e6e6e6" }, r); d = r.style; delete r.style; m = k(B, { fill: "#e6ebf5", style: { color: "#000000", fontWeight: "bold" } }, m); n = m.style; delete m.style; w = k(B, { style: { color: "#cccccc" } }, w); l = w.style; delete w.style; G(H.element, e ? "mouseover" : "mouseenter", function () { 3 !== E && H.setState(1) }); G(H.element, e ? "mouseout" : "mouseleave", function () { 3 !== E && H.setState(E) }); H.setState = function (a) {
                    1 !== a &&
                    (H.state = E = a); H.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]); H.attr([B, r, m, w][a || 0]).css([x, d, n, l][a || 0])
                }; H.attr(B).css(t({ cursor: "default" }, x)); return H.on("click", function (a) { 3 !== E && c.call(H, a) })
            }, crispLine: function (a, g) { a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - g % 2 / 2); a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + g % 2 / 2); return a }, path: function (a) { var g = { fill: "none" }; z(a) ? g.d = a : r(a) && t(g, a); return this.createElement("path").attr(g) },
            circle: function (a, g, e) { a = r(a) ? a : { x: a, y: g, r: e }; g = this.createElement("circle"); g.xSetter = g.ySetter = function (a, g, e) { e.setAttribute("c" + g, a) }; return g.attr(a) }, arc: function (a, g, e, b, k, c) { r(a) && (g = a.y, e = a.r, b = a.innerR, k = a.start, c = a.end, a = a.x); a = this.symbol("arc", a || 0, g || 0, e || 0, e || 0, { innerR: b || 0, start: k || 0, end: c || 0 }); a.r = e; return a }, rect: function (a, g, e, b, k, c) {
                k = r(a) ? a.r : k; var B = this.createElement("rect"); a = r(a) ? a : void 0 === a ? {} : { x: a, y: g, width: Math.max(e, 0), height: Math.max(b, 0) }; void 0 !== c && (a.strokeWidth =
                c, a = B.crisp(a)); a.fill = "none"; k && (a.r = k); B.rSetter = function (a, g, e) { h(e, { rx: a, ry: a }) }; return B.attr(a)
            }, setSize: function (a, g, e) { var b = this.alignedObjects, k = b.length; this.width = a; this.height = g; for (this.boxWrapper.animate({ width: a, height: g }, { step: function () { this.attr({ viewBox: "0 0 " + this.attr("width") + " " + this.attr("height") }) }, duration: K(e, !0) ? void 0 : 0 }) ; k--;) b[k].align() }, g: function (a) { var g = this.createElement("g"); return a ? g.attr({ "class": "highcharts-" + a }) : g }, image: function (a, g, e, b, k) {
                var c = { preserveAspectRatio: "none" };
                1 < arguments.length && t(c, { x: g, y: e, width: b, height: k }); c = this.createElement("image").attr(c); c.element.setAttributeNS ? c.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a) : c.element.setAttribute("hc-svg-href", a); return c
            }, symbol: function (a, g, e, b, k, c) {
                var B = this, r, H = this.symbols[a], m = u(g) && H && H(Math.round(g), Math.round(e), b, k, c), w = /^url\((.*?)\)$/, q, x; H ? (r = this.path(m), r.attr("fill", "none"), t(r, { symbolName: a, x: g, y: e, width: b, height: k }), c && t(r, c)) : w.test(a) && (q = a.match(w)[1], r = this.image(q),
                r.imgwidth = K(M[q] && M[q].width, c && c.width), r.imgheight = K(M[q] && M[q].height, c && c.height), x = function () { r.attr({ width: r.width, height: r.height }) }, y(["width", "height"], function (a) { r[a + "Setter"] = function (a, g) { var e = {}, b = this["img" + g], k = "width" === g ? "translateX" : "translateY"; this[g] = a; u(b) && (this.element && this.element.setAttribute(g, b), this.alignByTranslate || (e[k] = ((this[g] || 0) - b) / 2, this.attr(e))) } }), u(g) && r.attr({ x: g, y: e }), r.isImg = !0, u(r.imgwidth) && u(r.imgheight) ? x() : (r.attr({ width: 0, height: 0 }), l("img", {
                    onload: function () {
                        var a =
                        f[B.chartIndex]; 0 === this.width && (v(this, { position: "absolute", top: "-999em" }), n.body.appendChild(this)); M[q] = { width: this.width, height: this.height }; r.imgwidth = this.width; r.imgheight = this.height; r.element && x(); this.parentNode && this.parentNode.removeChild(this); B.imgCount--; if (!B.imgCount && a && a.onload) a.onload()
                    }, src: q
                }), this.imgCount++)); return r
            }, symbols: {
                circle: function (a, g, e, b) { var k = .166 * e; return ["M", a + e / 2, g, "C", a + e + k, g, a + e + k, g + b, a + e / 2, g + b, "C", a - k, g + b, a - k, g, a + e / 2, g, "Z"] }, square: function (a, g, e, b) {
                    return ["M",
                    a, g, "L", a + e, g, a + e, g + b, a, g + b, "Z"]
                }, triangle: function (a, g, e, b) { return ["M", a + e / 2, g, "L", a + e, g + b, a, g + b, "Z"] }, "triangle-down": function (a, g, e, b) { return ["M", a, g, "L", a + e, g, a + e / 2, g + b, "Z"] }, diamond: function (a, g, e, b) { return ["M", a + e / 2, g, "L", a + e, g + b / 2, a + e / 2, g + b, a, g + b / 2, "Z"] }, arc: function (a, g, e, b, k) {
                    var c = k.start; e = k.r || e || b; var B = k.end - .001; b = k.innerR; var r = k.open, m = Math.cos(c), H = Math.sin(c), w = Math.cos(B), B = Math.sin(B); k = k.end - c < Math.PI ? 0 : 1; return ["M", a + e * m, g + e * H, "A", e, e, 0, k, 1, a + e * w, g + e * B, r ? "M" : "L", a + b * w, g + b * B,
                    "A", b, b, 0, k, 0, a + b * m, g + b * H, r ? "" : "Z"]
                }, callout: function (a, g, e, b, k) {
                    var c = Math.min(k && k.r || 0, e, b), B = c + 6, r = k && k.anchorX; k = k && k.anchorY; var m; m = ["M", a + c, g, "L", a + e - c, g, "C", a + e, g, a + e, g, a + e, g + c, "L", a + e, g + b - c, "C", a + e, g + b, a + e, g + b, a + e - c, g + b, "L", a + c, g + b, "C", a, g + b, a, g + b, a, g + b - c, "L", a, g + c, "C", a, g, a, g, a + c, g]; r && r > e ? k > g + B && k < g + b - B ? m.splice(13, 3, "L", a + e, k - 6, a + e + 6, k, a + e, k + 6, a + e, g + b - c) : m.splice(13, 3, "L", a + e, b / 2, r, k, a + e, b / 2, a + e, g + b - c) : r && 0 > r ? k > g + B && k < g + b - B ? m.splice(33, 3, "L", a, k + 6, a - 6, k, a, k - 6, a, g + c) : m.splice(33, 3, "L",
                    a, b / 2, r, k, a, b / 2, a, g + c) : k && k > b && r > a + B && r < a + e - B ? m.splice(23, 3, "L", r + 6, g + b, r, g + b + 6, r - 6, g + b, a + c, g + b) : k && 0 > k && r > a + B && r < a + e - B && m.splice(3, 3, "L", r - 6, g, r, g - 6, r + 6, g, e - c, g); return m
                }
            }, clipRect: function (g, e, b, k) { var c = a.uniqueKey(), B = this.createElement("clipPath").attr({ id: c }).add(this.defs); g = this.rect(g, e, b, k, 0).add(B); g.id = c; g.clipPath = B; g.count = 0; return g }, text: function (a, g, e, b) {
                var k = !B && this.forExport, c = {}; if (b && (this.allowHTML || !this.forExport)) return this.html(a, g, e); c.x = Math.round(g || 0); e && (c.y = Math.round(e));
                if (a || 0 === a) c.text = a; a = this.createElement("text").attr(c); k && a.css({ position: "absolute" }); b || (a.xSetter = function (a, g, e) { var b = e.getElementsByTagName("tspan"), k, c = e.getAttribute(g), B; for (B = 0; B < b.length; B++) k = b[B], k.getAttribute(g) === c && k.setAttribute(g, a); e.setAttribute(g, a) }); return a
            }, fontMetrics: function (a, g) {
                a = a || g && g.style && g.style.fontSize || this.style && this.style.fontSize; a = /px/.test(a) ? J(a) : /em/.test(a) ? parseFloat(a) * (g ? this.fontMetrics(null, g.parentNode).f : 16) : 12; g = 24 > a ? a + 3 : Math.round(1.2 *
                a); return { h: g, b: Math.round(.8 * g), f: a }
            }, rotCorr: function (a, g, e) { var b = a; g && e && (b = Math.max(b * Math.cos(g * d), 4)); return { x: -a / 3 * Math.sin(g * d), y: b } }, label: function (a, g, e, b, c, B, r, m, w) {
                var q = this, x = q.g("button" !== w && "label"), d = x.text = q.text("", 0, 0, r).attr({ zIndex: 1 }), H, n, l = 0, A = 3, z = 0, F, f, K, p, J, h = {}, M, S, E = /^url\((.*?)\)$/.test(b), v = E, P, R, O, Q; w && x.addClass("highcharts-" + w); v = E; P = function () { return (M || 0) % 2 / 2 }; R = function () {
                    var a = d.element.style, g = {}; n = (void 0 === F || void 0 === f || J) && u(d.textStr) && d.getBBox(); x.width =
                    (F || n.width || 0) + 2 * A + z; x.height = (f || n.height || 0) + 2 * A; S = A + q.fontMetrics(a && a.fontSize, d).b; v && (H || (x.box = H = q.symbols[b] || E ? q.symbol(b) : q.rect(), H.addClass(("button" === w ? "" : "highcharts-label-box") + (w ? " highcharts-" + w + "-box" : "")), H.add(x), a = P(), g.x = a, g.y = (m ? -S : 0) + a), g.width = Math.round(x.width), g.height = Math.round(x.height), H.attr(t(g, h)), h = {})
                }; O = function () {
                    var a = z + A, g; g = m ? 0 : S; u(F) && n && ("center" === J || "right" === J) && (a += { center: .5, right: 1 }[J] * (F - n.width)); if (a !== d.x || g !== d.y) d.attr("x", a), void 0 !== g && d.attr("y",
                    g); d.x = a; d.y = g
                }; Q = function (a, g) { H ? H.attr(a, g) : h[a] = g }; x.onAdd = function () { d.add(x); x.attr({ text: a || 0 === a ? a : "", x: g, y: e }); H && u(c) && x.attr({ anchorX: c, anchorY: B }) }; x.widthSetter = function (a) { F = a }; x.heightSetter = function (a) { f = a }; x["text-alignSetter"] = function (a) { J = a }; x.paddingSetter = function (a) { u(a) && a !== A && (A = x.padding = a, O()) }; x.paddingLeftSetter = function (a) { u(a) && a !== z && (z = a, O()) }; x.alignSetter = function (a) { a = { left: 0, center: .5, right: 1 }[a]; a !== l && (l = a, n && x.attr({ x: K })) }; x.textSetter = function (a) {
                    void 0 !==
                    a && d.textSetter(a); R(); O()
                }; x["stroke-widthSetter"] = function (a, g) { a && (v = !0); M = this["stroke-width"] = a; Q(g, a) }; x.strokeSetter = x.fillSetter = x.rSetter = function (a, g) { "fill" === g && a && (v = !0); Q(g, a) }; x.anchorXSetter = function (a, g) { c = a; Q(g, Math.round(a) - P() - K) }; x.anchorYSetter = function (a, g) { B = a; Q(g, a - p) }; x.xSetter = function (a) { x.x = a; l && (a -= l * ((F || n.width) + 2 * A)); K = Math.round(a); x.attr("translateX", K) }; x.ySetter = function (a) { p = x.y = Math.round(a); x.attr("translateY", p) }; var V = x.css; return t(x, {
                    css: function (a) {
                        if (a) {
                            var g =
                            {}; a = k(a); y(x.textProps, function (e) { void 0 !== a[e] && (g[e] = a[e], delete a[e]) }); d.css(g)
                        } return V.call(x, a)
                    }, getBBox: function () { return { width: n.width + 2 * A, height: n.height + 2 * A, x: n.x - A, y: n.y - A } }, shadow: function (a) { a && (R(), H && H.shadow(a)); return x }, destroy: function () { N(x.element, "mouseenter"); N(x.element, "mouseleave"); d && (d = d.destroy()); H && (H = H.destroy()); D.prototype.destroy.call(x); x = q = R = O = Q = null }
                })
            }
        }; a.Renderer = C
    })(L); (function (a) {
        var D = a.attr, C = a.createElement, G = a.css, I = a.defined, h = a.each, f = a.extend, p =
        a.isFirefox, v = a.isMS, l = a.isWebKit, u = a.pInt, d = a.SVGRenderer, c = a.win, n = a.wrap; f(a.SVGElement.prototype, {
            htmlCss: function (a) { var c = this.element; if (c = a && "SPAN" === c.tagName && a.width) delete a.width, this.textWidth = c, this.updateTransform(); a && "ellipsis" === a.textOverflow && (a.whiteSpace = "nowrap", a.overflow = "hidden"); this.styles = f(this.styles, a); G(this.element, a); return this }, htmlGetBBox: function () {
                var a = this.element; "text" === a.nodeName && (a.style.position = "absolute"); return {
                    x: a.offsetLeft, y: a.offsetTop, width: a.offsetWidth,
                    height: a.offsetHeight
                }
            }, htmlUpdateTransform: function () {
                if (this.added) {
                    var a = this.renderer, c = this.element, m = this.translateX || 0, b = this.translateY || 0, q = this.x || 0, d = this.y || 0, n = this.textAlign || "left", e = { left: 0, center: .5, right: 1 }[n], r = this.styles; G(c, { marginLeft: m, marginTop: b }); this.shadows && h(this.shadows, function (a) { G(a, { marginLeft: m + 1, marginTop: b + 1 }) }); this.inverted && h(c.childNodes, function (e) { a.invertChild(e, c) }); if ("SPAN" === c.tagName) {
                        var x = this.rotation, A = u(this.textWidth), k = r && r.whiteSpace, w = [x,
                        n, c.innerHTML, this.textWidth, this.textAlign].join(); w !== this.cTT && (r = a.fontMetrics(c.style.fontSize).b, I(x) && this.setSpanRotation(x, e, r), G(c, { width: "", whiteSpace: k || "nowrap" }), c.offsetWidth > A && /[ \-]/.test(c.textContent || c.innerText) && G(c, { width: A + "px", display: "block", whiteSpace: k || "normal" }), this.getSpanCorrection(c.offsetWidth, r, e, x, n)); G(c, { left: q + (this.xCorr || 0) + "px", top: d + (this.yCorr || 0) + "px" }); l && (r = c.offsetHeight); this.cTT = w
                    }
                } else this.alignOnAdd = !0
            }, setSpanRotation: function (a, d, m) {
                var b = {},
                q = v ? "-ms-transform" : l ? "-webkit-transform" : p ? "MozTransform" : c.opera ? "-o-transform" : ""; b[q] = b.transform = "rotate(" + a + "deg)"; b[q + (p ? "Origin" : "-origin")] = b.transformOrigin = 100 * d + "% " + m + "px"; G(this.element, b)
            }, getSpanCorrection: function (a, c, m) { this.xCorr = -a * m; this.yCorr = -c }
        }); f(d.prototype, {
            html: function (a, c, m) {
                var b = this.createElement("span"), q = b.element, d = b.renderer, l = d.isSVG, e = function (a, e) { h(["opacity", "visibility"], function (b) { n(a, b + "Setter", function (a, b, c, r) { a.call(this, b, c, r); e[c] = b }) }) }; b.textSetter =
                function (a) { a !== q.innerHTML && delete this.bBox; q.innerHTML = this.textStr = a; b.htmlUpdateTransform() }; l && e(b, b.element.style); b.xSetter = b.ySetter = b.alignSetter = b.rotationSetter = function (a, e) { "align" === e && (e = "textAlign"); b[e] = a; b.htmlUpdateTransform() }; b.attr({ text: a, x: Math.round(c), y: Math.round(m) }).css({ fontFamily: this.style.fontFamily, fontSize: this.style.fontSize, position: "absolute" }); q.style.whiteSpace = "nowrap"; b.css = b.htmlCss; l && (b.add = function (a) {
                    var c, r = d.box.parentNode, k = []; if (this.parentGroup =
                    a) {
                        if (c = a.div, !c) {
                            for (; a;) k.push(a), a = a.parentGroup; h(k.reverse(), function (a) {
                                var m, x = D(a.element, "class"); x && (x = { className: x }); c = a.div = a.div || C("div", x, { position: "absolute", left: (a.translateX || 0) + "px", top: (a.translateY || 0) + "px", display: a.display, opacity: a.opacity, pointerEvents: a.styles && a.styles.pointerEvents }, c || r); m = c.style; f(a, {
                                    on: function () { b.on.apply({ element: k[0].div }, arguments); return a }, translateXSetter: function (e, g) { m.left = e + "px"; a[g] = e; a.doTransform = !0 }, translateYSetter: function (e, g) {
                                        m.top =
                                        e + "px"; a[g] = e; a.doTransform = !0
                                    }
                                }); e(a, m)
                            })
                        }
                    } else c = r; c.appendChild(q); b.added = !0; b.alignOnAdd && b.htmlUpdateTransform(); return b
                }); return b
            }
        })
    })(L); (function (a) {
        var D, C, G = a.createElement, I = a.css, h = a.defined, f = a.deg2rad, p = a.discardElement, v = a.doc, l = a.each, u = a.erase, d = a.extend; D = a.extendClass; var c = a.isArray, n = a.isNumber, y = a.isObject, t = a.merge; C = a.noop; var m = a.pick, b = a.pInt, q = a.SVGElement, z = a.SVGRenderer, F = a.win; a.svg || (C = {
            docMode8: v && 8 === v.documentMode, init: function (a, b) {
                var e = ["\x3c", b, ' filled\x3d"f" stroked\x3d"f"'],
                c = ["position: ", "absolute", ";"], k = "div" === b; ("shape" === b || k) && c.push("left:0;top:0;width:1px;height:1px;"); c.push("visibility: ", k ? "hidden" : "visible"); e.push(' style\x3d"', c.join(""), '"/\x3e'); b && (e = k || "span" === b || "img" === b ? e.join("") : a.prepVML(e), this.element = G(e)); this.renderer = a
            }, add: function (a) {
                var e = this.renderer, b = this.element, c = e.box, k = a && a.inverted, c = a ? a.element || a : c; a && (this.parentGroup = a); k && e.invertChild(b, c); c.appendChild(b); this.added = !0; this.alignOnAdd && !this.deferUpdateTransform && this.updateTransform();
                if (this.onAdd) this.onAdd(); this.className && this.attr("class", this.className); return this
            }, updateTransform: q.prototype.htmlUpdateTransform, setSpanRotation: function () { var a = this.rotation, b = Math.cos(a * f), c = Math.sin(a * f); I(this.element, { filter: a ? ["progid:DXImageTransform.Microsoft.Matrix(M11\x3d", b, ", M12\x3d", -c, ", M21\x3d", c, ", M22\x3d", b, ", sizingMethod\x3d'auto expand')"].join("") : "none" }) }, getSpanCorrection: function (a, b, c, q, k) {
                var e = q ? Math.cos(q * f) : 1, r = q ? Math.sin(q * f) : 0, x = m(this.elemHeight, this.element.offsetHeight),
                d; this.xCorr = 0 > e && -a; this.yCorr = 0 > r && -x; d = 0 > e * r; this.xCorr += r * b * (d ? 1 - c : c); this.yCorr -= e * b * (q ? d ? c : 1 - c : 1); k && "left" !== k && (this.xCorr -= a * c * (0 > e ? -1 : 1), q && (this.yCorr -= x * c * (0 > r ? -1 : 1)), I(this.element, { textAlign: k }))
            }, pathToVML: function (a) { for (var e = a.length, b = []; e--;) n(a[e]) ? b[e] = Math.round(10 * a[e]) - 5 : "Z" === a[e] ? b[e] = "x" : (b[e] = a[e], !a.isArc || "wa" !== a[e] && "at" !== a[e] || (b[e + 5] === b[e + 7] && (b[e + 7] += a[e + 7] > a[e + 5] ? 1 : -1), b[e + 6] === b[e + 8] && (b[e + 8] += a[e + 8] > a[e + 6] ? 1 : -1))); return b.join(" ") || "x" }, clip: function (a) {
                var e =
                this, b; a ? (b = a.members, u(b, e), b.push(e), e.destroyClip = function () { u(b, e) }, a = a.getCSS(e)) : (e.destroyClip && e.destroyClip(), a = { clip: e.docMode8 ? "inherit" : "rect(auto)" }); return e.css(a)
            }, css: q.prototype.htmlCss, safeRemoveChild: function (a) { a.parentNode && p(a) }, destroy: function () { this.destroyClip && this.destroyClip(); return q.prototype.destroy.apply(this) }, on: function (a, b) { this.element["on" + a] = function () { var a = F.event; a.target = a.srcElement; b(a) }; return this }, cutOffPath: function (a, c) {
                var e; a = a.split(/[ ,]/);
                e = a.length; if (9 === e || 11 === e) a[e - 4] = a[e - 2] = b(a[e - 2]) - 10 * c; return a.join(" ")
            }, shadow: function (a, c, q) {
                var e = [], k, r = this.element, d = this.renderer, x, n = r.style, g, B = r.path, l, t, z, f; B && "string" !== typeof B.value && (B = "x"); t = B; if (a) {
                    z = m(a.width, 3); f = (a.opacity || .15) / z; for (k = 1; 3 >= k; k++) l = 2 * z + 1 - 2 * k, q && (t = this.cutOffPath(B.value, l + .5)), g = ['\x3cshape isShadow\x3d"true" strokeweight\x3d"', l, '" filled\x3d"false" path\x3d"', t, '" coordsize\x3d"10 10" style\x3d"', r.style.cssText, '" /\x3e'], x = G(d.prepVML(g), null, {
                        left: b(n.left) +
                        m(a.offsetX, 1), top: b(n.top) + m(a.offsetY, 1)
                    }), q && (x.cutOff = l + 1), g = ['\x3cstroke color\x3d"', a.color || "#000000", '" opacity\x3d"', f * k, '"/\x3e'], G(d.prepVML(g), null, null, x), c ? c.element.appendChild(x) : r.parentNode.insertBefore(x, r), e.push(x); this.shadows = e
                } return this
            }, updateShadows: C, setAttr: function (a, b) { this.docMode8 ? this.element[a] = b : this.element.setAttribute(a, b) }, classSetter: function (a) { (this.added ? this.element : this).className = a }, dashstyleSetter: function (a, b, c) {
                (c.getElementsByTagName("stroke")[0] ||
                G(this.renderer.prepVML(["\x3cstroke/\x3e"]), null, null, c))[b] = a || "solid"; this[b] = a
            }, dSetter: function (a, b, c) { var e = this.shadows; a = a || []; this.d = a.join && a.join(" "); c.path = a = this.pathToVML(a); if (e) for (c = e.length; c--;) e[c].path = e[c].cutOff ? this.cutOffPath(a, e[c].cutOff) : a; this.setAttr(b, a) }, fillSetter: function (a, b, c) { var e = c.nodeName; "SPAN" === e ? c.style.color = a : "IMG" !== e && (c.filled = "none" !== a, this.setAttr("fillcolor", this.renderer.color(a, c, b, this))) }, "fill-opacitySetter": function (a, b, c) {
                G(this.renderer.prepVML(["\x3c",
                b.split("-")[0], ' opacity\x3d"', a, '"/\x3e']), null, null, c)
            }, opacitySetter: C, rotationSetter: function (a, b, c) { c = c.style; this[b] = c[b] = a; c.left = -Math.round(Math.sin(a * f) + 1) + "px"; c.top = Math.round(Math.cos(a * f)) + "px" }, strokeSetter: function (a, b, c) { this.setAttr("strokecolor", this.renderer.color(a, c, b, this)) }, "stroke-widthSetter": function (a, b, c) { c.stroked = !!a; this[b] = a; n(a) && (a += "px"); this.setAttr("strokeweight", a) }, titleSetter: function (a, b) { this.setAttr(b, a) }, visibilitySetter: function (a, b, c) {
                "inherit" === a &&
                (a = "visible"); this.shadows && l(this.shadows, function (c) { c.style[b] = a }); "DIV" === c.nodeName && (a = "hidden" === a ? "-999em" : 0, this.docMode8 || (c.style[b] = a ? "visible" : "hidden"), b = "top"); c.style[b] = a
            }, xSetter: function (a, b, c) { this[b] = a; "x" === b ? b = "left" : "y" === b && (b = "top"); this.updateClipping ? (this[b] = a, this.updateClipping()) : c.style[b] = a }, zIndexSetter: function (a, b, c) { c.style[b] = a }
        }, C["stroke-opacitySetter"] = C["fill-opacitySetter"], a.VMLElement = C = D(q, C), C.prototype.ySetter = C.prototype.widthSetter = C.prototype.heightSetter =
        C.prototype.xSetter, C = {
            Element: C, isIE8: -1 < F.navigator.userAgent.indexOf("MSIE 8.0"), init: function (a, b, c) {
                var e, k; this.alignedObjects = []; e = this.createElement("div").css({ position: "relative" }); k = e.element; a.appendChild(e.element); this.isVML = !0; this.box = k; this.boxWrapper = e; this.gradients = {}; this.cache = {}; this.cacheKeys = []; this.imgCount = 0; this.setSize(b, c, !1); if (!v.namespaces.hcv) {
                    v.namespaces.add("hcv", "urn:schemas-microsoft-com:vml"); try { v.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } " } catch (w) {
                        v.styleSheets[0].cssText +=
                        "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
                    }
                }
            }, isHidden: function () { return !this.box.offsetWidth }, clipRect: function (a, b, c, m) {
                var e = this.createElement(), r = y(a); return d(e, {
                    members: [], count: 0, left: (r ? a.x : a) + 1, top: (r ? a.y : b) + 1, width: (r ? a.width : c) - 1, height: (r ? a.height : m) - 1, getCSS: function (a) {
                        var b = a.element, c = b.nodeName, g = a.inverted, e = this.top - ("shape" === c ? b.offsetTop : 0), k = this.left, b = k + this.width, m = e + this.height, e = {
                            clip: "rect(" + Math.round(g ?
                                k : e) + "px," + Math.round(g ? m : b) + "px," + Math.round(g ? b : m) + "px," + Math.round(g ? e : k) + "px)"
                        }; !g && a.docMode8 && "DIV" === c && d(e, { width: b + "px", height: m + "px" }); return e
                    }, updateClipping: function () { l(e.members, function (a) { a.element && a.css(e.getCSS(a)) }) }
                })
            }, color: function (b, c, m, q) {
                var e = this, r, d = /^rgba/, n, x, g = "none"; b && b.linearGradient ? x = "gradient" : b && b.radialGradient && (x = "pattern"); if (x) {
                    var B, t, z = b.linearGradient || b.radialGradient, f, F, H, A, u, p = ""; b = b.stops; var h, y = [], v = function () {
                        n = ['\x3cfill colors\x3d"' + y.join(",") +
                        '" opacity\x3d"', H, '" o:opacity2\x3d"', F, '" type\x3d"', x, '" ', p, 'focus\x3d"100%" method\x3d"any" /\x3e']; G(e.prepVML(n), null, null, c)
                    }; f = b[0]; h = b[b.length - 1]; 0 < f[0] && b.unshift([0, f[1]]); 1 > h[0] && b.push([1, h[1]]); l(b, function (g, b) { d.test(g[1]) ? (r = a.color(g[1]), B = r.get("rgb"), t = r.get("a")) : (B = g[1], t = 1); y.push(100 * g[0] + "% " + B); b ? (H = t, A = B) : (F = t, u = B) }); if ("fill" === m) if ("gradient" === x) m = z.x1 || z[0] || 0, b = z.y1 || z[1] || 0, f = z.x2 || z[2] || 0, z = z.y2 || z[3] || 0, p = 'angle\x3d"' + (90 - 180 * Math.atan((z - b) / (f - m)) / Math.PI) + '"',
                    v(); else { var g = z.r, C = 2 * g, D = 2 * g, I = z.cx, U = z.cy, L = c.radialReference, T, g = function () { L && (T = q.getBBox(), I += (L[0] - T.x) / T.width - .5, U += (L[1] - T.y) / T.height - .5, C *= L[2] / T.width, D *= L[2] / T.height); p = 'src\x3d"' + a.getOptions().global.VMLRadialGradientURL + '" size\x3d"' + C + "," + D + '" origin\x3d"0.5,0.5" position\x3d"' + I + "," + U + '" color2\x3d"' + u + '" '; v() }; q.added ? g() : q.onAdd = g; g = A } else g = B
                } else d.test(b) && "IMG" !== c.tagName ? (r = a.color(b), q[m + "-opacitySetter"](r.get("a"), m, c), g = r.get("rgb")) : (g = c.getElementsByTagName(m),
                g.length && (g[0].opacity = 1, g[0].type = "solid"), g = b); return g
            }, prepVML: function (a) { var b = this.isIE8; a = a.join(""); b ? (a = a.replace("/\x3e", ' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'), a = -1 === a.indexOf('style\x3d"') ? a.replace("/\x3e", ' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e') : a.replace('style\x3d"', 'style\x3d"display:inline-block;behavior:url(#default#VML);')) : a = a.replace("\x3c", "\x3chcv:"); return a }, text: z.prototype.html, path: function (a) {
                var b = { coordsize: "10 10" }; c(a) ? b.d =
                    a : y(a) && d(b, a); return this.createElement("shape").attr(b)
            }, circle: function (a, b, c) { var e = this.symbol("circle"); y(a) && (c = a.r, b = a.y, a = a.x); e.isCircle = !0; e.r = c; return e.attr({ x: a, y: b }) }, g: function (a) { var b; a && (b = { className: "highcharts-" + a, "class": "highcharts-" + a }); return this.createElement("div").attr(b) }, image: function (a, b, c, m, k) { var e = this.createElement("img").attr({ src: a }); 1 < arguments.length && e.attr({ x: b, y: c, width: m, height: k }); return e }, createElement: function (a) {
                return "rect" === a ? this.symbol(a) : z.prototype.createElement.call(this,
                a)
            }, invertChild: function (a, c) { var e = this; c = c.style; var m = "IMG" === a.tagName && a.style; I(a, { flip: "x", left: b(c.width) - (m ? b(m.top) : 1), top: b(c.height) - (m ? b(m.left) : 1), rotation: -90 }); l(a.childNodes, function (b) { e.invertChild(b, a) }) }, symbols: {
                arc: function (a, b, c, m, k) {
                    var e = k.start, q = k.end, d = k.r || c || m; c = k.innerR; m = Math.cos(e); var r = Math.sin(e), g = Math.cos(q), B = Math.sin(q); if (0 === q - e) return ["x"]; e = ["wa", a - d, b - d, a + d, b + d, a + d * m, b + d * r, a + d * g, b + d * B]; k.open && !c && e.push("e", "M", a, b); e.push("at", a - c, b - c, a + c, b + c, a + c * g,
                    b + c * B, a + c * m, b + c * r, "x", "e"); e.isArc = !0; return e
                }, circle: function (a, b, c, m, k) { k && h(k.r) && (c = m = 2 * k.r); k && k.isCircle && (a -= c / 2, b -= m / 2); return ["wa", a, b, a + c, b + m, a + c, b + m / 2, a + c, b + m / 2, "e"] }, rect: function (a, b, c, m, k) { return z.prototype.symbols[h(k) && k.r ? "callout" : "square"].call(0, a, b, c, m, k) }
            }
        }, a.VMLRenderer = D = function () { this.init.apply(this, arguments) }, D.prototype = t(z.prototype, C), a.Renderer = D); z.prototype.measureSpanWidth = function (a, b) {
            var c = v.createElement("span"); a = v.createTextNode(a); c.appendChild(a); I(c,
            b); this.box.appendChild(c); b = c.offsetWidth; p(c); return b
        }
    })(L); (function (a) {
        function D() {
            var h = a.defaultOptions.global, l, u = h.useUTC, d = u ? "getUTC" : "get", c = u ? "setUTC" : "set"; a.Date = l = h.Date || p.Date; l.hcTimezoneOffset = u && h.timezoneOffset; l.hcGetTimezoneOffset = u && h.getTimezoneOffset; l.hcMakeTime = function (a, c, d, m, b, q) { var n; u ? (n = l.UTC.apply(0, arguments), n += I(n)) : n = (new l(a, c, f(d, 1), f(m, 0), f(b, 0), f(q, 0))).getTime(); return n }; G("Minutes Hours Day Date Month FullYear".split(" "), function (a) {
                l["hcGet" + a] = d +
                a
            }); G("Milliseconds Seconds Minutes Hours Date Month FullYear".split(" "), function (a) { l["hcSet" + a] = c + a })
        } var C = a.color, G = a.each, I = a.getTZOffset, h = a.merge, f = a.pick, p = a.win; a.defaultOptions = {
            colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "), symbols: ["circle", "diamond", "square", "triangle", "triangle-down"], lang: {
                loading: "Loading...", months: "January February March April May June July August September October November December".split(" "), shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
                weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), decimalPoint: ".", numericSymbols: "kMGTPE".split(""), resetZoom: "Reset zoom", resetZoomTitle: "Reset zoom level 1:1", thousandsSep: " "
            }, global: { useUTC: !0, VMLRadialGradientURL: "http://code.highcharts.com/5.0.6/gfx/vml-radial-gradient.png" }, chart: {
                borderRadius: 0, defaultSeriesType: "line", ignoreHiddenSeries: !0, spacing: [10, 10, 15, 10], resetZoomButton: { theme: { zIndex: 20 }, position: { align: "right", x: -10, y: 10 } }, width: null, height: null, borderColor: "#335cad",
                backgroundColor: "#ffffff", plotBorderColor: "#cccccc"
            }, title: { text: "Chart title", align: "center", margin: 15, widthAdjust: -44 }, subtitle: { text: "", align: "center", widthAdjust: -44 }, plotOptions: {}, labels: { style: { position: "absolute", color: "#333333" } }, legend: {
                enabled: !0, align: "center", layout: "horizontal", labelFormatter: function () { return this.name }, borderColor: "#999999", borderRadius: 0, navigation: { activeColor: "#003399", inactiveColor: "#cccccc" }, itemStyle: { color: "#333333", fontSize: "12px", fontWeight: "bold" }, itemHoverStyle: { color: "#000000" },
                itemHiddenStyle: { color: "#cccccc" }, shadow: !1, itemCheckboxStyle: { position: "absolute", width: "13px", height: "13px" }, squareSymbol: !0, symbolPadding: 5, verticalAlign: "bottom", x: 0, y: 0, title: { style: { fontWeight: "bold" } }
            }, loading: { labelStyle: { fontWeight: "bold", position: "relative", top: "45%" }, style: { position: "absolute", backgroundColor: "#ffffff", opacity: .5, textAlign: "center" } }, tooltip: {
                enabled: !0, animation: a.svg, borderRadius: 3, dateTimeLabelFormats: {
                    millisecond: "%A, %b %e, %H:%M:%S.%L", second: "%A, %b %e, %H:%M:%S",
                    minute: "%A, %b %e, %H:%M", hour: "%A, %b %e, %H:%M", day: "%A, %b %e, %Y", week: "Week from %A, %b %e, %Y", month: "%B %Y", year: "%Y"
                }, footerFormat: "", padding: 8, snap: a.isTouchDevice ? 25 : 10, backgroundColor: C("#f7f7f7").setOpacity(.85).get(), borderWidth: 1, headerFormat: '\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e', pointFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e', shadow: !0, style: {
                    color: "#333333", cursor: "default",
                    fontSize: "12px", pointerEvents: "none", whiteSpace: "nowrap"
                }
            }, credits: { enabled: !0, href: "", position: { align: "right", x: -10, verticalAlign: "bottom", y: -5 }, style: { cursor: "pointer", color: "#999999", fontSize: "9px" }, text: "" }
        }; a.setOptions = function (f) { a.defaultOptions = h(!0, a.defaultOptions, f); D(); return a.defaultOptions }; a.getOptions = function () { return a.defaultOptions }; a.defaultPlotOptions = a.defaultOptions.plotOptions; D()
    })(L); (function (a) {
        var D = a.arrayMax, C = a.arrayMin, G = a.defined,
        I = a.destroyObjectProperties, h = a.each, f = a.erase, p = a.merge, v = a.pick; a.PlotLineOrBand = function (a, f) { this.axis = a; f && (this.options = f, this.id = f.id) }; a.PlotLineOrBand.prototype = {
            render: function () {
                var a = this, f = a.axis, d = f.horiz, c = a.options, n = c.label, h = a.label, t = c.to, m = c.from, b = c.value, q = G(m) && G(t), z = G(b), F = a.svgElem, e = !F, r = [], x, A = c.color, k = v(c.zIndex, 0), w = c.events, r = { "class": "highcharts-plot-" + (q ? "band " : "line ") + (c.className || "") }, K = {}, J = f.chart.renderer, N = q ? "bands" : "lines", g = f.log2lin; f.isLog && (m = g(m), t =
                g(t), b = g(b)); z ? (r = { stroke: A, "stroke-width": c.width }, c.dashStyle && (r.dashstyle = c.dashStyle)) : q && (A && (r.fill = A), c.borderWidth && (r.stroke = c.borderColor, r["stroke-width"] = c.borderWidth)); K.zIndex = k; N += "-" + k; (A = f[N]) || (f[N] = A = J.g("plot-" + N).attr(K).add()); e && (a.svgElem = F = J.path().attr(r).add(A)); if (z) r = f.getPlotLinePath(b, F.strokeWidth()); else if (q) r = f.getPlotBandPath(m, t, c); else return; if (e && r && r.length) { if (F.attr({ d: r }), w) for (x in c = function (g) { F.on(g, function (b) { w[g].apply(a, [b]) }) }, w) c(x) } else F &&
                (r ? (F.show(), F.animate({ d: r })) : (F.hide(), h && (a.label = h = h.destroy()))); n && G(n.text) && r && r.length && 0 < f.width && 0 < f.height && !r.flat ? (n = p({ align: d && q && "center", x: d ? !q && 4 : 10, verticalAlign: !d && q && "middle", y: d ? q ? 16 : 10 : q ? 6 : -4, rotation: d && !q && 90 }, n), this.renderLabel(n, r, q, k)) : h && h.hide(); return a
            }, renderLabel: function (a, f, d, c) {
                var n = this.label, l = this.axis.chart.renderer; n || (n = { align: a.textAlign || a.align, rotation: a.rotation, "class": "highcharts-plot-" + (d ? "band" : "line") + "-label " + (a.className || "") }, n.zIndex = c,
                this.label = n = l.text(a.text, 0, 0, a.useHTML).attr(n).add(), n.css(a.style)); c = [f[1], f[4], d ? f[6] : f[1]]; f = [f[2], f[5], d ? f[7] : f[2]]; d = C(c); l = C(f); n.align(a, !1, { x: d, y: l, width: D(c) - d, height: D(f) - l }); n.show()
            }, destroy: function () { f(this.axis.plotLinesAndBands, this); delete this.axis; I(this) }
        }; a.AxisPlotLineOrBandExtension = {
            getPlotBandPath: function (a, f) {
                f = this.getPlotLinePath(f, null, null, !0); (a = this.getPlotLinePath(a, null, null, !0)) && f ? (a.flat = a.toString() === f.toString(), a.push(f[4], f[5], f[1], f[2], "z")) : a = null;
                return a
            }, addPlotBand: function (a) { return this.addPlotBandOrLine(a, "plotBands") }, addPlotLine: function (a) { return this.addPlotBandOrLine(a, "plotLines") }, addPlotBandOrLine: function (f, h) { var d = (new a.PlotLineOrBand(this, f)).render(), c = this.userOptions; d && (h && (c[h] = c[h] || [], c[h].push(f)), this.plotLinesAndBands.push(d)); return d }, removePlotBandOrLine: function (a) {
                for (var l = this.plotLinesAndBands, d = this.options, c = this.userOptions, n = l.length; n--;) l[n].id === a && l[n].destroy(); h([d.plotLines || [], c.plotLines ||
                [], d.plotBands || [], c.plotBands || []], function (c) { for (n = c.length; n--;) c[n].id === a && f(c, c[n]) })
            }
        }
    })(L); (function (a) {
        var D = a.correctFloat, C = a.defined, G = a.destroyObjectProperties, I = a.isNumber, h = a.merge, f = a.pick, p = a.deg2rad; a.Tick = function (a, f, h, d) { this.axis = a; this.pos = f; this.type = h || ""; this.isNew = !0; h || d || this.addLabel() }; a.Tick.prototype = {
            addLabel: function () {
                var a = this.axis, l = a.options, p = a.chart, d = a.categories, c = a.names, n = this.pos, y = l.labels, t = a.tickPositions, m = n === t[0], b = n === t[t.length - 1], c = d ? f(d[n],
                c[n], n) : n, d = this.label, t = t.info, q; a.isDatetimeAxis && t && (q = l.dateTimeLabelFormats[t.higherRanks[n] || t.unitName]); this.isFirst = m; this.isLast = b; l = a.labelFormatter.call({ axis: a, chart: p, isFirst: m, isLast: b, dateTimeLabelFormat: q, value: a.isLog ? D(a.lin2log(c)) : c }); C(d) ? d && d.attr({ text: l }) : (this.labelLength = (this.label = d = C(l) && y.enabled ? p.renderer.text(l, 0, 0, y.useHTML).css(h(y.style)).add(a.labelGroup) : null) && d.getBBox().width, this.rotation = 0)
            }, getLabelSize: function () {
                return this.label ? this.label.getBBox()[this.axis.horiz ?
                "height" : "width"] : 0
            }, handleOverflow: function (a) {
                var l = this.axis, h = a.x, d = l.chart.chartWidth, c = l.chart.spacing, n = f(l.labelLeft, Math.min(l.pos, c[3])), c = f(l.labelRight, Math.max(l.pos + l.len, d - c[1])), y = this.label, t = this.rotation, m = { left: 0, center: .5, right: 1 }[l.labelAlign], b = y.getBBox().width, q = l.getSlotWidth(), z = q, F = 1, e, r = {}; if (t) 0 > t && h - m * b < n ? e = Math.round(h / Math.cos(t * p) - n) : 0 < t && h + m * b > c && (e = Math.round((d - h) / Math.cos(t * p))); else if (d = h + (1 - m) * b, h - m * b < n ? z = a.x + z * (1 - m) - n : d > c && (z = c - a.x + z * m, F = -1), z = Math.min(q,
                z), z < q && "center" === l.labelAlign && (a.x += F * (q - z - m * (q - Math.min(b, z)))), b > z || l.autoRotation && (y.styles || {}).width) e = z; e && (r.width = e, (l.options.labels.style || {}).textOverflow || (r.textOverflow = "ellipsis"), y.css(r))
            }, getPosition: function (a, f, h, d) {
                var c = this.axis, n = c.chart, l = d && n.oldChartHeight || n.chartHeight; return {
                    x: a ? c.translate(f + h, null, null, d) + c.transB : c.left + c.offset + (c.opposite ? (d && n.oldChartWidth || n.chartWidth) - c.right - c.left : 0), y: a ? l - c.bottom + c.offset - (c.opposite ? c.height : 0) : l - c.translate(f + h, null,
                    null, d) - c.transB
                }
            }, getLabelPosition: function (a, f, h, d, c, n, y, t) { var m = this.axis, b = m.transA, q = m.reversed, z = m.staggerLines, l = m.tickRotCorr || { x: 0, y: 0 }, e = c.y; C(e) || (e = 0 === m.side ? h.rotation ? -8 : -h.getBBox().height : 2 === m.side ? l.y + 8 : Math.cos(h.rotation * p) * (l.y - h.getBBox(!1, 0).height / 2)); a = a + c.x + l.x - (n && d ? n * b * (q ? -1 : 1) : 0); f = f + e - (n && !d ? n * b * (q ? 1 : -1) : 0); z && (h = y / (t || 1) % z, m.opposite && (h = z - h - 1), f += m.labelOffset / z * h); return { x: a, y: Math.round(f) } }, getMarkPath: function (a, f, h, d, c, n) {
                return n.crispLine(["M", a, f, "L", a + (c ?
                0 : -h), f + (c ? h : 0)], d)
            }, render: function (a, l, h) {
                var d = this.axis, c = d.options, n = d.chart.renderer, p = d.horiz, t = this.type, m = this.label, b = this.pos, q = c.labels, z = this.gridLine, F = t ? t + "Tick" : "tick", e = d.tickSize(F), r = this.mark, x = !r, A = q.step, k = {}, w = !0, K = d.tickmarkOffset, J = this.getPosition(p, b, K, l), u = J.x, J = J.y, g = p && u === d.pos + d.len || !p && J === d.pos ? -1 : 1, B = t ? t + "Grid" : "grid", S = c[B + "LineWidth"], M = c[B + "LineColor"], v = c[B + "LineDashStyle"], B = f(c[F + "Width"], !t && d.isXAxis ? 1 : 0), F = c[F + "Color"]; h = f(h, 1); this.isActive = !0; z || (k.stroke =
                M, k["stroke-width"] = S, v && (k.dashstyle = v), t || (k.zIndex = 1), l && (k.opacity = 0), this.gridLine = z = n.path().attr(k).addClass("highcharts-" + (t ? t + "-" : "") + "grid-line").add(d.gridGroup)); if (!l && z && (b = d.getPlotLinePath(b + K, z.strokeWidth() * g, l, !0))) z[this.isNew ? "attr" : "animate"]({ d: b, opacity: h }); e && (d.opposite && (e[0] = -e[0]), x && (this.mark = r = n.path().addClass("highcharts-" + (t ? t + "-" : "") + "tick").add(d.axisGroup), r.attr({ stroke: F, "stroke-width": B })), r[x ? "attr" : "animate"]({
                    d: this.getMarkPath(u, J, e[0], r.strokeWidth() *
                    g, p, n), opacity: h
                })); m && I(u) && (m.xy = J = this.getLabelPosition(u, J, m, p, q, K, a, A), this.isFirst && !this.isLast && !f(c.showFirstLabel, 1) || this.isLast && !this.isFirst && !f(c.showLastLabel, 1) ? w = !1 : !p || d.isRadial || q.step || q.rotation || l || 0 === h || this.handleOverflow(J), A && a % A && (w = !1), w && I(J.y) ? (J.opacity = h, m[this.isNew ? "attr" : "animate"](J)) : m.attr("y", -9999), this.isNew = !1)
            }, destroy: function () { G(this, this.axis) }
        }
    })(L); (function (a) {
        var D = a.addEvent, C = a.animObject, G = a.arrayMax, I = a.arrayMin, h = a.AxisPlotLineOrBandExtension,
        f = a.color, p = a.correctFloat, v = a.defaultOptions, l = a.defined, u = a.deg2rad, d = a.destroyObjectProperties, c = a.each, n = a.extend, y = a.fireEvent, t = a.format, m = a.getMagnitude, b = a.grep, q = a.inArray, z = a.isArray, F = a.isNumber, e = a.isString, r = a.merge, x = a.normalizeTickInterval, A = a.pick, k = a.PlotLineOrBand, w = a.removeEvent, K = a.splat, J = a.syncTimeout, N = a.Tick; a.Axis = function () { this.init.apply(this, arguments) }; a.Axis.prototype = {
            defaultOptions: {
                dateTimeLabelFormats: {
                    millisecond: "%H:%M:%S.%L", second: "%H:%M:%S", minute: "%H:%M", hour: "%H:%M",
                    day: "%e. %b", week: "%e. %b", month: "%b '%y", year: "%Y"
                }, endOnTick: !1, labels: { enabled: !0, style: { color: "#666666", cursor: "default", fontSize: "11px" }, x: 0 }, minPadding: .01, maxPadding: .01, minorTickLength: 2, minorTickPosition: "outside", startOfWeek: 1, startOnTick: !1, tickLength: 10, tickmarkPlacement: "between", tickPixelInterval: 100, tickPosition: "outside", title: { align: "middle", style: { color: "#666666" } }, type: "linear", minorGridLineColor: "#f2f2f2", minorGridLineWidth: 1, minorTickColor: "#999999", lineColor: "#ccd6eb", lineWidth: 1,
                gridLineColor: "#e6e6e6", tickColor: "#ccd6eb"
            }, defaultYAxisOptions: { endOnTick: !0, tickPixelInterval: 72, showLastLabel: !0, labels: { x: -8 }, maxPadding: .05, minPadding: .05, startOnTick: !0, title: { rotation: 270, text: "Values" }, stackLabels: { enabled: !1, formatter: function () { return a.numberFormat(this.total, -1) }, style: { fontSize: "11px", fontWeight: "bold", color: "#000000", textOutline: "1px contrast" } }, gridLineWidth: 1, lineWidth: 0 }, defaultLeftAxisOptions: { labels: { x: -15 }, title: { rotation: 270 } }, defaultRightAxisOptions: {
                labels: { x: 15 },
                title: { rotation: 90 }
            }, defaultBottomAxisOptions: { labels: { autoRotation: [-45], x: 0 }, title: { rotation: 0 } }, defaultTopAxisOptions: { labels: { autoRotation: [-45], x: 0 }, title: { rotation: 0 } }, init: function (a, b) {
                var g = b.isX; this.chart = a; this.horiz = a.inverted ? !g : g; this.isXAxis = g; this.coll = this.coll || (g ? "xAxis" : "yAxis"); this.opposite = b.opposite; this.side = b.side || (this.horiz ? this.opposite ? 0 : 2 : this.opposite ? 1 : 3); this.setOptions(b); var c = this.options, e = c.type; this.labelFormatter = c.labels.formatter || this.defaultLabelFormatter;
                this.userOptions = b; this.minPixelPadding = 0; this.reversed = c.reversed; this.visible = !1 !== c.visible; this.zoomEnabled = !1 !== c.zoomEnabled; this.hasNames = "category" === e || !0 === c.categories; this.categories = c.categories || this.hasNames; this.names = this.names || []; this.isLog = "logarithmic" === e; this.isDatetimeAxis = "datetime" === e; this.isLinked = l(c.linkedTo); this.ticks = {}; this.labelEdge = []; this.minorTicks = {}; this.plotLinesAndBands = []; this.alternateBands = {}; this.len = 0; this.minRange = this.userMinRange = c.minRange || c.maxZoom;
                this.range = c.range; this.offset = c.offset || 0; this.stacks = {}; this.oldStacks = {}; this.stacksTouched = 0; this.min = this.max = null; this.crosshair = A(c.crosshair, K(a.options.tooltip.crosshairs)[g ? 0 : 1], !1); var k; b = this.options.events; -1 === q(this, a.axes) && (g ? a.axes.splice(a.xAxis.length, 0, this) : a.axes.push(this), a[this.coll].push(this)); this.series = this.series || []; a.inverted && g && void 0 === this.reversed && (this.reversed = !0); this.removePlotLine = this.removePlotBand = this.removePlotBandOrLine; for (k in b) D(this, k, b[k]);
                this.isLog && (this.val2lin = this.log2lin, this.lin2val = this.lin2log)
            }, setOptions: function (a) { this.options = r(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], r(v[this.coll], a)) }, defaultLabelFormatter: function () {
                var g = this.axis, b = this.value, c = g.categories, e = this.dateTimeLabelFormat, k = v.lang, m = k.numericSymbols, k = k.numericSymbolMagnitude || 1E3, q = m && m.length, d, r = g.options.labels.format,
                g = g.isLog ? b : g.tickInterval; if (r) d = t(r, this); else if (c) d = b; else if (e) d = a.dateFormat(e, b); else if (q && 1E3 <= g) for (; q-- && void 0 === d;) c = Math.pow(k, q + 1), g >= c && 0 === 10 * b % c && null !== m[q] && 0 !== b && (d = a.numberFormat(b / c, -1) + m[q]); void 0 === d && (d = 1E4 <= Math.abs(b) ? a.numberFormat(b, -1) : a.numberFormat(b, -1, void 0, "")); return d
            }, getSeriesExtremes: function () {
                var a = this, e = a.chart; a.hasVisibleSeries = !1; a.dataMin = a.dataMax = a.threshold = null; a.softThreshold = !a.isXAxis; a.buildStacks && a.buildStacks(); c(a.series, function (g) {
                    if (g.visible ||
                    !e.options.chart.ignoreHiddenSeries) {
                        var c = g.options, k = c.threshold, B; a.hasVisibleSeries = !0; a.isLog && 0 >= k && (k = null); if (a.isXAxis) c = g.xData, c.length && (g = I(c), F(g) || g instanceof Date || (c = b(c, function (a) { return F(a) }), g = I(c)), a.dataMin = Math.min(A(a.dataMin, c[0]), g), a.dataMax = Math.max(A(a.dataMax, c[0]), G(c))); else if (g.getExtremes(), B = g.dataMax, g = g.dataMin, l(g) && l(B) && (a.dataMin = Math.min(A(a.dataMin, g), g), a.dataMax = Math.max(A(a.dataMax, B), B)), l(k) && (a.threshold = k), !c.softThreshold || a.isLog) a.softThreshold =
                        !1
                    }
                })
            }, translate: function (a, b, c, e, k, m) { var g = this.linkedParent || this, B = 1, q = 0, d = e ? g.oldTransA : g.transA; e = e ? g.oldMin : g.min; var r = g.minPixelPadding; k = (g.isOrdinal || g.isBroken || g.isLog && k) && g.lin2val; d || (d = g.transA); c && (B *= -1, q = g.len); g.reversed && (B *= -1, q -= B * (g.sector || g.len)); b ? (a = (a * B + q - r) / d + e, k && (a = g.lin2val(a))) : (k && (a = g.val2lin(a)), a = B * (a - e) * d + q + B * r + (F(m) ? d * m : 0)); return a }, toPixels: function (a, b) { return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos) }, toValue: function (a, b) {
                return this.translate(a -
                (b ? 0 : this.pos), !0, !this.horiz, null, !0)
            }, getPlotLinePath: function (a, b, c, e, k) {
                var g = this.chart, B = this.left, m = this.top, q, d, r = c && g.oldChartHeight || g.chartHeight, n = c && g.oldChartWidth || g.chartWidth, f; q = this.transB; var w = function (a, g, b) { if (a < g || a > b) e ? a = Math.min(Math.max(g, a), b) : f = !0; return a }; k = A(k, this.translate(a, null, null, c)); a = c = Math.round(k + q); q = d = Math.round(r - k - q); F(k) ? this.horiz ? (q = m, d = r - this.bottom, a = c = w(a, B, B + this.width)) : (a = B, c = n - this.right, q = d = w(q, m, m + this.height)) : f = !0; return f && !e ? null : g.renderer.crispLine(["M",
                a, q, "L", c, d], b || 1)
            }, getLinearTickPositions: function (a, b, c) { var g, k = p(Math.floor(b / a) * a), e = p(Math.ceil(c / a) * a), B = []; if (b === c && F(b)) return [b]; for (b = k; b <= e;) { B.push(b); b = p(b + a); if (b === g) break; g = b } return B }, getMinorTickPositions: function () {
                var a = this.options, b = this.tickPositions, c = this.minorTickInterval, k = [], e, m = this.pointRangePadding || 0; e = this.min - m; var m = this.max + m, q = m - e; if (q && q / c < this.len / 3) if (this.isLog) for (m = b.length, e = 1; e < m; e++) k = k.concat(this.getLogTickPositions(c, b[e - 1], b[e], !0)); else if (this.isDatetimeAxis &&
                "auto" === a.minorTickInterval) k = k.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c), e, m, a.startOfWeek)); else for (b = e + (b[0] - e) % c; b <= m && b !== k[0]; b += c) k.push(b); 0 !== k.length && this.trimTicks(k, a.startOnTick, a.endOnTick); return k
            }, adjustForMinRange: function () {
                var a = this.options, b = this.min, k = this.max, e, m = this.dataMax - this.dataMin >= this.minRange, q, d, r, f, n, w; this.isXAxis && void 0 === this.minRange && !this.isLog && (l(a.min) || l(a.max) ? this.minRange = null : (c(this.series, function (a) {
                    f = a.xData; for (d = n = a.xIncrement ?
                    1 : f.length - 1; 0 < d; d--) if (r = f[d] - f[d - 1], void 0 === q || r < q) q = r
                }), this.minRange = Math.min(5 * q, this.dataMax - this.dataMin))); k - b < this.minRange && (w = this.minRange, e = (w - k + b) / 2, e = [b - e, A(a.min, b - e)], m && (e[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin), b = G(e), k = [b + w, A(a.max, b + w)], m && (k[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax), k = I(k), k - b < w && (e[0] = k - w, e[1] = A(a.min, k - w), b = G(e))); this.min = b; this.max = k
            }, getClosest: function () {
                var a; this.categories ? a = 1 : c(this.series, function (b) {
                    var g = b.closestPointRange,
                    c = b.visible || !b.chart.options.chart.ignoreHiddenSeries; !b.noSharedTooltip && l(g) && c && (a = l(a) ? Math.min(a, g) : g)
                }); return a
            }, nameToX: function (a) { var b = z(this.categories), g = b ? this.categories : this.names, c = a.options.x, k; a.series.requireSorting = !1; l(c) || (c = !1 === this.options.uniqueNames ? a.series.autoIncrement() : q(a.name, g)); -1 === c ? b || (k = g.length) : k = c; this.names[k] = a.name; return k }, updateNames: function () {
                var a = this; 0 < this.names.length && (this.names.length = 0, this.minRange = void 0, c(this.series || [], function (b) {
                    b.xIncrement =
                    null; if (!b.points || b.isDirtyData) b.processData(), b.generatePoints(); c(b.points, function (g, c) { var k; g.options && void 0 === g.options.x && (k = a.nameToX(g), k !== g.x && (g.x = k, b.xData[c] = k)) })
                }))
            }, setAxisTranslation: function (a) {
                var b = this, g = b.max - b.min, k = b.axisPointRange || 0, m, q = 0, d = 0, r = b.linkedParent, f = !!b.categories, n = b.transA, w = b.isXAxis; if (w || f || k) m = b.getClosest(), r ? (q = r.minPointOffset, d = r.pointRangePadding) : c(b.series, function (a) {
                    var g = f ? 1 : w ? A(a.options.pointRange, m, 0) : b.axisPointRange || 0; a = a.options.pointPlacement;
                    k = Math.max(k, g); b.single || (q = Math.max(q, e(a) ? 0 : g / 2), d = Math.max(d, "on" === a ? 0 : g))
                }), r = b.ordinalSlope && m ? b.ordinalSlope / m : 1, b.minPointOffset = q *= r, b.pointRangePadding = d *= r, b.pointRange = Math.min(k, g), w && (b.closestPointRange = m); a && (b.oldTransA = n); b.translationSlope = b.transA = n = b.len / (g + d || 1); b.transB = b.horiz ? b.left : b.bottom; b.minPixelPadding = n * q
            }, minFromRange: function () { return this.max - this.range }, setTickInterval: function (b) {
                var g = this, k = g.chart, e = g.options, q = g.isLog, d = g.log2lin, r = g.isDatetimeAxis, f = g.isXAxis,
                n = g.isLinked, w = e.maxPadding, t = e.minPadding, z = e.tickInterval, h = e.tickPixelInterval, K = g.categories, J = g.threshold, u = g.softThreshold, N, v, C, D; r || K || n || this.getTickAmount(); C = A(g.userMin, e.min); D = A(g.userMax, e.max); n ? (g.linkedParent = k[g.coll][e.linkedTo], k = g.linkedParent.getExtremes(), g.min = A(k.min, k.dataMin), g.max = A(k.max, k.dataMax), e.type !== g.linkedParent.options.type && a.error(11, 1)) : (!u && l(J) && (g.dataMin >= J ? (N = J, t = 0) : g.dataMax <= J && (v = J, w = 0)), g.min = A(C, N, g.dataMin), g.max = A(D, v, g.dataMax)); q && (!b && 0 >=
                Math.min(g.min, A(g.dataMin, g.min)) && a.error(10, 1), g.min = p(d(g.min), 15), g.max = p(d(g.max), 15)); g.range && l(g.max) && (g.userMin = g.min = C = Math.max(g.min, g.minFromRange()), g.userMax = D = g.max, g.range = null); y(g, "foundExtremes"); g.beforePadding && g.beforePadding(); g.adjustForMinRange(); !(K || g.axisPointRange || g.usePercentage || n) && l(g.min) && l(g.max) && (d = g.max - g.min) && (!l(C) && t && (g.min -= d * t), !l(D) && w && (g.max += d * w)); F(e.floor) ? g.min = Math.max(g.min, e.floor) : F(e.softMin) && (g.min = Math.min(g.min, e.softMin)); F(e.ceiling) ?
                g.max = Math.min(g.max, e.ceiling) : F(e.softMax) && (g.max = Math.max(g.max, e.softMax)); u && l(g.dataMin) && (J = J || 0, !l(C) && g.min < J && g.dataMin >= J ? g.min = J : !l(D) && g.max > J && g.dataMax <= J && (g.max = J)); g.tickInterval = g.min === g.max || void 0 === g.min || void 0 === g.max ? 1 : n && !z && h === g.linkedParent.options.tickPixelInterval ? z = g.linkedParent.tickInterval : A(z, this.tickAmount ? (g.max - g.min) / Math.max(this.tickAmount - 1, 1) : void 0, K ? 1 : (g.max - g.min) * h / Math.max(g.len, h)); f && !b && c(g.series, function (a) {
                    a.processData(g.min !== g.oldMin || g.max !==
                    g.oldMax)
                }); g.setAxisTranslation(!0); g.beforeSetTickPositions && g.beforeSetTickPositions(); g.postProcessTickInterval && (g.tickInterval = g.postProcessTickInterval(g.tickInterval)); g.pointRange && !z && (g.tickInterval = Math.max(g.pointRange, g.tickInterval)); b = A(e.minTickInterval, g.isDatetimeAxis && g.closestPointRange); !z && g.tickInterval < b && (g.tickInterval = b); r || q || z || (g.tickInterval = x(g.tickInterval, null, m(g.tickInterval), A(e.allowDecimals, !(.5 < g.tickInterval && 5 > g.tickInterval && 1E3 < g.max && 9999 > g.max)), !!this.tickAmount));
                this.tickAmount || (g.tickInterval = g.unsquish()); this.setTickPositions()
            }, setTickPositions: function () {
                var a = this.options, b, c = a.tickPositions, k = a.tickPositioner, e = a.startOnTick, m = a.endOnTick, q; this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0; this.minorTickInterval = "auto" === a.minorTickInterval && this.tickInterval ? this.tickInterval / 5 : a.minorTickInterval; this.tickPositions = b = c && c.slice(); !b && (b = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,
                a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval, this.min, this.max), b.length > this.len && (b = [b[0], b.pop()]), this.tickPositions = b, k && (k = k.apply(this, [this.min, this.max]))) && (this.tickPositions = b = k); this.isLinked || (this.trimTicks(b, e, m), this.min === this.max && l(this.min) && !this.tickAmount && (q = !0, this.min -= .5, this.max += .5), this.single = q, c || k || this.adjustTickAmount())
            },
            trimTicks: function (a, b, c) { var g = a[0], k = a[a.length - 1], e = this.minPointOffset || 0; if (b) this.min = g; else for (; this.min - e > a[0];) a.shift(); if (c) this.max = k; else for (; this.max + e < a[a.length - 1];) a.pop(); 0 === a.length && l(g) && a.push((k + g) / 2) }, alignToOthers: function () { var a = {}, b, k = this.options; !1 === this.chart.options.chart.alignTicks || !1 === k.alignTicks || this.isLog || c(this.chart[this.coll], function (g) { var c = g.options, c = [g.horiz ? c.left : c.top, c.width, c.height, c.pane].join(); g.series.length && (a[c] ? b = !0 : a[c] = 1) }); return b },
            getTickAmount: function () { var a = this.options, b = a.tickAmount, c = a.tickPixelInterval; !l(a.tickInterval) && this.len < c && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2); !b && this.alignToOthers() && (b = Math.ceil(this.len / c) + 1); 4 > b && (this.finalTickAmt = b, b = 5); this.tickAmount = b }, adjustTickAmount: function () {
                var a = this.tickInterval, b = this.tickPositions, c = this.tickAmount, k = this.finalTickAmt, e = b && b.length; if (e < c) {
                    for (; b.length < c;) b.push(p(b[b.length - 1] + a)); this.transA *= (e - 1) / (c - 1); this.max = b[b.length -
                    1]
                } else e > c && (this.tickInterval *= 2, this.setTickPositions()); if (l(k)) { for (a = c = b.length; a--;) (3 === k && 1 === a % 2 || 2 >= k && 0 < a && a < c - 1) && b.splice(a, 1); this.finalTickAmt = void 0 }
            }, setScale: function () {
                var a, b; this.oldMin = this.min; this.oldMax = this.max; this.oldAxisLength = this.len; this.setAxisSize(); b = this.len !== this.oldAxisLength; c(this.series, function (b) { if (b.isDirtyData || b.isDirty || b.xAxis.isDirty) a = !0 }); b || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ?
                (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = b || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && this.cleanStacks()
            }, setExtremes: function (a, b, k, e, m) { var g = this, q = g.chart; k = A(k, !0); c(g.series, function (a) { delete a.kdTree }); m = n(m, { min: a, max: b }); y(g, "setExtremes", m, function () { g.userMin = a; g.userMax = b; g.eventArgs = m; k && q.redraw(e) }) }, zoom: function (a,
            b) { var g = this.dataMin, c = this.dataMax, k = this.options, e = Math.min(g, A(k.min, g)), k = Math.max(c, A(k.max, c)); if (a !== this.min || b !== this.max) this.allowZoomOutside || (l(g) && (a < e && (a = e), a > k && (a = k)), l(c) && (b < e && (b = e), b > k && (b = k))), this.displayBtn = void 0 !== a || void 0 !== b, this.setExtremes(a, b, !1, void 0, { trigger: "zoom" }); return !0 }, setAxisSize: function () {
                var a = this.chart, b = this.options, c = b.offsetLeft || 0, k = this.horiz, e = A(b.width, a.plotWidth - c + (b.offsetRight || 0)), m = A(b.height, a.plotHeight), q = A(b.top, a.plotTop), b = A(b.left,
                a.plotLeft + c), c = /%$/; c.test(m) && (m = Math.round(parseFloat(m) / 100 * a.plotHeight)); c.test(q) && (q = Math.round(parseFloat(q) / 100 * a.plotHeight + a.plotTop)); this.left = b; this.top = q; this.width = e; this.height = m; this.bottom = a.chartHeight - m - q; this.right = a.chartWidth - e - b; this.len = Math.max(k ? e : m, 0); this.pos = k ? b : q
            }, getExtremes: function () { var a = this.isLog, b = this.lin2log; return { min: a ? p(b(this.min)) : this.min, max: a ? p(b(this.max)) : this.max, dataMin: this.dataMin, dataMax: this.dataMax, userMin: this.userMin, userMax: this.userMax } },
            getThreshold: function (a) { var b = this.isLog, g = this.lin2log, c = b ? g(this.min) : this.min, b = b ? g(this.max) : this.max; null === a ? a = c : c > a ? a = c : b < a && (a = b); return this.translate(a, 0, 1, 0, 1) }, autoLabelAlign: function (a) { a = (A(a, 0) - 90 * this.side + 720) % 360; return 15 < a && 165 > a ? "right" : 195 < a && 345 > a ? "left" : "center" }, tickSize: function (a) { var b = this.options, g = b[a + "Length"], c = A(b[a + "Width"], "tick" === a && this.isXAxis ? 1 : 0); if (c && g) return "inside" === b[a + "Position"] && (g = -g), [g, c] }, labelMetrics: function () {
                return this.chart.renderer.fontMetrics(this.options.labels.style &&
                this.options.labels.style.fontSize, this.ticks[0] && this.ticks[0].label)
            }, unsquish: function () {
                var a = this.options.labels, b = this.horiz, k = this.tickInterval, e = k, m = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / k), q, d = a.rotation, r = this.labelMetrics(), f, n = Number.MAX_VALUE, w, t = function (a) { a /= m || 1; a = 1 < a ? Math.ceil(a) : 1; return a * k }; b ? (w = !a.staggerLines && !a.step && (l(d) ? [d] : m < A(a.autoRotationLimit, 80) && a.autoRotation)) && c(w, function (a) {
                    var b; if (a === d || a && -90 <= a && 90 >= a) f = t(Math.abs(r.h / Math.sin(u * a))), b = f +
                    Math.abs(a / 360), b < n && (n = b, q = a, e = f)
                }) : a.step || (e = t(r.h)); this.autoRotation = w; this.labelRotation = A(q, d); return e
            }, getSlotWidth: function () { var a = this.chart, b = this.horiz, c = this.options.labels, k = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1), e = a.margin[3]; return b && 2 > (c.step || 0) && !c.rotation && (this.staggerLines || 1) * a.plotWidth / k || !b && (e && e - a.spacing[3] || .33 * a.chartWidth) }, renderUnsquish: function () {
                var a = this.chart, b = a.renderer, k = this.tickPositions, m = this.ticks, q = this.options.labels, d = this.horiz,
                f = this.getSlotWidth(), n = Math.max(1, Math.round(f - 2 * (q.padding || 5))), w = {}, t = this.labelMetrics(), z = q.style && q.style.textOverflow, h, l = 0, x, F; e(q.rotation) || (w.rotation = q.rotation || 0); c(k, function (a) { (a = m[a]) && a.labelLength > l && (l = a.labelLength) }); this.maxLabelLength = l; if (this.autoRotation) l > n && l > t.h ? w.rotation = this.labelRotation : this.labelRotation = 0; else if (f && (h = { width: n + "px" }, !z)) for (h.textOverflow = "clip", x = k.length; !d && x--;) if (F = k[x], n = m[F].label) n.styles && "ellipsis" === n.styles.textOverflow ? n.css({ textOverflow: "clip" }) :
                m[F].labelLength > f && n.css({ width: f + "px" }), n.getBBox().height > this.len / k.length - (t.h - t.f) && (n.specCss = { textOverflow: "ellipsis" }); w.rotation && (h = { width: (l > .5 * a.chartHeight ? .33 * a.chartHeight : a.chartHeight) + "px" }, z || (h.textOverflow = "ellipsis")); if (this.labelAlign = q.align || this.autoLabelAlign(this.labelRotation)) w.align = this.labelAlign; c(k, function (a) { var b = (a = m[a]) && a.label; b && (b.attr(w), h && b.css(r(h, b.specCss)), delete b.specCss, a.rotation = w.rotation) }); this.tickRotCorr = b.rotCorr(t.b, this.labelRotation ||
                0, 0 !== this.side)
            }, hasData: function () { return this.hasVisibleSeries || l(this.min) && l(this.max) && !!this.tickPositions }, addTitle: function (a) {
                var b = this.chart.renderer, g = this.horiz, c = this.opposite, k = this.options.title, e; this.axisTitle || ((e = k.textAlign) || (e = (g ? { low: "left", middle: "center", high: "right" } : { low: c ? "right" : "left", middle: "center", high: c ? "left" : "right" })[k.align]), this.axisTitle = b.text(k.text, 0, 0, k.useHTML).attr({ zIndex: 7, rotation: k.rotation || 0, align: e }).addClass("highcharts-axis-title").css(k.style).add(this.axisGroup),
                this.axisTitle.isNew = !0); this.axisTitle[a ? "show" : "hide"](!0)
            }, getOffset: function () {
                var a = this, b = a.chart, k = b.renderer, e = a.options, m = a.tickPositions, q = a.ticks, d = a.horiz, r = a.side, n = b.inverted ? [1, 0, 3, 2][r] : r, w, f, t = 0, z, h = 0, x = e.title, F = e.labels, p = 0, K = b.axisOffset, b = b.clipOffset, J = [-1, 1, 1, -1][r], u, y = e.className, v = a.axisParent, C = this.tickSize("tick"); w = a.hasData(); a.showAxis = f = w || A(e.showEmpty, !0); a.staggerLines = a.horiz && F.staggerLines; a.axisGroup || (a.gridGroup = k.g("grid").attr({ zIndex: e.gridZIndex || 1 }).addClass("highcharts-" +
                this.coll.toLowerCase() + "-grid " + (y || "")).add(v), a.axisGroup = k.g("axis").attr({ zIndex: e.zIndex || 2 }).addClass("highcharts-" + this.coll.toLowerCase() + " " + (y || "")).add(v), a.labelGroup = k.g("axis-labels").attr({ zIndex: F.zIndex || 7 }).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (y || "")).add(v)); if (w || a.isLinked) c(m, function (b) { q[b] ? q[b].addLabel() : q[b] = new N(a, b) }), a.renderUnsquish(), !1 === F.reserveSpace || 0 !== r && 2 !== r && { 1: "left", 3: "right" }[r] !== a.labelAlign && "center" !== a.labelAlign || c(m, function (a) {
                    p =
                    Math.max(q[a].getLabelSize(), p)
                }), a.staggerLines && (p *= a.staggerLines, a.labelOffset = p * (a.opposite ? -1 : 1)); else for (u in q) q[u].destroy(), delete q[u]; x && x.text && !1 !== x.enabled && (a.addTitle(f), f && (t = a.axisTitle.getBBox()[d ? "height" : "width"], z = x.offset, h = l(z) ? 0 : A(x.margin, d ? 5 : 10))); a.renderLine(); a.offset = J * A(e.offset, K[r]); a.tickRotCorr = a.tickRotCorr || { x: 0, y: 0 }; k = 0 === r ? -a.labelMetrics().h : 2 === r ? a.tickRotCorr.y : 0; h = Math.abs(p) + h; p && (h = h - k + J * (d ? A(F.y, a.tickRotCorr.y + 8 * J) : F.x)); a.axisTitleMargin = A(z, h);
                K[r] = Math.max(K[r], a.axisTitleMargin + t + J * a.offset, h, w && m.length && C ? C[0] : 0); e = e.offset ? 0 : 2 * Math.floor(a.axisLine.strokeWidth() / 2); b[n] = Math.max(b[n], e)
            }, getLinePath: function (a) { var b = this.chart, c = this.opposite, g = this.offset, k = this.horiz, e = this.left + (c ? this.width : 0) + g, g = b.chartHeight - this.bottom - (c ? this.height : 0) + g; c && (a *= -1); return b.renderer.crispLine(["M", k ? this.left : e, k ? g : this.top, "L", k ? b.chartWidth - this.right : e, k ? g : b.chartHeight - this.bottom], a) }, renderLine: function () {
                this.axisLine || (this.axisLine =
                this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.axisLine.attr({ stroke: this.options.lineColor, "stroke-width": this.options.lineWidth, zIndex: 7 }))
            }, getTitlePosition: function () {
                var a = this.horiz, b = this.left, c = this.top, k = this.len, e = this.options.title, m = a ? b : c, q = this.opposite, d = this.offset, r = e.x || 0, n = e.y || 0, w = this.chart.renderer.fontMetrics(e.style && e.style.fontSize, this.axisTitle).f, k = { low: m + (a ? 0 : k), middle: m + k / 2, high: m + (a ? k : 0) }[e.align], b = (a ? c + this.height : b) + (a ? 1 : -1) *
                (q ? -1 : 1) * this.axisTitleMargin + (2 === this.side ? w : 0); return { x: a ? k + r : b + (q ? this.width : 0) + d + r, y: a ? b + n - (q ? this.height : 0) + d : k + n }
            }, render: function () {
                var a = this, b = a.chart, e = b.renderer, m = a.options, q = a.isLog, d = a.lin2log, r = a.isLinked, n = a.tickPositions, w = a.axisTitle, f = a.ticks, t = a.minorTicks, z = a.alternateBands, h = m.stackLabels, l = m.alternateGridColor, x = a.tickmarkOffset, p = a.axisLine, A = b.hasRendered && F(a.oldMin), K = a.showAxis, u = C(e.globalAnimation), y, v; a.labelEdge.length = 0; a.overlap = !1; c([f, t, z], function (a) {
                    for (var b in a) a[b].isActive =
                    !1
                }); if (a.hasData() || r) a.minorTickInterval && !a.categories && c(a.getMinorTickPositions(), function (b) { t[b] || (t[b] = new N(a, b, "minor")); A && t[b].isNew && t[b].render(null, !0); t[b].render(null, !1, 1) }), n.length && (c(n, function (b, c) { if (!r || b >= a.min && b <= a.max) f[b] || (f[b] = new N(a, b)), A && f[b].isNew && f[b].render(c, !0, .1), f[b].render(c) }), x && (0 === a.min || a.single) && (f[-1] || (f[-1] = new N(a, -1, null, !0)), f[-1].render(-1))), l && c(n, function (c, g) {
                    v = void 0 !== n[g + 1] ? n[g + 1] + x : a.max - x; 0 === g % 2 && c < a.max && v <= a.max + (b.polar ? -x : x) &&
                    (z[c] || (z[c] = new k(a)), y = c + x, z[c].options = { from: q ? d(y) : y, to: q ? d(v) : v, color: l }, z[c].render(), z[c].isActive = !0)
                }), a._addedPlotLB || (c((m.plotLines || []).concat(m.plotBands || []), function (b) { a.addPlotBandOrLine(b) }), a._addedPlotLB = !0); c([f, t, z], function (a) { var c, g, k = [], e = u.duration; for (c in a) a[c].isActive || (a[c].render(c, !1, 0), a[c].isActive = !1, k.push(c)); J(function () { for (g = k.length; g--;) a[k[g]] && !a[k[g]].isActive && (a[k[g]].destroy(), delete a[k[g]]) }, a !== z && b.hasRendered && e ? e : 0) }); p && (p[p.isPlaced ? "animate" :
                "attr"]({ d: this.getLinePath(p.strokeWidth()) }), p.isPlaced = !0, p[K ? "show" : "hide"](!0)); w && K && (w[w.isNew ? "attr" : "animate"](a.getTitlePosition()), w.isNew = !1); h && h.enabled && a.renderStackTotals(); a.isDirty = !1
            }, redraw: function () { this.visible && (this.render(), c(this.plotLinesAndBands, function (a) { a.render() })); c(this.series, function (a) { a.isDirty = !0 }) }, keepProps: "extKey hcEvents names series userMax userMin".split(" "), destroy: function (a) {
                var b = this, g = b.stacks, k, e = b.plotLinesAndBands, m; a || w(b); for (k in g) d(g[k]),
                g[k] = null; c([b.ticks, b.minorTicks, b.alternateBands], function (a) { d(a) }); if (e) for (a = e.length; a--;) e[a].destroy(); c("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "), function (a) { b[a] && (b[a] = b[a].destroy()) }); for (m in b) b.hasOwnProperty(m) && -1 === q(m, b.keepProps) && delete b[m]
            }, drawCrosshair: function (a, b) {
                var c, g = this.crosshair, k = A(g.snap, !0), e, m = this.cross; a || (a = this.cross && this.cross.e); this.crosshair && !1 !== (l(b) || !k) ? (k ? l(b) && (e = this.isXAxis ? b.plotX : this.len - b.plotY) :
                e = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos), l(e) && (c = this.getPlotLinePath(b && (this.isXAxis ? b.x : A(b.stackY, b.y)), null, null, null, e) || null), l(c) ? (b = this.categories && !this.isRadial, m || (this.cross = m = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (b ? "category " : "thin ") + g.className).attr({ zIndex: A(g.zIndex, 2) }).add(), m.attr({ stroke: g.color || (b ? f("#ccd6eb").setOpacity(.25).get() : "#cccccc"), "stroke-width": A(g.width, 1) }), g.dashStyle && m.attr({ dashstyle: g.dashStyle })),
                m.show().attr({ d: c }), b && !g.width && m.attr({ "stroke-width": this.transA }), this.cross.e = a) : this.hideCrosshair()) : this.hideCrosshair()
            }, hideCrosshair: function () { this.cross && this.cross.hide() }
        }; n(a.Axis.prototype, h)
    })(L); (function (a) {
        var D = a.Axis, C = a.Date, G = a.dateFormat, I = a.defaultOptions, h = a.defined, f = a.each, p = a.extend, v = a.getMagnitude, l = a.getTZOffset, u = a.normalizeTickInterval, d = a.pick, c = a.timeUnits; D.prototype.getTimeTicks = function (a, y, t, m) {
            var b = [], q = {}, n = I.global.useUTC, F, e = new C(y - l(y)), r = C.hcMakeTime,
            x = a.unitRange, A = a.count, k; if (h(y)) {
                e[C.hcSetMilliseconds](x >= c.second ? 0 : A * Math.floor(e.getMilliseconds() / A)); if (x >= c.second) e[C.hcSetSeconds](x >= c.minute ? 0 : A * Math.floor(e.getSeconds() / A)); if (x >= c.minute) e[C.hcSetMinutes](x >= c.hour ? 0 : A * Math.floor(e[C.hcGetMinutes]() / A)); if (x >= c.hour) e[C.hcSetHours](x >= c.day ? 0 : A * Math.floor(e[C.hcGetHours]() / A)); if (x >= c.day) e[C.hcSetDate](x >= c.month ? 1 : A * Math.floor(e[C.hcGetDate]() / A)); x >= c.month && (e[C.hcSetMonth](x >= c.year ? 0 : A * Math.floor(e[C.hcGetMonth]() / A)), F = e[C.hcGetFullYear]());
                if (x >= c.year) e[C.hcSetFullYear](F - F % A); if (x === c.week) e[C.hcSetDate](e[C.hcGetDate]() - e[C.hcGetDay]() + d(m, 1)); F = e[C.hcGetFullYear](); m = e[C.hcGetMonth](); var w = e[C.hcGetDate](), K = e[C.hcGetHours](); if (C.hcTimezoneOffset || C.hcGetTimezoneOffset) k = (!n || !!C.hcGetTimezoneOffset) && (t - y > 4 * c.month || l(y) !== l(t)), e = e.getTime(), e = new C(e + l(e)); n = e.getTime(); for (y = 1; n < t;) b.push(n), n = x === c.year ? r(F + y * A, 0) : x === c.month ? r(F, m + y * A) : !k || x !== c.day && x !== c.week ? k && x === c.hour ? r(F, m, w, K + y * A) : n + x * A : r(F, m, w + y * A * (x === c.day ? 1 :
                7)), y++; b.push(n); x <= c.hour && f(b, function (a) { "000000000" === G("%H%M%S%L", a) && (q[a] = "day") })
            } b.info = p(a, { higherRanks: q, totalRange: x * A }); return b
        }; D.prototype.normalizeTimeTickInterval = function (a, d) {
            var f = d || [["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]], ["second", [1, 2, 5, 10, 15, 30]], ["minute", [1, 2, 5, 10, 15, 30]], ["hour", [1, 2, 3, 4, 6, 8, 12]], ["day", [1, 2]], ["week", [1, 2]], ["month", [1, 2, 3, 4, 6]], ["year", null]]; d = f[f.length - 1]; var m = c[d[0]], b = d[1], q; for (q = 0; q < f.length && !(d = f[q], m = c[d[0]], b = d[1], f[q + 1] && a <= (m *
            b[b.length - 1] + c[f[q + 1][0]]) / 2) ; q++); m === c.year && a < 5 * m && (b = [1, 2, 5]); a = u(a / m, b, "year" === d[0] ? Math.max(v(a / m), 1) : 1); return { unitRange: m, count: a, unitName: d[0] }
        }
    })(L); (function (a) {
        var D = a.Axis, C = a.getMagnitude, G = a.map, I = a.normalizeTickInterval, h = a.pick; D.prototype.getLogTickPositions = function (a, p, v, l) {
            var f = this.options, d = this.len, c = this.lin2log, n = this.log2lin, y = []; l || (this._minorAutoInterval = null); if (.5 <= a) a = Math.round(a), y = this.getLinearTickPositions(a, p, v); else if (.08 <= a) for (var d = Math.floor(p), t, m,
            b, q, z, f = .3 < a ? [1, 2, 4] : .15 < a ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; d < v + 1 && !z; d++) for (m = f.length, t = 0; t < m && !z; t++) b = n(c(d) * f[t]), b > p && (!l || q <= v) && void 0 !== q && y.push(q), q > v && (z = !0), q = b; else p = c(p), v = c(v), a = f[l ? "minorTickInterval" : "tickInterval"], a = h("auto" === a ? null : a, this._minorAutoInterval, f.tickPixelInterval / (l ? 5 : 1) * (v - p) / ((l ? d / this.tickPositions.length : d) || 1)), a = I(a, null, C(a)), y = G(this.getLinearTickPositions(a, p, v), n), l || (this._minorAutoInterval = a / 5); l || (this.tickInterval = a); return y
        }; D.prototype.log2lin =
        function (a) { return Math.log(a) / Math.LN10 }; D.prototype.lin2log = function (a) { return Math.pow(10, a) }
    })(L); (function (a) {
        var D = a.dateFormat, C = a.each, G = a.extend, I = a.format, h = a.isNumber, f = a.map, p = a.merge, v = a.pick, l = a.splat, u = a.syncTimeout, d = a.timeUnits; a.Tooltip = function () { this.init.apply(this, arguments) }; a.Tooltip.prototype = {
            init: function (a, d) { this.chart = a; this.options = d; this.crosshairs = []; this.now = { x: 0, y: 0 }; this.isHidden = !0; this.split = d.split && !a.inverted; this.shared = d.shared || this.split }, cleanSplit: function (a) {
                C(this.chart.series,
                function (c) { var d = c && c.tt; d && (!d.isActive || a ? c.tt = d.destroy() : d.isActive = !1) })
            }, getLabel: function () { var a = this.chart.renderer, d = this.options; this.label || (this.split ? this.label = a.g("tooltip") : (this.label = a.label("", 0, 0, d.shape || "callout", null, null, d.useHTML, null, "tooltip").attr({ padding: d.padding, r: d.borderRadius }), this.label.attr({ fill: d.backgroundColor, "stroke-width": d.borderWidth }).css(d.style).shadow(d.shadow)), this.label.attr({ zIndex: 8 }).add()); return this.label }, update: function (a) {
                this.destroy();
                this.init(this.chart, p(!0, this.options, a))
            }, destroy: function () { this.label && (this.label = this.label.destroy()); this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy()); clearTimeout(this.hideTimer); clearTimeout(this.tooltipTimeout) }, move: function (a, d, f, t) {
                var c = this, b = c.now, q = !1 !== c.options.animation && !c.isHidden && (1 < Math.abs(a - b.x) || 1 < Math.abs(d - b.y)), n = c.followPointer || 1 < c.len; G(b, {
                    x: q ? (2 * b.x + a) / 3 : a, y: q ? (b.y + d) / 2 : d, anchorX: n ? void 0 : q ? (2 * b.anchorX + f) / 3 : f, anchorY: n ? void 0 : q ? (b.anchorY +
                    t) / 2 : t
                }); c.getLabel().attr(b); q && (clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function () { c && c.move(a, d, f, t) }, 32))
            }, hide: function (a) { var c = this; clearTimeout(this.hideTimer); a = v(a, this.options.hideDelay, 500); this.isHidden || (this.hideTimer = u(function () { c.getLabel()[a ? "fadeOut" : "hide"](); c.isHidden = !0 }, a)) }, getAnchor: function (a, d) {
                var c, n = this.chart, m = n.inverted, b = n.plotTop, q = n.plotLeft, z = 0, h = 0, e, r; a = l(a); c = a[0].tooltipPos; this.followPointer && d && (void 0 === d.chartX && (d = n.pointer.normalize(d)),
                c = [d.chartX - n.plotLeft, d.chartY - b]); c || (C(a, function (a) { e = a.series.yAxis; r = a.series.xAxis; z += a.plotX + (!m && r ? r.left - q : 0); h += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!m && e ? e.top - b : 0) }), z /= a.length, h /= a.length, c = [m ? n.plotWidth - h : z, this.shared && !m && 1 < a.length && d ? d.chartY - b : m ? n.plotHeight - z : h]); return f(c, Math.round)
            }, getPosition: function (a, d, f) {
                var c = this.chart, m = this.distance, b = {}, q = f.h || 0, n, h = ["y", c.chartHeight, d, f.plotY + c.plotTop, c.plotTop, c.plotTop + c.plotHeight], e = ["x", c.chartWidth, a, f.plotX +
                c.plotLeft, c.plotLeft, c.plotLeft + c.plotWidth], r = !this.followPointer && v(f.ttBelow, !c.inverted === !!f.negative), l = function (a, c, k, g, e, d) { var f = k < g - m, w = g + m + k < c, n = g - m - k; g += m; if (r && w) b[a] = g; else if (!r && f) b[a] = n; else if (f) b[a] = Math.min(d - k, 0 > n - q ? n : n - q); else if (w) b[a] = Math.max(e, g + q + k > c ? g : g + q); else return !1 }, p = function (a, c, k, g) { var e; g < m || g > c - m ? e = !1 : b[a] = g < k / 2 ? 1 : g > c - k / 2 ? c - k - 2 : g - k / 2; return e }, k = function (a) { var b = h; h = e; e = b; n = a }, w = function () {
                    !1 !== l.apply(0, h) ? !1 !== p.apply(0, e) || n || (k(!0), w()) : n ? b.x = b.y = 0 : (k(!0),
                    w())
                }; (c.inverted || 1 < this.len) && k(); w(); return b
            }, defaultFormatter: function (a) { var c = this.points || l(this), d; d = [a.tooltipFooterHeaderFormatter(c[0])]; d = d.concat(a.bodyFormatter(c)); d.push(a.tooltipFooterHeaderFormatter(c[0], !0)); return d }, refresh: function (a, d) {
                var c = this.chart, f, m = this.options, b, q, n = {}, h = []; f = m.formatter || this.defaultFormatter; var n = c.hoverPoints, e = this.shared; clearTimeout(this.hideTimer); this.followPointer = l(a)[0].series.tooltipOptions.followPointer; q = this.getAnchor(a, d); d = q[0]; b =
                q[1]; !e || a.series && a.series.noSharedTooltip ? n = a.getLabelConfig() : (c.hoverPoints = a, n && C(n, function (a) { a.setState() }), C(a, function (a) { a.setState("hover"); h.push(a.getLabelConfig()) }), n = { x: a[0].category, y: a[0].y }, n.points = h, this.len = h.length, a = a[0]); n = f.call(n, this); e = a.series; this.distance = v(e.tooltipOptions.distance, 16); !1 === n ? this.hide() : (f = this.getLabel(), this.isHidden && f.attr({ opacity: 1 }).show(), this.split ? this.renderSplit(n, c.hoverPoints) : (f.attr({ text: n && n.join ? n.join("") : n }), f.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" +
                v(a.colorIndex, e.colorIndex)), f.attr({ stroke: m.borderColor || a.color || e.color || "#666666" }), this.updatePosition({ plotX: d, plotY: b, negative: a.negative, ttBelow: a.ttBelow, h: q[2] || 0 })), this.isHidden = !1)
            }, renderSplit: function (c, d) {
                var f = this, n = [], m = this.chart, b = m.renderer, q = !0, h = this.options, l, e = this.getLabel(); C(c.slice(0, c.length - 1), function (a, c) {
                    c = d[c - 1] || { isHeader: !0, plotX: d[0].plotX }; var r = c.series || f, k = r.tt, w = c.series || {}, t = "highcharts-color-" + v(c.colorIndex, w.colorIndex, "none"); k || (r.tt = k = b.label(null,
                    null, null, "callout").addClass("highcharts-tooltip-box " + t).attr({ padding: h.padding, r: h.borderRadius, fill: h.backgroundColor, stroke: c.color || w.color || "#333333", "stroke-width": h.borderWidth }).add(e)); k.isActive = !0; k.attr({ text: a }); k.css(h.style); a = k.getBBox(); w = a.width + k.strokeWidth(); c.isHeader ? (l = a.height, w = Math.max(0, Math.min(c.plotX + m.plotLeft - w / 2, m.chartWidth - w))) : w = c.plotX + m.plotLeft - v(h.distance, 16) - w; 0 > w && (q = !1); a = (c.series && c.series.yAxis && c.series.yAxis.pos) + (c.plotY || 0); a -= m.plotTop; n.push({
                        target: c.isHeader ?
                        m.plotHeight + l : a, rank: c.isHeader ? 1 : 0, size: r.tt.getBBox().height + 1, point: c, x: w, tt: k
                    })
                }); this.cleanSplit(); a.distribute(n, m.plotHeight + l); C(n, function (a) { var b = a.point, c = b.series; a.tt.attr({ visibility: void 0 === a.pos ? "hidden" : "inherit", x: q || b.isHeader ? a.x : b.plotX + m.plotLeft + v(h.distance, 16), y: a.pos + m.plotTop, anchorX: b.isHeader ? b.plotX + m.plotLeft : b.plotX + c.xAxis.pos, anchorY: b.isHeader ? a.pos + m.plotTop - 15 : b.plotY + c.yAxis.pos }) })
            }, updatePosition: function (a) {
                var c = this.chart, d = this.getLabel(), d = (this.options.positioner ||
                this.getPosition).call(this, d.width, d.height, a); this.move(Math.round(d.x), Math.round(d.y || 0), a.plotX + c.plotLeft, a.plotY + c.plotTop)
            }, getXDateFormat: function (a, f, h) {
                var c; f = f.dateTimeLabelFormats; var m = h && h.closestPointRange, b, q = { millisecond: 15, second: 12, minute: 9, hour: 6, day: 3 }, n, l = "millisecond"; if (m) {
                    n = D("%m-%d %H:%M:%S.%L", a.x); for (b in d) {
                        if (m === d.week && +D("%w", a.x) === h.options.startOfWeek && "00:00:00.000" === n.substr(6)) { b = "week"; break } if (d[b] > m) { b = l; break } if (q[b] && n.substr(q[b]) !== "01-01 00:00:00.000".substr(q[b])) break;
                        "week" !== b && (l = b)
                    } b && (c = f[b])
                } else c = f.day; return c || f.year
            }, tooltipFooterHeaderFormatter: function (a, d) { var c = d ? "footer" : "header"; d = a.series; var f = d.tooltipOptions, m = f.xDateFormat, b = d.xAxis, q = b && "datetime" === b.options.type && h(a.key), c = f[c + "Format"]; q && !m && (m = this.getXDateFormat(a, f, b)); q && m && (c = c.replace("{point.key}", "{point.key:" + m + "}")); return I(c, { point: a, series: d }) }, bodyFormatter: function (a) {
                return f(a, function (a) {
                    var c = a.series.tooltipOptions; return (c.pointFormatter || a.point.tooltipFormatter).call(a.point,
                    c.pointFormat)
                })
            }
        }
    })(L); (function (a) {
        var D = a.addEvent, C = a.attr, G = a.charts, I = a.color, h = a.css, f = a.defined, p = a.doc, v = a.each, l = a.extend, u = a.fireEvent, d = a.offset, c = a.pick, n = a.removeEvent, y = a.splat, t = a.Tooltip, m = a.win; a.Pointer = function (a, c) { this.init(a, c) }; a.Pointer.prototype = {
            init: function (a, m) {
                this.options = m; this.chart = a; this.runChartClick = m.chart.events && !!m.chart.events.click; this.pinchDown = []; this.lastValidTouch = {}; t && m.tooltip.enabled && (a.tooltip = new t(a, m.tooltip), this.followTouchMove = c(m.tooltip.followTouchMove,
                !0)); this.setDOMEvents()
            }, zoomOption: function (a) { var b = this.chart, m = b.options.chart, d = m.zoomType || "", b = b.inverted; /touch/.test(a.type) && (d = c(m.pinchType, d)); this.zoomX = a = /x/.test(d); this.zoomY = d = /y/.test(d); this.zoomHor = a && !b || d && b; this.zoomVert = d && !b || a && b; this.hasZoom = a || d }, normalize: function (a, c) {
                var b, q; a = a || m.event; a.target || (a.target = a.srcElement); q = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a; c || (this.chartPosition = c = d(this.chart.container)); void 0 === q.pageX ? (b = Math.max(a.x,
                a.clientX - c.left), c = a.y) : (b = q.pageX - c.left, c = q.pageY - c.top); return l(a, { chartX: Math.round(b), chartY: Math.round(c) })
            }, getCoordinates: function (a) { var b = { xAxis: [], yAxis: [] }; v(this.chart.axes, function (c) { b[c.isXAxis ? "xAxis" : "yAxis"].push({ axis: c, value: c.toValue(a[c.horiz ? "chartX" : "chartY"]) }) }); return b }, runPointActions: function (b) {
                var m = this.chart, d = m.series, f = m.tooltip, e = f ? f.shared : !1, r = !0, n = m.hoverPoint, h = m.hoverSeries, k, w, l, t = [], u; if (!e && !h) for (k = 0; k < d.length; k++) if (d[k].directTouch || !d[k].options.stickyTracking) d =
                []; h && (e ? h.noSharedTooltip : h.directTouch) && n ? t = [n] : (e || !h || h.options.stickyTracking || (d = [h]), v(d, function (a) { w = a.noSharedTooltip && e; l = !e && a.directTouch; a.visible && !w && !l && c(a.options.enableMouseTracking, !0) && (u = a.searchPoint(b, !w && 1 === a.kdDimensions)) && u.series && t.push(u) }), t.sort(function (a, b) { var c = a.distX - b.distX, g = a.dist - b.dist, k = b.series.group.zIndex - a.series.group.zIndex; return 0 !== c && e ? c : 0 !== g ? g : 0 !== k ? k : a.series.index > b.series.index ? -1 : 1 })); if (e) for (k = t.length; k--;) (t[k].x !== t[0].x || t[k].series.noSharedTooltip) &&
                t.splice(k, 1); if (t[0] && (t[0] !== this.prevKDPoint || f && f.isHidden)) { if (e && !t[0].series.noSharedTooltip) { for (k = 0; k < t.length; k++) t[k].onMouseOver(b, t[k] !== (h && h.directTouch && n || t[0])); t.length && f && f.refresh(t.sort(function (a, b) { return a.series.index - b.series.index }), b) } else if (f && f.refresh(t[0], b), !h || !h.directTouch) t[0].onMouseOver(b); this.prevKDPoint = t[0]; r = !1 } r && (d = h && h.tooltipOptions.followPointer, f && d && !f.isHidden && (d = f.getAnchor([{}], b), f.updatePosition({ plotX: d[0], plotY: d[1] }))); this.unDocMouseMove ||
                (this.unDocMouseMove = D(p, "mousemove", function (b) { if (G[a.hoverChartIndex]) G[a.hoverChartIndex].pointer.onDocumentMouseMove(b) })); v(e ? t : [c(n, t[0])], function (a) { v(m.axes, function (c) { (!a || a.series && a.series[c.coll] === c) && c.drawCrosshair(b, a) }) })
            }, reset: function (a, c) {
                var b = this.chart, m = b.hoverSeries, e = b.hoverPoint, d = b.hoverPoints, q = b.tooltip, f = q && q.shared ? d : e; a && f && v(y(f), function (b) { b.series.isCartesian && void 0 === b.plotX && (a = !1) }); if (a) q && f && (q.refresh(f), e && (e.setState(e.state, !0), v(b.axes, function (a) {
                    a.crosshair &&
                    a.drawCrosshair(null, e)
                }))); else { if (e) e.onMouseOut(); d && v(d, function (a) { a.setState() }); if (m) m.onMouseOut(); q && q.hide(c); this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove()); v(b.axes, function (a) { a.hideCrosshair() }); this.hoverX = this.prevKDPoint = b.hoverPoints = b.hoverPoint = null }
            }, scaleGroups: function (a, c) {
                var b = this.chart, m; v(b.series, function (e) {
                    m = a || e.getPlotBox(); e.xAxis && e.xAxis.zoomEnabled && e.group && (e.group.attr(m), e.markerGroup && (e.markerGroup.attr(m), e.markerGroup.clip(c ? b.clipRect :
                    null)), e.dataLabelsGroup && e.dataLabelsGroup.attr(m))
                }); b.clipRect.attr(c || b.clipBox)
            }, dragStart: function (a) { var b = this.chart; b.mouseIsDown = a.type; b.cancelClick = !1; b.mouseDownX = this.mouseDownX = a.chartX; b.mouseDownY = this.mouseDownY = a.chartY }, drag: function (a) {
                var b = this.chart, c = b.options.chart, m = a.chartX, e = a.chartY, d = this.zoomHor, f = this.zoomVert, n = b.plotLeft, k = b.plotTop, w = b.plotWidth, h = b.plotHeight, l, t = this.selectionMarker, g = this.mouseDownX, p = this.mouseDownY, u = c.panKey && a[c.panKey + "Key"]; t && t.touch ||
                (m < n ? m = n : m > n + w && (m = n + w), e < k ? e = k : e > k + h && (e = k + h), this.hasDragged = Math.sqrt(Math.pow(g - m, 2) + Math.pow(p - e, 2)), 10 < this.hasDragged && (l = b.isInsidePlot(g - n, p - k), b.hasCartesianSeries && (this.zoomX || this.zoomY) && l && !u && !t && (this.selectionMarker = t = b.renderer.rect(n, k, d ? 1 : w, f ? 1 : h, 0).attr({ fill: c.selectionMarkerFill || I("#335cad").setOpacity(.25).get(), "class": "highcharts-selection-marker", zIndex: 7 }).add()), t && d && (m -= g, t.attr({ width: Math.abs(m), x: (0 < m ? 0 : m) + g })), t && f && (m = e - p, t.attr({
                    height: Math.abs(m), y: (0 < m ? 0 : m) +
                    p
                })), l && !t && c.panning && b.pan(a, c.panning)))
            }, drop: function (a) {
                var b = this, c = this.chart, m = this.hasPinched; if (this.selectionMarker) {
                    var e = { originalEvent: a, xAxis: [], yAxis: [] }, d = this.selectionMarker, n = d.attr ? d.attr("x") : d.x, t = d.attr ? d.attr("y") : d.y, k = d.attr ? d.attr("width") : d.width, w = d.attr ? d.attr("height") : d.height, p; if (this.hasDragged || m) v(c.axes, function (c) {
                        if (c.zoomEnabled && f(c.min) && (m || b[{ xAxis: "zoomX", yAxis: "zoomY" }[c.coll]])) {
                            var d = c.horiz, g = "touchend" === a.type ? c.minPixelPadding : 0, q = c.toValue((d ?
                                n : t) + g), d = c.toValue((d ? n + k : t + w) - g); e[c.coll].push({ axis: c, min: Math.min(q, d), max: Math.max(q, d) }); p = !0
                        }
                    }), p && u(c, "selection", e, function (a) { c.zoom(l(a, m ? { animation: !1 } : null)) }); this.selectionMarker = this.selectionMarker.destroy(); m && this.scaleGroups()
                } c && (h(c.container, { cursor: c._cursor }), c.cancelClick = 10 < this.hasDragged, c.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = [])
            }, onContainerMouseDown: function (a) { a = this.normalize(a); this.zoomOption(a); a.preventDefault && a.preventDefault(); this.dragStart(a) },
            onDocumentMouseUp: function (b) { G[a.hoverChartIndex] && G[a.hoverChartIndex].pointer.drop(b) }, onDocumentMouseMove: function (a) { var b = this.chart, c = this.chartPosition; a = this.normalize(a, c); !c || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || this.reset() }, onContainerMouseLeave: function (b) { var c = G[a.hoverChartIndex]; c && (b.relatedTarget || b.toElement) && (c.pointer.reset(), c.pointer.chartPosition = null) }, onContainerMouseMove: function (b) {
                var c = this.chart; f(a.hoverChartIndex) &&
                G[a.hoverChartIndex] && G[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index); b = this.normalize(b); b.returnValue = !1; "mousedown" === c.mouseIsDown && this.drag(b); !this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft, b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b)
            }, inClass: function (a, c) { for (var b; a;) { if (b = C(a, "class")) { if (-1 !== b.indexOf(c)) return !0; if (-1 !== b.indexOf("highcharts-container")) return !1 } a = a.parentNode } }, onTrackerMouseOut: function (a) {
                var b = this.chart.hoverSeries;
                a = a.relatedTarget || a.toElement; if (!(!b || !a || b.options.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut()
            }, onContainerClick: function (a) {
                var b = this.chart, c = b.hoverPoint, m = b.plotLeft, e = b.plotTop; a = this.normalize(a); b.cancelClick || (c && this.inClass(a.target, "highcharts-tracker") ? (u(c.series, "click", l(a, { point: c })), b.hoverPoint && c.firePointEvent("click", a)) : (l(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX -
                m, a.chartY - e) && u(b, "click", a)))
            }, setDOMEvents: function () { var b = this, c = b.chart.container; c.onmousedown = function (a) { b.onContainerMouseDown(a) }; c.onmousemove = function (a) { b.onContainerMouseMove(a) }; c.onclick = function (a) { b.onContainerClick(a) }; D(c, "mouseleave", b.onContainerMouseLeave); 1 === a.chartCount && D(p, "mouseup", b.onDocumentMouseUp); a.hasTouch && (c.ontouchstart = function (a) { b.onContainerTouchStart(a) }, c.ontouchmove = function (a) { b.onContainerTouchMove(a) }, 1 === a.chartCount && D(p, "touchend", b.onDocumentTouchEnd)) },
            destroy: function () { var b; n(this.chart.container, "mouseleave", this.onContainerMouseLeave); a.chartCount || (n(p, "mouseup", this.onDocumentMouseUp), n(p, "touchend", this.onDocumentTouchEnd)); clearInterval(this.tooltipTimeout); for (b in this) this[b] = null }
        }
    })(L); (function (a) {
        var D = a.charts, C = a.each, G = a.extend, I = a.map, h = a.noop, f = a.pick; G(a.Pointer.prototype, {
            pinchTranslate: function (a, f, h, u, d, c) {
                this.zoomHor && this.pinchTranslateDirection(!0, a, f, h, u, d, c); this.zoomVert && this.pinchTranslateDirection(!1, a, f, h, u, d,
                c)
            }, pinchTranslateDirection: function (a, f, h, u, d, c, n, y) {
                var t = this.chart, m = a ? "x" : "y", b = a ? "X" : "Y", q = "chart" + b, l = a ? "width" : "height", p = t["plot" + (a ? "Left" : "Top")], e, r, x = y || 1, A = t.inverted, k = t.bounds[a ? "h" : "v"], w = 1 === f.length, K = f[0][q], J = h[0][q], v = !w && f[1][q], g = !w && h[1][q], B; h = function () { !w && 20 < Math.abs(K - v) && (x = y || Math.abs(J - g) / Math.abs(K - v)); r = (p - J) / x + K; e = t["plot" + (a ? "Width" : "Height")] / x }; h(); f = r; f < k.min ? (f = k.min, B = !0) : f + e > k.max && (f = k.max - e, B = !0); B ? (J -= .8 * (J - n[m][0]), w || (g -= .8 * (g - n[m][1])), h()) : n[m] = [J,
                g]; A || (c[m] = r - p, c[l] = e); c = A ? 1 / x : x; d[l] = e; d[m] = f; u[A ? a ? "scaleY" : "scaleX" : "scale" + b] = x; u["translate" + b] = c * p + (J - c * K)
            }, pinch: function (a) {
                var p = this, l = p.chart, u = p.pinchDown, d = a.touches, c = d.length, n = p.lastValidTouch, y = p.hasZoom, t = p.selectionMarker, m = {}, b = 1 === c && (p.inClass(a.target, "highcharts-tracker") && l.runTrackerClick || p.runChartClick), q = {}; 1 < c && (p.initiated = !0); y && p.initiated && !b && a.preventDefault(); I(d, function (a) { return p.normalize(a) }); "touchstart" === a.type ? (C(d, function (a, b) {
                    u[b] = {
                        chartX: a.chartX,
                        chartY: a.chartY
                    }
                }), n.x = [u[0].chartX, u[1] && u[1].chartX], n.y = [u[0].chartY, u[1] && u[1].chartY], C(l.axes, function (a) { if (a.zoomEnabled) { var b = l.bounds[a.horiz ? "h" : "v"], c = a.minPixelPadding, m = a.toPixels(f(a.options.min, a.dataMin)), d = a.toPixels(f(a.options.max, a.dataMax)), q = Math.max(m, d); b.min = Math.min(a.pos, Math.min(m, d) - c); b.max = Math.max(a.pos + a.len, q + c) } }), p.res = !0) : p.followTouchMove && 1 === c ? this.runPointActions(p.normalize(a)) : u.length && (t || (p.selectionMarker = t = G({ destroy: h, touch: !0 }, l.plotBox)), p.pinchTranslate(u,
                d, m, t, q, n), p.hasPinched = y, p.scaleGroups(m, q), p.res && (p.res = !1, this.reset(!1, 0)))
            }, touch: function (h, v) {
                var l = this.chart, p, d; if (l.index !== a.hoverChartIndex) this.onContainerMouseLeave({ relatedTarget: !0 }); a.hoverChartIndex = l.index; 1 === h.touches.length ? (h = this.normalize(h), (d = l.isInsidePlot(h.chartX - l.plotLeft, h.chartY - l.plotTop)) && !l.openMenu ? (v && this.runPointActions(h), "touchmove" === h.type && (v = this.pinchDown, p = v[0] ? 4 <= Math.sqrt(Math.pow(v[0].chartX - h.chartX, 2) + Math.pow(v[0].chartY - h.chartY, 2)) : !1), f(p,
                !0) && this.pinch(h)) : v && this.reset()) : 2 === h.touches.length && this.pinch(h)
            }, onContainerTouchStart: function (a) { this.zoomOption(a); this.touch(a, !0) }, onContainerTouchMove: function (a) { this.touch(a) }, onDocumentTouchEnd: function (f) { D[a.hoverChartIndex] && D[a.hoverChartIndex].pointer.drop(f) }
        })
    })(L); (function (a) {
        var D = a.addEvent, C = a.charts, G = a.css, I = a.doc, h = a.extend, f = a.noop, p = a.Pointer, v = a.removeEvent, l = a.win, u = a.wrap; if (l.PointerEvent || l.MSPointerEvent) {
            var d = {}, c = !!l.PointerEvent, n = function () {
                var a, c = [];
                c.item = function (a) { return this[a] }; for (a in d) d.hasOwnProperty(a) && c.push({ pageX: d[a].pageX, pageY: d[a].pageY, target: d[a].target }); return c
            }, y = function (c, m, b, d) { "touch" !== c.pointerType && c.pointerType !== c.MSPOINTER_TYPE_TOUCH || !C[a.hoverChartIndex] || (d(c), d = C[a.hoverChartIndex].pointer, d[m]({ type: b, target: c.currentTarget, preventDefault: f, touches: n() })) }; h(p.prototype, {
                onContainerPointerDown: function (a) {
                    y(a, "onContainerTouchStart", "touchstart", function (a) {
                        d[a.pointerId] = {
                            pageX: a.pageX, pageY: a.pageY,
                            target: a.currentTarget
                        }
                    })
                }, onContainerPointerMove: function (a) { y(a, "onContainerTouchMove", "touchmove", function (a) { d[a.pointerId] = { pageX: a.pageX, pageY: a.pageY }; d[a.pointerId].target || (d[a.pointerId].target = a.currentTarget) }) }, onDocumentPointerUp: function (a) { y(a, "onDocumentTouchEnd", "touchend", function (a) { delete d[a.pointerId] }) }, batchMSEvents: function (a) {
                    a(this.chart.container, c ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown); a(this.chart.container, c ? "pointermove" : "MSPointerMove", this.onContainerPointerMove);
                    a(I, c ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp)
                }
            }); u(p.prototype, "init", function (a, c, b) { a.call(this, c, b); this.hasZoom && G(c.container, { "-ms-touch-action": "none", "touch-action": "none" }) }); u(p.prototype, "setDOMEvents", function (a) { a.apply(this); (this.hasZoom || this.followTouchMove) && this.batchMSEvents(D) }); u(p.prototype, "destroy", function (a) { this.batchMSEvents(v); a.call(this) })
        }
    })(L); (function (a) {
        var D, C = a.addEvent, G = a.css, I = a.discardElement, h = a.defined, f = a.each, p = a.extend, v = a.isFirefox, l = a.marginNames,
        u = a.merge, d = a.pick, c = a.setAnimation, n = a.stableSort, y = a.win, t = a.wrap; D = a.Legend = function (a, b) { this.init(a, b) }; D.prototype = {
            init: function (a, b) { this.chart = a; this.setOptions(b); b.enabled && (this.render(), C(this.chart, "endResize", function () { this.legend.positionCheckboxes() })) }, setOptions: function (a) {
                var b = d(a.padding, 8); this.options = a; this.itemStyle = a.itemStyle; this.itemHiddenStyle = u(this.itemStyle, a.itemHiddenStyle); this.itemMarginTop = a.itemMarginTop || 0; this.initialItemX = this.padding = b; this.initialItemY =
                b - 5; this.itemHeight = this.maxItemWidth = 0; this.symbolWidth = d(a.symbolWidth, 16); this.pages = []
            }, update: function (a, b) { var c = this.chart; this.setOptions(u(!0, this.options, a)); this.destroy(); c.isDirtyLegend = c.isDirtyBox = !0; d(b, !0) && c.redraw() }, colorizeItem: function (a, b) {
                a.legendGroup[b ? "removeClass" : "addClass"]("highcharts-legend-item-hidden"); var c = this.options, d = a.legendItem, m = a.legendLine, e = a.legendSymbol, f = this.itemHiddenStyle.color, c = b ? c.itemStyle.color : f, h = b ? a.color || f : f, n = a.options && a.options.marker,
                k = { fill: h }, w; d && d.css({ fill: c, color: c }); m && m.attr({ stroke: h }); if (e) { if (n && e.isMarker && (k = a.pointAttribs(), !b)) for (w in k) k[w] = f; e.attr(k) }
            }, positionItem: function (a) { var b = this.options, c = b.symbolPadding, b = !b.rtl, d = a._legendItemPos, m = d[0], d = d[1], e = a.checkbox; (a = a.legendGroup) && a.element && a.translate(b ? m : this.legendWidth - m - 2 * c - 4, d); e && (e.x = m, e.y = d) }, destroyItem: function (a) { var b = a.checkbox; f(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function (b) { a[b] && (a[b] = a[b].destroy()) }); b && I(a.checkbox) },
            destroy: function () { function a(a) { this[a] && (this[a] = this[a].destroy()) } f(this.getAllItems(), function (b) { f(["legendItem", "legendGroup"], a, b) }); f(["box", "title", "group"], a, this); this.display = null }, positionCheckboxes: function (a) { var b = this.group && this.group.alignAttr, c, d = this.clipHeight || this.legendHeight, m = this.titleHeight; b && (c = b.translateY, f(this.allItems, function (e) { var f = e.checkbox, h; f && (h = c + m + f.y + (a || 0) + 3, G(f, { left: b.translateX + e.checkboxOffset + f.x - 20 + "px", top: h + "px", display: h > c - 6 && h < c + d - 6 ? "" : "none" })) })) },
            renderTitle: function () { var a = this.padding, b = this.options.title, c = 0; b.text && (this.title || (this.title = this.chart.renderer.label(b.text, a - 3, a - 4, null, null, null, null, null, "legend-title").attr({ zIndex: 1 }).css(b.style).add(this.group)), a = this.title.getBBox(), c = a.height, this.offsetWidth = a.width, this.contentGroup.attr({ translateY: c })); this.titleHeight = c }, setText: function (c) { var b = this.options; c.legendItem.attr({ text: b.labelFormat ? a.format(b.labelFormat, c) : b.labelFormatter.call(c) }) }, renderItem: function (a) {
                var b =
                this.chart, c = b.renderer, m = this.options, f = "horizontal" === m.layout, e = this.symbolWidth, h = m.symbolPadding, n = this.itemStyle, l = this.itemHiddenStyle, k = this.padding, w = f ? d(m.itemDistance, 20) : 0, t = !m.rtl, p = m.width, y = m.itemMarginBottom || 0, g = this.itemMarginTop, B = this.initialItemX, v = a.legendItem, M = !a.series, C = !M && a.series.drawLegendSymbol ? a.series : a, E = C.options, E = this.createCheckboxForItem && E && E.showCheckbox, H = m.useHTML; v || (a.legendGroup = c.g("legend-item").addClass("highcharts-" + C.type + "-series highcharts-color-" +
                a.colorIndex + (a.options.className ? " " + a.options.className : "") + (M ? " highcharts-series-" + a.index : "")).attr({ zIndex: 1 }).add(this.scrollGroup), a.legendItem = v = c.text("", t ? e + h : -h, this.baseline || 0, H).css(u(a.visible ? n : l)).attr({ align: t ? "left" : "right", zIndex: 2 }).add(a.legendGroup), this.baseline || (n = n.fontSize, this.fontMetrics = c.fontMetrics(n, v), this.baseline = this.fontMetrics.f + 3 + g, v.attr("y", this.baseline)), C.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, v, H), E && this.createCheckboxForItem(a));
                this.colorizeItem(a, a.visible); this.setText(a); c = v.getBBox(); e = a.checkboxOffset = m.itemWidth || a.legendItemWidth || e + h + c.width + w + (E ? 20 : 0); this.itemHeight = h = Math.round(a.legendItemHeight || c.height); f && this.itemX - B + e > (p || b.chartWidth - 2 * k - B - m.x) && (this.itemX = B, this.itemY += g + this.lastLineHeight + y, this.lastLineHeight = 0); this.maxItemWidth = Math.max(this.maxItemWidth, e); this.lastItemY = g + this.itemY + y; this.lastLineHeight = Math.max(h, this.lastLineHeight); a._legendItemPos = [this.itemX, this.itemY]; f ? this.itemX += e :
                (this.itemY += g + h + y, this.lastLineHeight = h); this.offsetWidth = p || Math.max((f ? this.itemX - B - w : e) + k, this.offsetWidth)
            }, getAllItems: function () { var a = []; f(this.chart.series, function (b) { var c = b && b.options; b && d(c.showInLegend, h(c.linkedTo) ? !1 : void 0, !0) && (a = a.concat(b.legendItems || ("point" === c.legendType ? b.data : b))) }); return a }, adjustMargins: function (a, b) {
                var c = this.chart, m = this.options, n = m.align.charAt(0) + m.verticalAlign.charAt(0) + m.layout.charAt(0); m.floating || f([/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/,
                /(lbv|lm|ltv)/], function (e, f) { e.test(n) && !h(a[f]) && (c[l[f]] = Math.max(c[l[f]], c.legend[(f + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][f] * m[f % 2 ? "x" : "y"] + d(m.margin, 12) + b[f])) })
            }, render: function () {
                var a = this, b = a.chart, c = b.renderer, d = a.group, h, e, r, l, t = a.box, k = a.options, w = a.padding; a.itemX = a.initialItemX; a.itemY = a.initialItemY; a.offsetWidth = 0; a.lastItemY = 0; d || (a.group = d = c.g("legend").attr({ zIndex: 7 }).add(), a.contentGroup = c.g().attr({ zIndex: 1 }).add(d), a.scrollGroup = c.g().add(a.contentGroup)); a.renderTitle();
                h = a.getAllItems(); n(h, function (a, b) { return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0) }); k.reversed && h.reverse(); a.allItems = h; a.display = e = !!h.length; a.lastLineHeight = 0; f(h, function (b) { a.renderItem(b) }); r = (k.width || a.offsetWidth) + w; l = a.lastItemY + a.lastLineHeight + a.titleHeight; l = a.handleOverflow(l); l += w; t || (a.box = t = c.rect().addClass("highcharts-legend-box").attr({ r: k.borderRadius }).add(d), t.isNew = !0); t.attr({
                    stroke: k.borderColor, "stroke-width": k.borderWidth || 0, fill: k.backgroundColor ||
                    "none"
                }).shadow(k.shadow); 0 < r && 0 < l && (t[t.isNew ? "attr" : "animate"](t.crisp({ x: 0, y: 0, width: r, height: l }, t.strokeWidth())), t.isNew = !1); t[e ? "show" : "hide"](); a.legendWidth = r; a.legendHeight = l; f(h, function (b) { a.positionItem(b) }); e && d.align(p({ width: r, height: l }, k), !0, "spacingBox"); b.isResizing || this.positionCheckboxes()
            }, handleOverflow: function (a) {
                var b = this, c = this.chart, m = c.renderer, h = this.options, e = h.y, c = c.spacingBox.height + ("top" === h.verticalAlign ? -e : e) - this.padding, e = h.maxHeight, n, l = this.clipRect, t = h.navigation,
                k = d(t.animation, !0), w = t.arrowSize || 12, p = this.nav, u = this.pages, y = this.padding, g, B = this.allItems, v = function (a) { a ? l.attr({ height: a }) : l && (b.clipRect = l.destroy(), b.contentGroup.clip()); b.contentGroup.div && (b.contentGroup.div.style.clip = a ? "rect(" + y + "px,9999px," + (y + a) + "px,0)" : "auto") }; "horizontal" !== h.layout || "middle" === h.verticalAlign || h.floating || (c /= 2); e && (c = Math.min(c, e)); u.length = 0; a > c && !1 !== t.enabled ? (this.clipHeight = n = Math.max(c - 20 - this.titleHeight - y, 0), this.currentPage = d(this.currentPage, 1), this.fullHeight =
                a, f(B, function (a, b) { var c = a._legendItemPos[1]; a = Math.round(a.legendItem.getBBox().height); var k = u.length; if (!k || c - u[k - 1] > n && (g || c) !== u[k - 1]) u.push(g || c), k++; b === B.length - 1 && c + a - u[k - 1] > n && u.push(c); c !== g && (g = c) }), l || (l = b.clipRect = m.clipRect(0, y, 9999, 0), b.contentGroup.clip(l)), v(n), p || (this.nav = p = m.g().attr({ zIndex: 1 }).add(this.group), this.up = m.symbol("triangle", 0, 0, w, w).on("click", function () { b.scroll(-1, k) }).add(p), this.pager = m.text("", 15, 10).addClass("highcharts-legend-navigation").css(t.style).add(p),
                this.down = m.symbol("triangle-down", 0, 0, w, w).on("click", function () { b.scroll(1, k) }).add(p)), b.scroll(0), a = c) : p && (v(), p.hide(), this.scrollGroup.attr({ translateY: 1 }), this.clipHeight = 0); return a
            }, scroll: function (a, b) {
                var d = this.pages, f = d.length; a = this.currentPage + a; var m = this.clipHeight, e = this.options.navigation, h = this.pager, n = this.padding; a > f && (a = f); 0 < a && (void 0 !== b && c(b, this.chart), this.nav.attr({ translateX: n, translateY: m + this.padding + 7 + this.titleHeight, visibility: "visible" }), this.up.attr({
                    "class": 1 ===
                    a ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
                }), h.attr({ text: a + "/" + f }), this.down.attr({ x: 18 + this.pager.getBBox().width, "class": a === f ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" }), this.up.attr({ fill: 1 === a ? e.inactiveColor : e.activeColor }).css({ cursor: 1 === a ? "default" : "pointer" }), this.down.attr({ fill: a === f ? e.inactiveColor : e.activeColor }).css({ cursor: a === f ? "default" : "pointer" }), b = -d[a - 1] + this.initialItemY, this.scrollGroup.animate({ translateY: b }), this.currentPage =
                a, this.positionCheckboxes(b))
            }
        }; a.LegendSymbolMixin = {
            drawRectangle: function (a, b) { var c = a.options, f = c.symbolHeight || a.fontMetrics.f, c = c.squareSymbol; b.legendSymbol = this.chart.renderer.rect(c ? (a.symbolWidth - f) / 2 : 0, a.baseline - f + 1, c ? f : a.symbolWidth, f, d(a.options.symbolRadius, f / 2)).addClass("highcharts-point").attr({ zIndex: 3 }).add(b.legendGroup) }, drawLineMarker: function (a) {
                var b = this.options, c = b.marker, d = a.symbolWidth, f = this.chart.renderer, e = this.legendGroup; a = a.baseline - Math.round(.3 * a.fontMetrics.b);
                var m; m = { "stroke-width": b.lineWidth || 0 }; b.dashStyle && (m.dashstyle = b.dashStyle); this.legendLine = f.path(["M", 0, a, "L", d, a]).addClass("highcharts-graph").attr(m).add(e); c && !1 !== c.enabled && (b = 0 === this.symbol.indexOf("url") ? 0 : c.radius, this.legendSymbol = c = f.symbol(this.symbol, d / 2 - b, a - b, 2 * b, 2 * b, c).addClass("highcharts-point").add(e), c.isMarker = !0)
            }
        }; (/Trident\/7\.0/.test(y.navigator.userAgent) || v) && t(D.prototype, "positionItem", function (a, b) { var c = this, d = function () { b._legendItemPos && a.call(c, b) }; d(); setTimeout(d) })
    })(L);
    (function (a) {
        var D = a.addEvent, C = a.animate, G = a.animObject, I = a.attr, h = a.doc, f = a.Axis, p = a.createElement, v = a.defaultOptions, l = a.discardElement, u = a.charts, d = a.css, c = a.defined, n = a.each, y = a.extend, t = a.find, m = a.fireEvent, b = a.getStyle, q = a.grep, z = a.isNumber, F = a.isObject, e = a.isString, r = a.Legend, x = a.marginNames, A = a.merge, k = a.Pointer, w = a.pick, K = a.pInt, J = a.removeEvent, N = a.seriesTypes, g = a.splat, B = a.svg, S = a.syncTimeout, M = a.win, R = a.Renderer, E = a.Chart = function () { this.getArgs.apply(this, arguments) }; a.chart = function (a,
        b, c) { return new E(a, b, c) }; E.prototype = {
            callbacks: [], getArgs: function () { var a = [].slice.call(arguments); if (e(a[0]) || a[0].nodeName) this.renderTo = a.shift(); this.init(a[0], a[1]) }, init: function (b, c) {
                var k, g = b.series; b.series = null; k = A(v, b); k.series = b.series = g; this.userOptions = b; this.respRules = []; b = k.chart; g = b.events; this.margin = []; this.spacing = []; this.bounds = { h: {}, v: {} }; this.callback = c; this.isResizing = 0; this.options = k; this.axes = []; this.series = []; this.hasCartesianSeries = b.showAxes; var e; this.index = u.length;
                u.push(this); a.chartCount++; if (g) for (e in g) D(this, e, g[e]); this.xAxis = []; this.yAxis = []; this.pointCount = this.colorCounter = this.symbolCounter = 0; this.firstRender()
            }, initSeries: function (b) { var c = this.options.chart; (c = N[b.type || c.type || c.defaultSeriesType]) || a.error(17, !0); c = new c; c.init(this, b); return c }, isInsidePlot: function (a, b, c) { var k = c ? b : a; a = c ? a : b; return 0 <= k && k <= this.plotWidth && 0 <= a && a <= this.plotHeight }, redraw: function (b) {
                var c = this.axes, k = this.series, g = this.pointer, e = this.legend, d = this.isDirtyLegend,
                f, h, w = this.hasCartesianSeries, r = this.isDirtyBox, l = k.length, q = l, t = this.renderer, p = t.isHidden(), H = []; a.setAnimation(b, this); p && this.cloneRenderTo(); for (this.layOutTitles() ; q--;) if (b = k[q], b.options.stacking && (f = !0, b.isDirty)) { h = !0; break } if (h) for (q = l; q--;) b = k[q], b.options.stacking && (b.isDirty = !0); n(k, function (a) { a.isDirty && "point" === a.options.legendType && (a.updateTotals && a.updateTotals(), d = !0); a.isDirtyData && m(a, "updatedData") }); d && e.options.enabled && (e.render(), this.isDirtyLegend = !1); f && this.getStacks();
                w && n(c, function (a) { a.updateNames(); a.setScale() }); this.getMargins(); w && (n(c, function (a) { a.isDirty && (r = !0) }), n(c, function (a) { var b = a.min + "," + a.max; a.extKey !== b && (a.extKey = b, H.push(function () { m(a, "afterSetExtremes", y(a.eventArgs, a.getExtremes())); delete a.eventArgs })); (r || f) && a.redraw() })); r && this.drawChartBox(); n(k, function (a) { (r || a.isDirty) && a.visible && a.redraw() }); g && g.reset(!0); t.draw(); m(this, "redraw"); p && this.cloneRenderTo(!0); n(H, function (a) { a.call() })
            }, get: function (a) {
                function b(b) {
                    return b.id ===
                    a || b.options.id === a
                } var c, k = this.series, g; c = t(this.axes, b) || t(this.series, b); for (g = 0; !c && g < k.length; g++) c = t(k[g].points || [], b); return c
            }, getAxes: function () { var a = this, b = this.options, c = b.xAxis = g(b.xAxis || {}), b = b.yAxis = g(b.yAxis || {}); n(c, function (a, b) { a.index = b; a.isX = !0 }); n(b, function (a, b) { a.index = b }); c = c.concat(b); n(c, function (b) { new f(a, b) }) }, getSelectedPoints: function () { var a = []; n(this.series, function (b) { a = a.concat(q(b.points || [], function (a) { return a.selected })) }); return a }, getSelectedSeries: function () {
                return q(this.series,
                function (a) { return a.selected })
            }, setTitle: function (a, b, c) {
                var k = this, g = k.options, e; e = g.title = A({ style: { color: "#333333", fontSize: g.isStock ? "16px" : "18px" } }, g.title, a); g = g.subtitle = A({ style: { color: "#666666" } }, g.subtitle, b); n([["title", a, e], ["subtitle", b, g]], function (a, b) {
                    var c = a[0], g = k[c], e = a[1]; a = a[2]; g && e && (k[c] = g = g.destroy()); a && a.text && !g && (k[c] = k.renderer.text(a.text, 0, 0, a.useHTML).attr({ align: a.align, "class": "highcharts-" + c, zIndex: a.zIndex || 4 }).add(), k[c].update = function (a) {
                        k.setTitle(!b && a, b &&
                        a)
                    }, k[c].css(a.style))
                }); k.layOutTitles(c)
            }, layOutTitles: function (a) {
                var b = 0, c, k = this.renderer, g = this.spacingBox; n(["title", "subtitle"], function (a) { var c = this[a], e = this.options[a], d; c && (d = e.style.fontSize, d = k.fontMetrics(d, c).b, c.css({ width: (e.width || g.width + e.widthAdjust) + "px" }).align(y({ y: b + d + ("title" === a ? -3 : 2) }, e), !1, "spacingBox"), e.floating || e.verticalAlign || (b = Math.ceil(b + c.getBBox().height))) }, this); c = this.titleOffset !== b; this.titleOffset = b; !this.isDirtyBox && c && (this.isDirtyBox = c, this.hasRendered &&
                w(a, !0) && this.isDirtyBox && this.redraw())
            }, getChartSize: function () { var a = this.options.chart, k = a.width, a = a.height, g = this.renderToClone || this.renderTo; c(k) || (this.containerWidth = b(g, "width")); c(a) || (this.containerHeight = b(g, "height")); this.chartWidth = Math.max(0, k || this.containerWidth || 600); this.chartHeight = Math.max(0, w(a, 19 < this.containerHeight ? this.containerHeight : 400)) }, cloneRenderTo: function (a) {
                var b = this.renderToClone, c = this.container; if (a) {
                    if (b) {
                        for (; b.childNodes.length;) this.renderTo.appendChild(b.firstChild);
                        l(b); delete this.renderToClone
                    }
                } else c && c.parentNode === this.renderTo && this.renderTo.removeChild(c), this.renderToClone = b = this.renderTo.cloneNode(0), d(b, { position: "absolute", top: "-9999px", display: "block" }), b.style.setProperty && b.style.setProperty("display", "block", "important"), h.body.appendChild(b), c && b.appendChild(c)
            }, setClassName: function (a) { this.container.className = "highcharts-container " + (a || "") }, getContainer: function () {
                var b, c = this.options, k = c.chart, g, d; b = this.renderTo; var f = a.uniqueKey(), m; b ||
                (this.renderTo = b = k.renderTo); e(b) && (this.renderTo = b = h.getElementById(b)); b || a.error(13, !0); g = K(I(b, "data-highcharts-chart")); z(g) && u[g] && u[g].hasRendered && u[g].destroy(); I(b, "data-highcharts-chart", this.index); b.innerHTML = ""; k.skipClone || b.offsetWidth || this.cloneRenderTo(); this.getChartSize(); g = this.chartWidth; d = this.chartHeight; m = y({ position: "relative", overflow: "hidden", width: g + "px", height: d + "px", textAlign: "left", lineHeight: "normal", zIndex: 0, "-webkit-tap-highlight-color": "rgba(0,0,0,0)" }, k.style);
                this.container = b = p("div", { id: f }, m, this.renderToClone || b); this._cursor = b.style.cursor; this.renderer = new (a[k.renderer] || R)(b, g, d, null, k.forExport, c.exporting && c.exporting.allowHTML); this.setClassName(k.className); this.renderer.setStyle(k.style); this.renderer.chartIndex = this.index
            }, getMargins: function (a) {
                var b = this.spacing, k = this.margin, g = this.titleOffset; this.resetMargins(); g && !c(k[0]) && (this.plotTop = Math.max(this.plotTop, g + this.options.title.margin + b[0])); this.legend.display && this.legend.adjustMargins(k,
                b); this.extraBottomMargin && (this.marginBottom += this.extraBottomMargin); this.extraTopMargin && (this.plotTop += this.extraTopMargin); a || this.getAxisMargins()
            }, getAxisMargins: function () { var a = this, b = a.axisOffset = [0, 0, 0, 0], k = a.margin; a.hasCartesianSeries && n(a.axes, function (a) { a.visible && a.getOffset() }); n(x, function (g, e) { c(k[e]) || (a[g] += b[e]) }); a.setChartSize() }, reflow: function (a) {
                var k = this, g = k.options.chart, e = k.renderTo, d = c(g.width), f = g.width || b(e, "width"), g = g.height || b(e, "height"), e = a ? a.target : M; if (!d &&
                !k.isPrinting && f && g && (e === M || e === h)) { if (f !== k.containerWidth || g !== k.containerHeight) clearTimeout(k.reflowTimeout), k.reflowTimeout = S(function () { k.container && k.setSize(void 0, void 0, !1) }, a ? 100 : 0); k.containerWidth = f; k.containerHeight = g }
            }, initReflow: function () { var a = this, b; b = D(M, "resize", function (b) { a.reflow(b) }); D(a, "destroy", b) }, setSize: function (b, c, k) {
                var g = this, e = g.renderer; g.isResizing += 1; a.setAnimation(k, g); g.oldChartHeight = g.chartHeight; g.oldChartWidth = g.chartWidth; void 0 !== b && (g.options.chart.width =
                b); void 0 !== c && (g.options.chart.height = c); g.getChartSize(); b = e.globalAnimation; (b ? C : d)(g.container, { width: g.chartWidth + "px", height: g.chartHeight + "px" }, b); g.setChartSize(!0); e.setSize(g.chartWidth, g.chartHeight, k); n(g.axes, function (a) { a.isDirty = !0; a.setScale() }); g.isDirtyLegend = !0; g.isDirtyBox = !0; g.layOutTitles(); g.getMargins(); g.setResponsive && g.setResponsive(!1); g.redraw(k); g.oldChartHeight = null; m(g, "resize"); S(function () { g && m(g, "endResize", null, function () { --g.isResizing }) }, G(b).duration)
            }, setChartSize: function (a) {
                var b =
                this.inverted, c = this.renderer, g = this.chartWidth, k = this.chartHeight, e = this.options.chart, d = this.spacing, f = this.clipOffset, m, h, w, r; this.plotLeft = m = Math.round(this.plotLeft); this.plotTop = h = Math.round(this.plotTop); this.plotWidth = w = Math.max(0, Math.round(g - m - this.marginRight)); this.plotHeight = r = Math.max(0, Math.round(k - h - this.marginBottom)); this.plotSizeX = b ? r : w; this.plotSizeY = b ? w : r; this.plotBorderWidth = e.plotBorderWidth || 0; this.spacingBox = c.spacingBox = { x: d[3], y: d[0], width: g - d[3] - d[1], height: k - d[0] - d[2] };
                this.plotBox = c.plotBox = { x: m, y: h, width: w, height: r }; g = 2 * Math.floor(this.plotBorderWidth / 2); b = Math.ceil(Math.max(g, f[3]) / 2); c = Math.ceil(Math.max(g, f[0]) / 2); this.clipBox = { x: b, y: c, width: Math.floor(this.plotSizeX - Math.max(g, f[1]) / 2 - b), height: Math.max(0, Math.floor(this.plotSizeY - Math.max(g, f[2]) / 2 - c)) }; a || n(this.axes, function (a) { a.setAxisSize(); a.setAxisTranslation() })
            }, resetMargins: function () {
                var a = this, b = a.options.chart; n(["margin", "spacing"], function (c) {
                    var g = b[c], k = F(g) ? g : [g, g, g, g]; n(["Top", "Right",
                    "Bottom", "Left"], function (g, e) { a[c][e] = w(b[c + g], k[e]) })
                }); n(x, function (b, c) { a[b] = w(a.margin[c], a.spacing[c]) }); a.axisOffset = [0, 0, 0, 0]; a.clipOffset = [0, 0, 0, 0]
            }, drawChartBox: function () {
                var a = this.options.chart, b = this.renderer, c = this.chartWidth, g = this.chartHeight, k = this.chartBackground, e = this.plotBackground, d = this.plotBorder, f, m = this.plotBGImage, h = a.backgroundColor, w = a.plotBackgroundColor, n = a.plotBackgroundImage, r, l = this.plotLeft, q = this.plotTop, t = this.plotWidth, p = this.plotHeight, x = this.plotBox, K = this.clipRect,
                u = this.clipBox, A = "animate"; k || (this.chartBackground = k = b.rect().addClass("highcharts-background").add(), A = "attr"); f = a.borderWidth || 0; r = f + (a.shadow ? 8 : 0); h = { fill: h || "none" }; if (f || k["stroke-width"]) h.stroke = a.borderColor, h["stroke-width"] = f; k.attr(h).shadow(a.shadow); k[A]({ x: r / 2, y: r / 2, width: c - r - f % 2, height: g - r - f % 2, r: a.borderRadius }); A = "animate"; e || (A = "attr", this.plotBackground = e = b.rect().addClass("highcharts-plot-background").add()); e[A](x); e.attr({ fill: w || "none" }).shadow(a.plotShadow); n && (m ? m.animate(x) :
                this.plotBGImage = b.image(n, l, q, t, p).add()); K ? K.animate({ width: u.width, height: u.height }) : this.clipRect = b.clipRect(u); A = "animate"; d || (A = "attr", this.plotBorder = d = b.rect().addClass("highcharts-plot-border").attr({ zIndex: 1 }).add()); d.attr({ stroke: a.plotBorderColor, "stroke-width": a.plotBorderWidth || 0, fill: "none" }); d[A](d.crisp({ x: l, y: q, width: t, height: p }, -d.strokeWidth())); this.isDirtyBox = !1
            }, propFromSeries: function () {
                var a = this, b = a.options.chart, c, g = a.options.series, k, e; n(["inverted", "angular", "polar"],
                function (d) { c = N[b.type || b.defaultSeriesType]; e = b[d] || c && c.prototype[d]; for (k = g && g.length; !e && k--;) (c = N[g[k].type]) && c.prototype[d] && (e = !0); a[d] = e })
            }, linkSeries: function () { var a = this, b = a.series; n(b, function (a) { a.linkedSeries.length = 0 }); n(b, function (b) { var c = b.options.linkedTo; e(c) && (c = ":previous" === c ? a.series[b.index - 1] : a.get(c)) && c.linkedParent !== b && (c.linkedSeries.push(b), b.linkedParent = c, b.visible = w(b.options.visible, c.options.visible, b.visible)) }) }, renderSeries: function () {
                n(this.series, function (a) {
                    a.translate();
                    a.render()
                })
            }, renderLabels: function () { var a = this, b = a.options.labels; b.items && n(b.items, function (c) { var g = y(b.style, c.style), k = K(g.left) + a.plotLeft, e = K(g.top) + a.plotTop + 12; delete g.left; delete g.top; a.renderer.text(c.html, k, e).attr({ zIndex: 2 }).css(g).add() }) }, render: function () {
                var a = this.axes, b = this.renderer, c = this.options, g, k, e; this.setTitle(); this.legend = new r(this, c.legend); this.getStacks && this.getStacks(); this.getMargins(!0); this.setChartSize(); c = this.plotWidth; g = this.plotHeight -= 21; n(a, function (a) { a.setScale() });
                this.getAxisMargins(); k = 1.1 < c / this.plotWidth; e = 1.05 < g / this.plotHeight; if (k || e) n(a, function (a) { (a.horiz && k || !a.horiz && e) && a.setTickInterval(!0) }), this.getMargins(); this.drawChartBox(); this.hasCartesianSeries && n(a, function (a) { a.visible && a.render() }); this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({ zIndex: 3 }).add()); this.renderSeries(); this.renderLabels(); this.addCredits(); this.setResponsive && this.setResponsive(); this.hasRendered = !0
            }, addCredits: function (a) {
                var b = this; a = A(!0, this.options.credits,
                a); a.enabled && !this.credits && (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function () { a.href && (M.location.href = a.href) }).attr({ align: a.position.align, zIndex: 8 }).css(a.style).add().align(a.position), this.credits.update = function (a) { b.credits = b.credits.destroy(); b.addCredits(a) })
            }, destroy: function () {
                var b = this, c = b.axes, g = b.series, k = b.container, e, d = k && k.parentNode; m(b, "destroy"); u[b.index] = void 0; a.chartCount--; b.renderTo.removeAttribute("data-highcharts-chart");
                J(b); for (e = c.length; e--;) c[e] = c[e].destroy(); this.scroller && this.scroller.destroy && this.scroller.destroy(); for (e = g.length; e--;) g[e] = g[e].destroy(); n("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "), function (a) { var c = b[a]; c && c.destroy && (b[a] = c.destroy()) }); k && (k.innerHTML = "", J(k), d && l(k)); for (e in b) delete b[e]
            }, isReadyToRender: function () {
                var a = this; return B || M != M.top || "complete" ===
                h.readyState ? !0 : (h.attachEvent("onreadystatechange", function () { h.detachEvent("onreadystatechange", a.firstRender); "complete" === h.readyState && a.firstRender() }), !1)
            }, firstRender: function () {
                var a = this, b = a.options; if (a.isReadyToRender()) {
                    a.getContainer(); m(a, "init"); a.resetMargins(); a.setChartSize(); a.propFromSeries(); a.getAxes(); n(b.series || [], function (b) { a.initSeries(b) }); a.linkSeries(); m(a, "beforeRender"); k && (a.pointer = new k(a, b)); a.render(); a.renderer.draw(); if (!a.renderer.imgCount && a.onload) a.onload();
                    a.cloneRenderTo(!0)
                }
            }, onload: function () { n([this.callback].concat(this.callbacks), function (a) { a && void 0 !== this.index && a.apply(this, [this]) }, this); m(this, "load"); c(this.index) && !1 !== this.options.chart.reflow && this.initReflow(); this.onload = null }
        }
    })(L); (function (a) {
        var D, C = a.each, G = a.extend, I = a.erase, h = a.fireEvent, f = a.format, p = a.isArray, v = a.isNumber, l = a.pick, u = a.removeEvent; D = a.Point = function () { }; D.prototype = {
            init: function (a, c, f) {
                this.series = a; this.color = a.color; this.applyOptions(c, f); a.options.colorByPoint ?
                (c = a.options.colors || a.chart.options.colors, this.color = this.color || c[a.colorCounter], c = c.length, f = a.colorCounter, a.colorCounter++, a.colorCounter === c && (a.colorCounter = 0)) : f = a.colorIndex; this.colorIndex = l(this.colorIndex, f); a.chart.pointCount++; return this
            }, applyOptions: function (a, c) {
                var d = this.series, f = d.options.pointValKey || d.pointValKey; a = D.prototype.optionsToObject.call(this, a); G(this, a); this.options = this.options ? G(this.options, a) : a; a.group && delete this.group; f && (this.y = this[f]); this.isNull = l(this.isValid &&
                !this.isValid(), null === this.x || !v(this.y, !0)); this.selected && (this.state = "select"); "name" in this && void 0 === c && d.xAxis && d.xAxis.hasNames && (this.x = d.xAxis.nameToX(this)); void 0 === this.x && d && (this.x = void 0 === c ? d.autoIncrement(this) : c); return this
            }, optionsToObject: function (a) {
                var c = {}, d = this.series, f = d.options.keys, h = f || d.pointArrayMap || ["y"], m = h.length, b = 0, l = 0; if (v(a) || null === a) c[h[0]] = a; else if (p(a)) for (!f && a.length > m && (d = typeof a[0], "string" === d ? c.name = a[0] : "number" === d && (c.x = a[0]), b++) ; l < m;) f && void 0 ===
                a[b] || (c[h[l]] = a[b]), b++, l++; else "object" === typeof a && (c = a, a.dataLabels && (d._hasPointLabels = !0), a.marker && (d._hasPointMarkers = !0)); return c
            }, getClassName: function () { return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className : "") },
            getZone: function () { var a = this.series, c = a.zones, a = a.zoneAxis || "y", f = 0, h; for (h = c[f]; this[a] >= h.value;) h = c[++f]; h && h.color && !this.options.color && (this.color = h.color); return h }, destroy: function () { var a = this.series.chart, c = a.hoverPoints, f; a.pointCount--; c && (this.setState(), I(c, this), c.length || (a.hoverPoints = null)); if (this === a.hoverPoint) this.onMouseOut(); if (this.graphic || this.dataLabel) u(this), this.destroyElements(); this.legendItem && a.legend.destroyItem(this); for (f in this) this[f] = null }, destroyElements: function () {
                for (var a =
                ["graphic", "dataLabel", "dataLabelUpper", "connector", "shadowGroup"], c, f = 6; f--;) c = a[f], this[c] && (this[c] = this[c].destroy())
            }, getLabelConfig: function () { return { x: this.category, y: this.y, color: this.color, key: this.name || this.category, series: this.series, point: this, percentage: this.percentage, total: this.total || this.stackTotal } }, tooltipFormatter: function (a) {
                var c = this.series, d = c.tooltipOptions, h = l(d.valueDecimals, ""), t = d.valuePrefix || "", m = d.valueSuffix || ""; C(c.pointArrayMap || ["y"], function (b) {
                    b = "{point." + b;
                    if (t || m) a = a.replace(b + "}", t + b + "}" + m); a = a.replace(b + "}", b + ":,." + h + "f}")
                }); return f(a, { point: this, series: this.series })
            }, firePointEvent: function (a, c, f) { var d = this, n = this.series.options; (n.point.events[a] || d.options && d.options.events && d.options.events[a]) && this.importEvents(); "click" === a && n.allowPointSelect && (f = function (a) { d.select && d.select(null, a.ctrlKey || a.metaKey || a.shiftKey) }); h(this, a, c, f) }, visible: !0
        }
    })(L); (function (a) {
        var D = a.addEvent, C = a.animObject, G = a.arrayMax, I = a.arrayMin, h = a.correctFloat,
        f = a.Date, p = a.defaultOptions, v = a.defaultPlotOptions, l = a.defined, u = a.each, d = a.erase, c = a.extend, n = a.fireEvent, y = a.grep, t = a.isArray, m = a.isNumber, b = a.isString, q = a.merge, z = a.pick, F = a.removeEvent, e = a.splat, r = a.SVGElement, x = a.syncTimeout, A = a.win; a.Series = a.seriesType("line", null, {
            lineWidth: 2, allowPointSelect: !1, showCheckbox: !1, animation: { duration: 1E3 }, events: {}, marker: {
                lineWidth: 0, lineColor: "#ffffff", radius: 4, states: {
                    hover: { animation: { duration: 50 }, enabled: !0, radiusPlus: 2, lineWidthPlus: 1 }, select: {
                        fillColor: "#cccccc",
                        lineColor: "#000000", lineWidth: 2
                    }
                }
            }, point: { events: {} }, dataLabels: { align: "center", formatter: function () { return null === this.y ? "" : a.numberFormat(this.y, -1) }, style: { fontSize: "11px", fontWeight: "bold", color: "contrast", textOutline: "1px contrast" }, verticalAlign: "bottom", x: 0, y: 0, padding: 5 }, cropThreshold: 300, pointRange: 0, softThreshold: !0, states: { hover: { lineWidthPlus: 1, marker: {}, halo: { size: 10, opacity: .25 } }, select: { marker: {} } }, stickyTracking: !0, turboThreshold: 1E3
        }, {
            isCartesian: !0, pointClass: a.Point, sorted: !0, requireSorting: !0,
            directTouch: !1, axisTypes: ["xAxis", "yAxis"], colorCounter: 0, parallelArrays: ["x", "y"], coll: "series", init: function (a, b) {
                var k = this, e, d, g = a.series, f; k.chart = a; k.options = b = k.setOptions(b); k.linkedSeries = []; k.bindAxes(); c(k, { name: b.name, state: "", visible: !1 !== b.visible, selected: !0 === b.selected }); d = b.events; for (e in d) D(k, e, d[e]); if (d && d.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0; k.getColor(); k.getSymbol(); u(k.parallelArrays, function (a) { k[a + "Data"] = [] }); k.setData(b.data,
                !1); k.isCartesian && (a.hasCartesianSeries = !0); g.length && (f = g[g.length - 1]); k._i = z(f && f._i, -1) + 1; for (a = this.insert(g) ; a < g.length; a++) g[a].index = a, g[a].name = g[a].name || "Series " + (g[a].index + 1)
            }, insert: function (a) { var b = this.options.index, c; if (m(b)) { for (c = a.length; c--;) if (b >= z(a[c].options.index, a[c]._i)) { a.splice(c + 1, 0, this); break } -1 === c && a.unshift(this); c += 1 } else a.push(this); return z(c, a.length - 1) }, bindAxes: function () {
                var b = this, c = b.options, e = b.chart, d; u(b.axisTypes || [], function (k) {
                    u(e[k], function (a) {
                        d =
                        a.options; if (c[k] === d.index || void 0 !== c[k] && c[k] === d.id || void 0 === c[k] && 0 === d.index) b.insert(a.series), b[k] = a, a.isDirty = !0
                    }); b[k] || b.optionalAxis === k || a.error(18, !0)
                })
            }, updateParallelArrays: function (a, b) { var c = a.series, k = arguments, e = m(b) ? function (g) { var k = "y" === g && c.toYData ? c.toYData(a) : a[g]; c[g + "Data"][b] = k } : function (a) { Array.prototype[b].apply(c[a + "Data"], Array.prototype.slice.call(k, 2)) }; u(c.parallelArrays, e) }, autoIncrement: function () {
                var a = this.options, b = this.xIncrement, c, e = a.pointIntervalUnit,
                b = z(b, a.pointStart, 0); this.pointInterval = c = z(this.pointInterval, a.pointInterval, 1); e && (a = new f(b), "day" === e ? a = +a[f.hcSetDate](a[f.hcGetDate]() + c) : "month" === e ? a = +a[f.hcSetMonth](a[f.hcGetMonth]() + c) : "year" === e && (a = +a[f.hcSetFullYear](a[f.hcGetFullYear]() + c)), c = a - b); this.xIncrement = b + c; return b
            }, setOptions: function (a) {
                var b = this.chart, c = b.options.plotOptions, b = b.userOptions || {}, k = b.plotOptions || {}, e = c[this.type]; this.userOptions = a; c = q(e, c.series, a); this.tooltipOptions = q(p.tooltip, p.plotOptions[this.type].tooltip,
                b.tooltip, k.series && k.series.tooltip, k[this.type] && k[this.type].tooltip, a.tooltip); null === e.marker && delete c.marker; this.zoneAxis = c.zoneAxis; a = this.zones = (c.zones || []).slice(); !c.negativeColor && !c.negativeFillColor || c.zones || a.push({ value: c[this.zoneAxis + "Threshold"] || c.threshold || 0, className: "highcharts-negative", color: c.negativeColor, fillColor: c.negativeFillColor }); a.length && l(a[a.length - 1].value) && a.push({ color: this.color, fillColor: this.fillColor }); return c
            }, getCyclic: function (a, b, c) {
                var k, e = this.userOptions,
                g = a + "Index", d = a + "Counter", f = c ? c.length : z(this.chart.options.chart[a + "Count"], this.chart[a + "Count"]); b || (k = z(e[g], e["_" + g]), l(k) || (e["_" + g] = k = this.chart[d] % f, this.chart[d] += 1), c && (b = c[k])); void 0 !== k && (this[g] = k); this[a] = b
            }, getColor: function () { this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || v[this.type].color, this.chart.options.colors) }, getSymbol: function () { this.getCyclic("symbol", this.options.marker.symbol, this.chart.options.symbols) }, drawLegendSymbol: a.LegendSymbolMixin.drawLineMarker,
            setData: function (c, e, d, f) {
                var k = this, g = k.points, h = g && g.length || 0, n, r = k.options, w = k.chart, l = null, q = k.xAxis, p = r.turboThreshold, x = this.xData, A = this.yData, F = (n = k.pointArrayMap) && n.length; c = c || []; n = c.length; e = z(e, !0); if (!1 !== f && n && h === n && !k.cropped && !k.hasGroupedData && k.visible) u(c, function (a, b) { g[b].update && a !== r.data[b] && g[b].update(a, !1, null, !1) }); else {
                    k.xIncrement = null; k.colorCounter = 0; u(this.parallelArrays, function (a) { k[a + "Data"].length = 0 }); if (p && n > p) {
                        for (d = 0; null === l && d < n;) l = c[d], d++; if (m(l)) for (d =
                        0; d < n; d++) x[d] = this.autoIncrement(), A[d] = c[d]; else if (t(l)) if (F) for (d = 0; d < n; d++) l = c[d], x[d] = l[0], A[d] = l.slice(1, F + 1); else for (d = 0; d < n; d++) l = c[d], x[d] = l[0], A[d] = l[1]; else a.error(12)
                    } else for (d = 0; d < n; d++) void 0 !== c[d] && (l = { series: k }, k.pointClass.prototype.applyOptions.apply(l, [c[d]]), k.updateParallelArrays(l, d)); b(A[0]) && a.error(14, !0); k.data = []; k.options.data = k.userOptions.data = c; for (d = h; d--;) g[d] && g[d].destroy && g[d].destroy(); q && (q.minRange = q.userMinRange); k.isDirty = w.isDirtyBox = !0; k.isDirtyData =
                    !!g; d = !1
                } "point" === r.legendType && (this.processData(), this.generatePoints()); e && w.redraw(d)
            }, processData: function (b) {
                var c = this.xData, k = this.yData, e = c.length, d; d = 0; var g, f, m = this.xAxis, h, n = this.options; h = n.cropThreshold; var l = this.getExtremesFromAll || n.getExtremesFromAll, r = this.isCartesian, n = m && m.val2lin, q = m && m.isLog, t, p; if (r && !this.isDirty && !m.isDirty && !this.yAxis.isDirty && !b) return !1; m && (b = m.getExtremes(), t = b.min, p = b.max); if (r && this.sorted && !l && (!h || e > h || this.forceCrop)) if (c[e - 1] < t || c[0] > p) c = [],
                k = []; else if (c[0] < t || c[e - 1] > p) d = this.cropData(this.xData, this.yData, t, p), c = d.xData, k = d.yData, d = d.start, g = !0; for (h = c.length || 1; --h;) e = q ? n(c[h]) - n(c[h - 1]) : c[h] - c[h - 1], 0 < e && (void 0 === f || e < f) ? f = e : 0 > e && this.requireSorting && a.error(15); this.cropped = g; this.cropStart = d; this.processedXData = c; this.processedYData = k; this.closestPointRange = f
            }, cropData: function (a, b, c, e) {
                var k = a.length, g = 0, d = k, f = z(this.cropShoulder, 1), h; for (h = 0; h < k; h++) if (a[h] >= c) { g = Math.max(0, h - f); break } for (c = h; c < k; c++) if (a[c] > e) { d = c + f; break } return {
                    xData: a.slice(g,
                    d), yData: b.slice(g, d), start: g, end: d
                }
            }, generatePoints: function () {
                var a = this.options.data, b = this.data, c, d = this.processedXData, f = this.processedYData, g = this.pointClass, h = d.length, m = this.cropStart || 0, n, r = this.hasGroupedData, l, q = [], t; b || r || (b = [], b.length = a.length, b = this.data = b); for (t = 0; t < h; t++) n = m + t, r ? (l = (new g).init(this, [d[t]].concat(e(f[t]))), l.dataGroup = this.groupMap[t]) : (l = b[n]) || void 0 === a[n] || (b[n] = l = (new g).init(this, a[n], d[t])), l.index = n, q[t] = l; if (b && (h !== (c = b.length) || r)) for (t = 0; t < c; t++) t !== m ||
                r || (t += h), b[t] && (b[t].destroyElements(), b[t].plotX = void 0); this.data = b; this.points = q
            }, getExtremes: function (a) {
                var b = this.yAxis, c = this.processedXData, e, k = [], g = 0; e = this.xAxis.getExtremes(); var d = e.min, f = e.max, h, n, l, r; a = a || this.stackedYData || this.processedYData || []; e = a.length; for (r = 0; r < e; r++) if (n = c[r], l = a[r], h = (m(l, !0) || t(l)) && (!b.isLog || l.length || 0 < l), n = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (c[r + 1] || n) >= d && (c[r - 1] || n) <= f, h && n) if (h = l.length) for (; h--;) null !== l[h] && (k[g++] =
                l[h]); else k[g++] = l; this.dataMin = I(k); this.dataMax = G(k)
            }, translate: function () {
                this.processedXData || this.processData(); this.generatePoints(); var a = this.options, b = a.stacking, c = this.xAxis, e = c.categories, d = this.yAxis, g = this.points, f = g.length, n = !!this.modifyValue, r = a.pointPlacement, t = "between" === r || m(r), q = a.threshold, p = a.startFromThreshold ? q : 0, x, u, A, F, v = Number.MAX_VALUE; "between" === r && (r = .5); m(r) && (r *= z(a.pointRange || c.pointRange)); for (a = 0; a < f; a++) {
                    var y = g[a], C = y.x, D = y.y; u = y.low; var G = b && d.stacks[(this.negStacks &&
                    D < (p ? 0 : q) ? "-" : "") + this.stackKey], I; d.isLog && null !== D && 0 >= D && (y.isNull = !0); y.plotX = x = h(Math.min(Math.max(-1E5, c.translate(C, 0, 0, 0, 1, r, "flags" === this.type)), 1E5)); b && this.visible && !y.isNull && G && G[C] && (F = this.getStackIndicator(F, C, this.index), I = G[C], D = I.points[F.key], u = D[0], D = D[1], u === p && F.key === G[C].base && (u = z(q, d.min)), d.isLog && 0 >= u && (u = null), y.total = y.stackTotal = I.total, y.percentage = I.total && y.y / I.total * 100, y.stackY = D, I.setOffset(this.pointXOffset || 0, this.barW || 0)); y.yBottom = l(u) ? d.translate(u, 0,
                    1, 0, 1) : null; n && (D = this.modifyValue(D, y)); y.plotY = u = "number" === typeof D && Infinity !== D ? Math.min(Math.max(-1E5, d.translate(D, 0, 1, 0, 1)), 1E5) : void 0; y.isInside = void 0 !== u && 0 <= u && u <= d.len && 0 <= x && x <= c.len; y.clientX = t ? h(c.translate(C, 0, 0, 0, 1, r)) : x; y.negative = y.y < (q || 0); y.category = e && void 0 !== e[y.x] ? e[y.x] : y.x; y.isNull || (void 0 !== A && (v = Math.min(v, Math.abs(x - A))), A = x); y.zone = this.zones.length && y.getZone()
                } this.closestPointRangePx = v
            }, getValidPoints: function (a, b) {
                var c = this.chart; return y(a || this.points || [],
                function (a) { return b && !c.isInsidePlot(a.plotX, a.plotY, c.inverted) ? !1 : !a.isNull })
            }, setClip: function (a) {
                var b = this.chart, c = this.options, e = b.renderer, k = b.inverted, g = this.clipBox, d = g || b.clipBox, f = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, d.height, c.xAxis, c.yAxis].join(), h = b[f], m = b[f + "m"]; h || (a && (d.width = 0, b[f + "m"] = m = e.clipRect(-99, k ? -b.plotLeft : -b.plotTop, 99, k ? b.chartWidth : b.chartHeight)), b[f] = h = e.clipRect(d), h.count = { length: 0 }); a && !h.count[this.index] && (h.count[this.index] = !0, h.count.length +=
                1); !1 !== c.clip && (this.group.clip(a || g ? h : b.clipRect), this.markerGroup.clip(m), this.sharedClipKey = f); a || (h.count[this.index] && (delete h.count[this.index], --h.count.length), 0 === h.count.length && f && b[f] && (g || (b[f] = b[f].destroy()), b[f + "m"] && (b[f + "m"] = b[f + "m"].destroy())))
            }, animate: function (a) { var b = this.chart, c = C(this.options.animation), e; a ? this.setClip(c) : (e = this.sharedClipKey, (a = b[e]) && a.animate({ width: b.plotSizeX }, c), b[e + "m"] && b[e + "m"].animate({ width: b.plotSizeX + 99 }, c), this.animate = null) }, afterAnimate: function () {
                this.setClip();
                n(this, "afterAnimate")
            }, drawPoints: function () {
                var a = this.points, b = this.chart, c, e, d, g, f = this.options.marker, h, n, r, l, t = this.markerGroup, q = z(f.enabled, this.xAxis.isRadial ? !0 : null, this.closestPointRangePx > 2 * f.radius); if (!1 !== f.enabled || this._hasPointMarkers) for (e = a.length; e--;) d = a[e], c = d.plotY, g = d.graphic, h = d.marker || {}, n = !!d.marker, r = q && void 0 === h.enabled || h.enabled, l = d.isInside, r && m(c) && null !== d.y ? (c = z(h.symbol, this.symbol), d.hasImage = 0 === c.indexOf("url"), r = this.markerAttribs(d, d.selected && "select"),
                g ? g[l ? "show" : "hide"](!0).animate(r) : l && (0 < r.width || d.hasImage) && (d.graphic = g = b.renderer.symbol(c, r.x, r.y, r.width, r.height, n ? h : f).add(t)), g && g.attr(this.pointAttribs(d, d.selected && "select")), g && g.addClass(d.getClassName(), !0)) : g && (d.graphic = g.destroy())
            }, markerAttribs: function (a, b) {
                var c = this.options.marker, e = a && a.options, k = e && e.marker || {}, e = z(k.radius, c.radius); b && (c = c.states[b], b = k.states && k.states[b], e = z(b && b.radius, c && c.radius, e + (c && c.radiusPlus || 0))); a.hasImage && (e = 0); a = {
                    x: Math.floor(a.plotX) -
                    e, y: a.plotY - e
                }; e && (a.width = a.height = 2 * e); return a
            }, pointAttribs: function (a, b) {
                var c = this.options.marker, e = a && a.options, k = e && e.marker || {}, g = this.color, d = e && e.color, f = a && a.color, e = z(k.lineWidth, c.lineWidth); a = a && a.zone && a.zone.color; g = d || a || f || g; a = k.fillColor || c.fillColor || g; g = k.lineColor || c.lineColor || g; b && (c = c.states[b], b = k.states && k.states[b] || {}, e = z(b.lineWidth, c.lineWidth, e + z(b.lineWidthPlus, c.lineWidthPlus, 0)), a = b.fillColor || c.fillColor || a, g = b.lineColor || c.lineColor || g); return {
                    stroke: g, "stroke-width": e,
                    fill: a
                }
            }, destroy: function () {
                var a = this, b = a.chart, c = /AppleWebKit\/533/.test(A.navigator.userAgent), e, f = a.data || [], g, h, m; n(a, "destroy"); F(a); u(a.axisTypes || [], function (b) { (m = a[b]) && m.series && (d(m.series, a), m.isDirty = m.forceRedraw = !0) }); a.legendItem && a.chart.legend.destroyItem(a); for (e = f.length; e--;) (g = f[e]) && g.destroy && g.destroy(); a.points = null; clearTimeout(a.animationTimeout); for (h in a) a[h] instanceof r && !a[h].survive && (e = c && "group" === h ? "hide" : "destroy", a[h][e]()); b.hoverSeries === a && (b.hoverSeries =
                null); d(b.series, a); for (h in a) delete a[h]
            }, getGraphPath: function (a, b, c) {
                var e = this, k = e.options, g = k.step, d, f = [], h = [], m; a = a || e.points; (d = a.reversed) && a.reverse(); (g = { right: 1, center: 2 }[g] || g && 3) && d && (g = 4 - g); !k.connectNulls || b || c || (a = this.getValidPoints(a)); u(a, function (d, n) {
                    var r = d.plotX, t = d.plotY, q = a[n - 1]; (d.leftCliff || q && q.rightCliff) && !c && (m = !0); d.isNull && !l(b) && 0 < n ? m = !k.connectNulls : d.isNull && !b ? m = !0 : (0 === n || m ? n = ["M", d.plotX, d.plotY] : e.getPointSpline ? n = e.getPointSpline(a, d, n) : g ? (n = 1 === g ? ["L", q.plotX,
                    t] : 2 === g ? ["L", (q.plotX + r) / 2, q.plotY, "L", (q.plotX + r) / 2, t] : ["L", r, q.plotY], n.push("L", r, t)) : n = ["L", r, t], h.push(d.x), g && h.push(d.x), f.push.apply(f, n), m = !1)
                }); f.xMap = h; return e.graphPath = f
            }, drawGraph: function () {
                var a = this, b = this.options, c = (this.gappedPath || this.getGraphPath).call(this), e = [["graph", "highcharts-graph", b.lineColor || this.color, b.dashStyle]]; u(this.zones, function (c, g) { e.push(["zone-graph-" + g, "highcharts-graph highcharts-zone-graph-" + g + " " + (c.className || ""), c.color || a.color, c.dashStyle || b.dashStyle]) });
                u(e, function (e, g) { var k = e[0], d = a[k]; d ? (d.endX = c.xMap, d.animate({ d: c })) : c.length && (a[k] = a.chart.renderer.path(c).addClass(e[1]).attr({ zIndex: 1 }).add(a.group), d = { stroke: e[2], "stroke-width": b.lineWidth, fill: a.fillGraph && a.color || "none" }, e[3] ? d.dashstyle = e[3] : "square" !== b.linecap && (d["stroke-linecap"] = d["stroke-linejoin"] = "round"), d = a[k].attr(d).shadow(2 > g && b.shadow)); d && (d.startX = c.xMap, d.isArea = c.isArea) })
            }, applyZones: function () {
                var a = this, b = this.chart, c = b.renderer, e = this.zones, d, g, f = this.clips || [],
                h, m = this.graph, n = this.area, r = Math.max(b.chartWidth, b.chartHeight), l = this[(this.zoneAxis || "y") + "Axis"], q, t, p = b.inverted, x, A, F, y, v = !1; e.length && (m || n) && l && void 0 !== l.min && (t = l.reversed, x = l.horiz, m && m.hide(), n && n.hide(), q = l.getExtremes(), u(e, function (e, k) {
                    d = t ? x ? b.plotWidth : 0 : x ? 0 : l.toPixels(q.min); d = Math.min(Math.max(z(g, d), 0), r); g = Math.min(Math.max(Math.round(l.toPixels(z(e.value, q.max), !0)), 0), r); v && (d = g = l.toPixels(q.max)); A = Math.abs(d - g); F = Math.min(d, g); y = Math.max(d, g); l.isXAxis ? (h = {
                        x: p ? y : F, y: 0, width: A,
                        height: r
                    }, x || (h.x = b.plotHeight - h.x)) : (h = { x: 0, y: p ? y : F, width: r, height: A }, x && (h.y = b.plotWidth - h.y)); p && c.isVML && (h = l.isXAxis ? { x: 0, y: t ? F : y, height: h.width, width: b.chartWidth } : { x: h.y - b.plotLeft - b.spacingBox.x, y: 0, width: h.height, height: b.chartHeight }); f[k] ? f[k].animate(h) : (f[k] = c.clipRect(h), m && a["zone-graph-" + k].clip(f[k]), n && a["zone-area-" + k].clip(f[k])); v = e.value > q.max
                }), this.clips = f)
            }, invertGroups: function (a) {
                function b() {
                    var b = { width: c.yAxis.len, height: c.xAxis.len }; u(["group", "markerGroup"], function (e) {
                        c[e] &&
                        c[e].attr(b).invert(a)
                    })
                } var c = this, e; c.xAxis && (e = D(c.chart, "resize", b), D(c, "destroy", e), b(a), c.invertGroups = b)
            }, plotGroup: function (a, b, c, e, d) { var g = this[a], k = !g; k && (this[a] = g = this.chart.renderer.g(b).attr({ zIndex: e || .1 }).add(d), g.addClass("highcharts-series-" + this.index + " highcharts-" + this.type + "-series highcharts-color-" + this.colorIndex + " " + (this.options.className || ""))); g.attr({ visibility: c })[k ? "attr" : "animate"](this.getPlotBox()); return g }, getPlotBox: function () {
                var a = this.chart, b = this.xAxis, c =
                this.yAxis; a.inverted && (b = c, c = this.xAxis); return { translateX: b ? b.left : a.plotLeft, translateY: c ? c.top : a.plotTop, scaleX: 1, scaleY: 1 }
            }, render: function () {
                var a = this, b = a.chart, c, e = a.options, d = !!a.animate && b.renderer.isSVG && C(e.animation).duration, g = a.visible ? "inherit" : "hidden", f = e.zIndex, h = a.hasRendered, m = b.seriesGroup, n = b.inverted; c = a.plotGroup("group", "series", g, f, m); a.markerGroup = a.plotGroup("markerGroup", "markers", g, f, m); d && a.animate(!0); c.inverted = a.isCartesian ? n : !1; a.drawGraph && (a.drawGraph(), a.applyZones());
                a.drawDataLabels && a.drawDataLabels(); a.visible && a.drawPoints(); a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker(); a.invertGroups(n); !1 === e.clip || a.sharedClipKey || h || c.clip(b.clipRect); d && a.animate(); h || (a.animationTimeout = x(function () { a.afterAnimate() }, d)); a.isDirty = a.isDirtyData = !1; a.hasRendered = !0
            }, redraw: function () {
                var a = this.chart, b = this.isDirty || this.isDirtyData, c = this.group, e = this.xAxis, d = this.yAxis; c && (a.inverted && c.attr({ width: a.plotWidth, height: a.plotHeight }), c.animate({
                    translateX: z(e &&
                    e.left, a.plotLeft), translateY: z(d && d.top, a.plotTop)
                })); this.translate(); this.render(); b && delete this.kdTree
            }, kdDimensions: 1, kdAxisArray: ["clientX", "plotY"], searchPoint: function (a, b) { var c = this.xAxis, e = this.yAxis, d = this.chart.inverted; return this.searchKDTree({ clientX: d ? c.len - a.chartY + c.pos : a.chartX - c.pos, plotY: d ? e.len - a.chartX + e.pos : a.chartY - e.pos }, b) }, buildKDTree: function () {
                function a(c, e, g) {
                    var d, k; if (k = c && c.length) return d = b.kdAxisArray[e % g], c.sort(function (a, b) { return a[d] - b[d] }), k = Math.floor(k /
                    2), { point: c[k], left: a(c.slice(0, k), e + 1, g), right: a(c.slice(k + 1), e + 1, g) }
                } var b = this, c = b.kdDimensions; delete b.kdTree; x(function () { b.kdTree = a(b.getValidPoints(null, !b.directTouch), c, c) }, b.options.kdNow ? 0 : 1)
            }, searchKDTree: function (a, b) {
                function c(a, b, f, h) {
                    var m = b.point, n = e.kdAxisArray[f % h], r, q, t = m; q = l(a[d]) && l(m[d]) ? Math.pow(a[d] - m[d], 2) : null; r = l(a[g]) && l(m[g]) ? Math.pow(a[g] - m[g], 2) : null; r = (q || 0) + (r || 0); m.dist = l(r) ? Math.sqrt(r) : Number.MAX_VALUE; m.distX = l(q) ? Math.sqrt(q) : Number.MAX_VALUE; n = a[n] - m[n]; r =
                    0 > n ? "left" : "right"; q = 0 > n ? "right" : "left"; b[r] && (r = c(a, b[r], f + 1, h), t = r[k] < t[k] ? r : m); b[q] && Math.sqrt(n * n) < t[k] && (a = c(a, b[q], f + 1, h), t = a[k] < t[k] ? a : t); return t
                } var e = this, d = this.kdAxisArray[0], g = this.kdAxisArray[1], k = b ? "distX" : "dist"; this.kdTree || this.buildKDTree(); if (this.kdTree) return c(a, this.kdTree, this.kdDimensions, this.kdDimensions)
            }
        })
    })(L); (function (a) {
        function D(a, d, c, f, h) {
            var n = a.chart.inverted; this.axis = a; this.isNegative = c; this.options = d; this.x = f; this.total = null; this.points = {}; this.stack = h; this.rightCliff =
            this.leftCliff = 0; this.alignOptions = { align: d.align || (n ? c ? "left" : "right" : "center"), verticalAlign: d.verticalAlign || (n ? "middle" : c ? "bottom" : "top"), y: l(d.y, n ? 4 : c ? 14 : -6), x: l(d.x, n ? c ? -6 : 6 : 0) }; this.textAlign = d.textAlign || (n ? c ? "right" : "left" : "center")
        } var C = a.Axis, G = a.Chart, I = a.correctFloat, h = a.defined, f = a.destroyObjectProperties, p = a.each, v = a.format, l = a.pick; a = a.Series; D.prototype = {
            destroy: function () { f(this, this.axis) }, render: function (a) {
                var d = this.options, c = d.format, c = c ? v(c, this) : d.formatter.call(this); this.label ?
                this.label.attr({ text: c, visibility: "hidden" }) : this.label = this.axis.chart.renderer.text(c, null, null, d.useHTML).css(d.style).attr({ align: this.textAlign, rotation: d.rotation, visibility: "hidden" }).add(a)
            }, setOffset: function (a, d) {
                var c = this.axis, f = c.chart, h = f.inverted, l = c.reversed, l = this.isNegative && !l || !this.isNegative && l, m = c.translate(c.usePercentage ? 100 : this.total, 0, 0, 0, 1), c = c.translate(0), c = Math.abs(m - c); a = f.xAxis[0].translate(this.x) + a; var b = f.plotHeight, h = {
                    x: h ? l ? m : m - c : a, y: h ? b - a - d : l ? b - m - c : b - m, width: h ?
                        c : d, height: h ? d : c
                }; if (d = this.label) d.align(this.alignOptions, null, h), h = d.alignAttr, d[!1 === this.options.crop || f.isInsidePlot(h.x, h.y) ? "show" : "hide"](!0)
            }
        }; G.prototype.getStacks = function () { var a = this; p(a.yAxis, function (a) { a.stacks && a.hasVisibleSeries && (a.oldStacks = a.stacks) }); p(a.series, function (d) { !d.options.stacking || !0 !== d.visible && !1 !== a.options.chart.ignoreHiddenSeries || (d.stackKey = d.type + l(d.options.stack, "")) }) }; C.prototype.buildStacks = function () {
            var a = this.series, d, c = l(this.options.reversedStacks,
            !0), f = a.length, h; if (!this.isXAxis) { this.usePercentage = !1; for (h = f; h--;) a[c ? h : f - h - 1].setStackedPoints(); for (h = f; h--;) d = a[c ? h : f - h - 1], d.setStackCliffs && d.setStackCliffs(); if (this.usePercentage) for (h = 0; h < f; h++) a[h].setPercentStacks() }
        }; C.prototype.renderStackTotals = function () { var a = this.chart, d = a.renderer, c = this.stacks, f, h, l = this.stackTotalGroup; l || (this.stackTotalGroup = l = d.g("stack-labels").attr({ visibility: "visible", zIndex: 6 }).add()); l.translate(a.plotLeft, a.plotTop); for (f in c) for (h in a = c[f], a) a[h].render(l) };
        C.prototype.resetStacks = function () { var a = this.stacks, d, c; if (!this.isXAxis) for (d in a) for (c in a[d]) a[d][c].touched < this.stacksTouched ? (a[d][c].destroy(), delete a[d][c]) : (a[d][c].total = null, a[d][c].cum = null) }; C.prototype.cleanStacks = function () { var a, d, c; if (!this.isXAxis) for (d in this.oldStacks && (a = this.stacks = this.oldStacks), a) for (c in a[d]) a[d][c].cum = a[d][c].total }; a.prototype.setStackedPoints = function () {
            if (this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) {
                var a =
                this.processedXData, d = this.processedYData, c = [], f = d.length, p = this.options, t = p.threshold, m = p.startFromThreshold ? t : 0, b = p.stack, p = p.stacking, q = this.stackKey, v = "-" + q, F = this.negStacks, e = this.yAxis, r = e.stacks, x = e.oldStacks, A, k, w, C, J, G, g; e.stacksTouched += 1; for (J = 0; J < f; J++) G = a[J], g = d[J], A = this.getStackIndicator(A, G, this.index), C = A.key, w = (k = F && g < (m ? 0 : t)) ? v : q, r[w] || (r[w] = {}), r[w][G] || (x[w] && x[w][G] ? (r[w][G] = x[w][G], r[w][G].total = null) : r[w][G] = new D(e, e.options.stackLabels, k, G, b)), w = r[w][G], null !== g && (w.points[C] =
                w.points[this.index] = [l(w.cum, m)], h(w.cum) || (w.base = C), w.touched = e.stacksTouched, 0 < A.index && !1 === this.singleStacks && (w.points[C][0] = w.points[this.index + "," + G + ",0"][0])), "percent" === p ? (k = k ? q : v, F && r[k] && r[k][G] ? (k = r[k][G], w.total = k.total = Math.max(k.total, w.total) + Math.abs(g) || 0) : w.total = I(w.total + (Math.abs(g) || 0))) : w.total = I(w.total + (g || 0)), w.cum = l(w.cum, m) + (g || 0), null !== g && (w.points[C].push(w.cum), c[J] = w.cum); "percent" === p && (e.usePercentage = !0); this.stackedYData = c; e.oldStacks = {}
            }
        }; a.prototype.setPercentStacks =
        function () { var a = this, d = a.stackKey, c = a.yAxis.stacks, f = a.processedXData, h; p([d, "-" + d], function (d) { for (var m = f.length, b, n; m--;) if (b = f[m], h = a.getStackIndicator(h, b, a.index, d), b = (n = c[d] && c[d][b]) && n.points[h.key]) n = n.total ? 100 / n.total : 0, b[0] = I(b[0] * n), b[1] = I(b[1] * n), a.stackedYData[m] = b[1] }) }; a.prototype.getStackIndicator = function (a, d, c, f) { !h(a) || a.x !== d || f && a.key !== f ? a = { x: d, index: 0, key: f } : a.index++; a.key = [c, d, a.index].join(); return a }
    })(L); (function (a) {
        var D = a.addEvent, C = a.animate, G = a.Axis, I = a.createElement,
        h = a.css, f = a.defined, p = a.each, v = a.erase, l = a.extend, u = a.fireEvent, d = a.inArray, c = a.isNumber, n = a.isObject, y = a.merge, t = a.pick, m = a.Point, b = a.Series, q = a.seriesTypes, z = a.setAnimation, F = a.splat; l(a.Chart.prototype, {
            addSeries: function (a, b, c) { var e, d = this; a && (b = t(b, !0), u(d, "addSeries", { options: a }, function () { e = d.initSeries(a); d.isDirtyLegend = !0; d.linkSeries(); b && d.redraw(c) })); return e }, addAxis: function (a, b, c, d) {
                var e = b ? "xAxis" : "yAxis", f = this.options; a = y(a, { index: this[e].length, isX: b }); new G(this, a); f[e] = F(f[e] ||
                {}); f[e].push(a); t(c, !0) && this.redraw(d)
            }, showLoading: function (a) {
                var b = this, c = b.options, e = b.loadingDiv, d = c.loading, f = function () { e && h(e, { left: b.plotLeft + "px", top: b.plotTop + "px", width: b.plotWidth + "px", height: b.plotHeight + "px" }) }; e || (b.loadingDiv = e = I("div", { className: "highcharts-loading highcharts-loading-hidden" }, null, b.container), b.loadingSpan = I("span", { className: "highcharts-loading-inner" }, null, e), D(b, "redraw", f)); e.className = "highcharts-loading"; b.loadingSpan.innerHTML = a || c.lang.loading; h(e, l(d.style,
                { zIndex: 10 })); h(b.loadingSpan, d.labelStyle); b.loadingShown || (h(e, { opacity: 0, display: "" }), C(e, { opacity: d.style.opacity || .5 }, { duration: d.showDuration || 0 })); b.loadingShown = !0; f()
            }, hideLoading: function () { var a = this.options, b = this.loadingDiv; b && (b.className = "highcharts-loading highcharts-loading-hidden", C(b, { opacity: 0 }, { duration: a.loading.hideDuration || 100, complete: function () { h(b, { display: "none" }) } })); this.loadingShown = !1 }, propsRequireDirtyBox: "backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
            propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions".split(" "), update: function (a, b) {
                var e, h = { credits: "addCredits", title: "setTitle", subtitle: "setSubtitle" }, k = a.chart, m, n; if (k) {
                    y(!0, this.options.chart, k); "className" in k && this.setClassName(k.className); if ("inverted" in k || "polar" in k) this.propFromSeries(), m = !0; for (e in k) k.hasOwnProperty(e) && (-1 !== d("chart." + e, this.propsRequireUpdateSeries) && (n = !0), -1 !== d(e, this.propsRequireDirtyBox) && (this.isDirtyBox =
                    !0)); "style" in k && this.renderer.setStyle(k.style)
                } for (e in a) { if (this[e] && "function" === typeof this[e].update) this[e].update(a[e], !1); else if ("function" === typeof this[h[e]]) this[h[e]](a[e]); "chart" !== e && -1 !== d(e, this.propsRequireUpdateSeries) && (n = !0) } a.colors && (this.options.colors = a.colors); a.plotOptions && y(!0, this.options.plotOptions, a.plotOptions); p(["xAxis", "yAxis", "series"], function (b) { a[b] && p(F(a[b]), function (a) { var c = f(a.id) && this.get(a.id) || this[b][0]; c && c.coll === b && c.update(a, !1) }, this) }, this);
                m && p(this.axes, function (a) { a.update({}, !1) }); n && p(this.series, function (a) { a.update({}, !1) }); a.loading && y(!0, this.options.loading, a.loading); e = k && k.width; k = k && k.height; c(e) && e !== this.chartWidth || c(k) && k !== this.chartHeight ? this.setSize(e, k) : t(b, !0) && this.redraw()
            }, setSubtitle: function (a) { this.setTitle(void 0, a) }
        }); l(m.prototype, {
            update: function (a, b, c, d) {
                function e() {
                    f.applyOptions(a); null === f.y && m && (f.graphic = m.destroy()); n(a, !0) && (m && m.element && a && a.marker && a.marker.symbol && (f.graphic = m.destroy()),
                    a && a.dataLabels && f.dataLabel && (f.dataLabel = f.dataLabel.destroy())); l = f.index; h.updateParallelArrays(f, l); r.data[l] = n(r.data[l], !0) ? f.options : a; h.isDirty = h.isDirtyData = !0; !h.fixedBox && h.hasCartesianSeries && (g.isDirtyBox = !0); "point" === r.legendType && (g.isDirtyLegend = !0); b && g.redraw(c)
                } var f = this, h = f.series, m = f.graphic, l, g = h.chart, r = h.options; b = t(b, !0); !1 === d ? e() : f.firePointEvent("update", { options: a }, e)
            }, remove: function (a, b) { this.series.removePoint(d(this, this.series.data), a, b) }
        }); l(b.prototype, {
            addPoint: function (a,
            b, c, d) {
                var e = this.options, f = this.data, h = this.chart, m = this.xAxis && this.xAxis.names, n = e.data, g, l, r = this.xData, q, p; b = t(b, !0); g = { series: this }; this.pointClass.prototype.applyOptions.apply(g, [a]); p = g.x; q = r.length; if (this.requireSorting && p < r[q - 1]) for (l = !0; q && r[q - 1] > p;) q--; this.updateParallelArrays(g, "splice", q, 0, 0); this.updateParallelArrays(g, q); m && g.name && (m[p] = g.name); n.splice(q, 0, a); l && (this.data.splice(q, 0, null), this.processData()); "point" === e.legendType && this.generatePoints(); c && (f[0] && f[0].remove ?
                f[0].remove(!1) : (f.shift(), this.updateParallelArrays(g, "shift"), n.shift())); this.isDirtyData = this.isDirty = !0; b && h.redraw(d)
            }, removePoint: function (a, b, c) { var e = this, d = e.data, f = d[a], h = e.points, m = e.chart, n = function () { h && h.length === d.length && h.splice(a, 1); d.splice(a, 1); e.options.data.splice(a, 1); e.updateParallelArrays(f || { series: e }, "splice", a, 1); f && f.destroy(); e.isDirty = !0; e.isDirtyData = !0; b && m.redraw() }; z(c, m); b = t(b, !0); f ? f.firePointEvent("remove", null, n) : n() }, remove: function (a, b, c) {
                function e() {
                    d.destroy();
                    f.isDirtyLegend = f.isDirtyBox = !0; f.linkSeries(); t(a, !0) && f.redraw(b)
                } var d = this, f = d.chart; !1 !== c ? u(d, "remove", null, e) : e()
            }, update: function (a, b) {
                var c = this, e = this.chart, d = this.userOptions, f = this.type, h = a.type || d.type || e.options.chart.type, m = q[f].prototype, n = ["group", "markerGroup", "dataLabelsGroup"], g; if (h && h !== f || void 0 !== a.zIndex) n.length = 0; p(n, function (a) { n[a] = c[a]; delete c[a] }); a = y(d, { animation: !1, index: this.index, pointStart: this.xData[0] }, { data: this.options.data }, a); this.remove(!1, null, !1); for (g in m) this[g] =
                void 0; l(this, q[h || f].prototype); p(n, function (a) { c[a] = n[a] }); this.init(e, a); e.linkSeries(); t(b, !0) && e.redraw(!1)
            }
        }); l(G.prototype, {
            update: function (a, b) { var c = this.chart; a = c.options[this.coll][this.options.index] = y(this.userOptions, a); this.destroy(!0); this.init(c, l(a, { events: void 0 })); c.isDirtyBox = !0; t(b, !0) && c.redraw() }, remove: function (a) {
                for (var b = this.chart, c = this.coll, e = this.series, d = e.length; d--;) e[d] && e[d].remove(!1); v(b.axes, this); v(b[c], this); b.options[c].splice(this.options.index, 1); p(b[c],
                function (a, b) { a.options.index = b }); this.destroy(); b.isDirtyBox = !0; t(a, !0) && b.redraw()
            }, setTitle: function (a, b) { this.update({ title: a }, b) }, setCategories: function (a, b) { this.update({ categories: a }, b) }
        })
    })(L); (function (a) {
        var D = a.color, C = a.each, G = a.map, I = a.pick, h = a.Series, f = a.seriesType; f("area", "line", { softThreshold: !1, threshold: 0 }, {
            singleStacks: !1, getStackPoints: function () {
                var a = [], f = [], h = this.xAxis, u = this.yAxis, d = u.stacks[this.stackKey], c = {}, n = this.points, y = this.index, t = u.series, m = t.length, b, q = I(u.options.reversedStacks,
                !0) ? 1 : -1, z, F; if (this.options.stacking) {
                    for (z = 0; z < n.length; z++) c[n[z].x] = n[z]; for (F in d) null !== d[F].total && f.push(F); f.sort(function (a, b) { return a - b }); b = G(t, function () { return this.visible }); C(f, function (e, n) {
                        var l = 0, r, k; if (c[e] && !c[e].isNull) a.push(c[e]), C([-1, 1], function (a) { var h = 1 === a ? "rightNull" : "leftNull", l = 0, t = d[f[n + a]]; if (t) for (z = y; 0 <= z && z < m;) r = t.points[z], r || (z === y ? c[e][h] = !0 : b[z] && (k = d[e].points[z]) && (l -= k[1] - k[0])), z += q; c[e][1 === a ? "rightCliff" : "leftCliff"] = l }); else {
                            for (z = y; 0 <= z && z < m;) {
                                if (r =
                                d[e].points[z]) { l = r[1]; break } z += q
                            } l = u.toPixels(l, !0); a.push({ isNull: !0, plotX: h.toPixels(e, !0), plotY: l, yBottom: l })
                        }
                    })
                } return a
            }, getGraphPath: function (a) {
                var f = h.prototype.getGraphPath, l = this.options, p = l.stacking, d = this.yAxis, c, n, y = [], t = [], m = this.index, b, q = d.stacks[this.stackKey], z = l.threshold, F = d.getThreshold(l.threshold), e, l = l.connectNulls || "percent" === p, r = function (c, e, f) {
                    var k = a[c]; c = p && q[k.x].points[m]; var h = k[f + "Null"] || 0; f = k[f + "Cliff"] || 0; var n, l, k = !0; f || h ? (n = (h ? c[0] : c[1]) + f, l = c[0] + f, k = !!h) : !p &&
                    a[e] && a[e].isNull && (n = l = z); void 0 !== n && (t.push({ plotX: b, plotY: null === n ? F : d.getThreshold(n), isNull: k }), y.push({ plotX: b, plotY: null === l ? F : d.getThreshold(l), doCurve: !1 }))
                }; a = a || this.points; p && (a = this.getStackPoints()); for (c = 0; c < a.length; c++) if (n = a[c].isNull, b = I(a[c].rectPlotX, a[c].plotX), e = I(a[c].yBottom, F), !n || l) l || r(c, c - 1, "left"), n && !p && l || (t.push(a[c]), y.push({ x: c, plotX: b, plotY: e })), l || r(c, c + 1, "right"); c = f.call(this, t, !0, !0); y.reversed = !0; n = f.call(this, y, !0, !0); n.length && (n[0] = "L"); n = c.concat(n); f =
                f.call(this, t, !1, l); n.xMap = c.xMap; this.areaPath = n; return f
            }, drawGraph: function () {
                this.areaPath = []; h.prototype.drawGraph.apply(this); var a = this, f = this.areaPath, l = this.options, u = [["area", "highcharts-area", this.color, l.fillColor]]; C(this.zones, function (d, c) { u.push(["zone-area-" + c, "highcharts-area highcharts-zone-area-" + c + " " + d.className, d.color || a.color, d.fillColor || l.fillColor]) }); C(u, function (d) {
                    var c = d[0], h = a[c]; h ? (h.endX = f.xMap, h.animate({ d: f })) : (h = a[c] = a.chart.renderer.path(f).addClass(d[1]).attr({
                        fill: I(d[3],
                        D(d[2]).setOpacity(I(l.fillOpacity, .75)).get()), zIndex: 0
                    }).add(a.group), h.isArea = !0); h.startX = f.xMap; h.shiftUnit = l.step ? 2 : 1
                })
            }, drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
        })
    })(L); (function (a) {
        var D = a.pick; a = a.seriesType; a("spline", "line", {}, {
            getPointSpline: function (a, G, I) {
                var h = G.plotX, f = G.plotY, p = a[I - 1]; I = a[I + 1]; var v, l, u, d; if (p && !p.isNull && !1 !== p.doCurve && I && !I.isNull && !1 !== I.doCurve) {
                    a = p.plotY; u = I.plotX; I = I.plotY; var c = 0; v = (1.5 * h + p.plotX) / 2.5; l = (1.5 * f + a) / 2.5; u = (1.5 * h + u) / 2.5; d = (1.5 * f + I) / 2.5;
                    u !== v && (c = (d - l) * (u - h) / (u - v) + f - d); l += c; d += c; l > a && l > f ? (l = Math.max(a, f), d = 2 * f - l) : l < a && l < f && (l = Math.min(a, f), d = 2 * f - l); d > I && d > f ? (d = Math.max(I, f), l = 2 * f - d) : d < I && d < f && (d = Math.min(I, f), l = 2 * f - d); G.rightContX = u; G.rightContY = d
                } G = ["C", D(p.rightContX, p.plotX), D(p.rightContY, p.plotY), D(v, h), D(l, f), h, f]; p.rightContX = p.rightContY = null; return G
            }
        })
    })(L); (function (a) {
        var D = a.seriesTypes.area.prototype, C = a.seriesType; C("areaspline", "spline", a.defaultPlotOptions.area, {
            getStackPoints: D.getStackPoints, getGraphPath: D.getGraphPath,
            setStackCliffs: D.setStackCliffs, drawGraph: D.drawGraph, drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
        })
    })(L); (function (a) {
        var D = a.animObject, C = a.color, G = a.each, I = a.extend, h = a.isNumber, f = a.merge, p = a.pick, v = a.Series, l = a.seriesType, u = a.svg; l("column", "line", {
            borderRadius: 0, groupPadding: .2, marker: null, pointPadding: .1, minPointLength: 0, cropThreshold: 50, pointRange: null, states: { hover: { halo: !1, brightness: .1, shadow: !1 }, select: { color: "#cccccc", borderColor: "#000000", shadow: !1 } }, dataLabels: {
                align: null, verticalAlign: null,
                y: null
            }, softThreshold: !1, startFromThreshold: !0, stickyTracking: !1, tooltip: { distance: 6 }, threshold: 0, borderColor: "#ffffff"
        }, {
            cropShoulder: 0, directTouch: !0, trackerGroups: ["group", "dataLabelsGroup"], negStacks: !0, init: function () { v.prototype.init.apply(this, arguments); var a = this, c = a.chart; c.hasRendered && G(c.series, function (c) { c.type === a.type && (c.isDirty = !0) }) }, getColumnMetrics: function () {
                var a = this, c = a.options, f = a.xAxis, h = a.yAxis, l = f.reversed, m, b = {}, q = 0; !1 === c.grouping ? q = 1 : G(a.chart.series, function (c) {
                    var e =
                    c.options, d = c.yAxis, f; c.type === a.type && c.visible && h.len === d.len && h.pos === d.pos && (e.stacking ? (m = c.stackKey, void 0 === b[m] && (b[m] = q++), f = b[m]) : !1 !== e.grouping && (f = q++), c.columnIndex = f)
                }); var u = Math.min(Math.abs(f.transA) * (f.ordinalSlope || c.pointRange || f.closestPointRange || f.tickInterval || 1), f.len), F = u * c.groupPadding, e = (u - 2 * F) / q, c = Math.min(c.maxPointWidth || f.len, p(c.pointWidth, e * (1 - 2 * c.pointPadding))); a.columnMetrics = { width: c, offset: (e - c) / 2 + (F + ((a.columnIndex || 0) + (l ? 1 : 0)) * e - u / 2) * (l ? -1 : 1) }; return a.columnMetrics
            },
            crispCol: function (a, c, f, h) { var d = this.chart, m = this.borderWidth, b = -(m % 2 ? .5 : 0), m = m % 2 ? .5 : 1; d.inverted && d.renderer.isVML && (m += 1); f = Math.round(a + f) + b; a = Math.round(a) + b; h = Math.round(c + h) + m; b = .5 >= Math.abs(c) && .5 < h; c = Math.round(c) + m; h -= c; b && h && (--c, h += 1); return { x: a, y: c, width: f - a, height: h } }, translate: function () {
                var a = this, c = a.chart, f = a.options, h = a.dense = 2 > a.closestPointRange * a.xAxis.transA, h = a.borderWidth = p(f.borderWidth, h ? 0 : 1), l = a.yAxis, m = a.translatedThreshold = l.getThreshold(f.threshold), b = p(f.minPointLength,
                5), q = a.getColumnMetrics(), u = q.width, F = a.barW = Math.max(u, 1 + 2 * h), e = a.pointXOffset = q.offset; c.inverted && (m -= .5); f.pointPadding && (F = Math.ceil(F)); v.prototype.translate.apply(a); G(a.points, function (d) {
                    var f = p(d.yBottom, m), h = 999 + Math.abs(f), h = Math.min(Math.max(-h, d.plotY), l.len + h), k = d.plotX + e, n = F, q = Math.min(h, f), r, t = Math.max(h, f) - q; Math.abs(t) < b && b && (t = b, r = !l.reversed && !d.negative || l.reversed && d.negative, q = Math.abs(q - m) > b ? f - b : m - (r ? b : 0)); d.barX = k; d.pointWidth = u; d.tooltipPos = c.inverted ? [l.len + l.pos - c.plotLeft -
                    h, a.xAxis.len - k - n / 2, t] : [k + n / 2, h + l.pos - c.plotTop, t]; d.shapeType = "rect"; d.shapeArgs = a.crispCol.apply(a, d.isNull ? [d.plotX, l.len / 2, 0, 0] : [k, q, n, t])
                })
            }, getSymbol: a.noop, drawLegendSymbol: a.LegendSymbolMixin.drawRectangle, drawGraph: function () { this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data") }, pointAttribs: function (a, c) {
                var d = this.options, f, h = this.pointAttrToOptions || {}; f = h.stroke || "borderColor"; var m = h["stroke-width"] || "borderWidth", b = a && a.color || this.color, l = a[f] || d[f] || this.color ||
                b, p = a[m] || d[m] || this[m] || 0, h = d.dashStyle; a && this.zones.length && (b = (b = a.getZone()) && b.color || a.options.color || this.color); c && (a = d.states[c], c = a.brightness, b = a.color || void 0 !== c && C(b).brighten(a.brightness).get() || b, l = a[f] || l, p = a[m] || p, h = a.dashStyle || h); f = { fill: b, stroke: l, "stroke-width": p }; d.borderRadius && (f.r = d.borderRadius); h && (f.dashstyle = h); return f
            }, drawPoints: function () {
                var a = this, c = this.chart, l = a.options, p = c.renderer, t = l.animationLimit || 250, m; G(a.points, function (b) {
                    var d = b.graphic; if (h(b.plotY) &&
                    null !== b.y) { m = b.shapeArgs; if (d) d[c.pointCount < t ? "animate" : "attr"](f(m)); else b.graphic = d = p[b.shapeType](m).attr({ "class": b.getClassName() }).add(b.group || a.group); d.attr(a.pointAttribs(b, b.selected && "select")).shadow(l.shadow, null, l.stacking && !l.borderRadius) } else d && (b.graphic = d.destroy())
                })
            }, animate: function (a) {
                var c = this, d = this.yAxis, f = c.options, h = this.chart.inverted, m = {}; u && (a ? (m.scaleY = .001, a = Math.min(d.pos + d.len, Math.max(d.pos, d.toPixels(f.threshold))), h ? m.translateX = a - d.len : m.translateY = a, c.group.attr(m)) :
                (m[h ? "translateX" : "translateY"] = d.pos, c.group.animate(m, I(D(c.options.animation), { step: function (a, d) { c.group.attr({ scaleY: Math.max(.001, d.pos) }) } })), c.animate = null))
            }, remove: function () { var a = this, c = a.chart; c.hasRendered && G(c.series, function (c) { c.type === a.type && (c.isDirty = !0) }); v.prototype.remove.apply(a, arguments) }
        })
    })(L); (function (a) { a = a.seriesType; a("bar", "column", null, { inverted: !0 }) })(L); (function (a) {
        var D = a.Series; a = a.seriesType; a("scatter", "line", {
            lineWidth: 0, marker: { enabled: !0 }, tooltip: {
                headerFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',
                pointFormat: "x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"
            }
        }, { sorted: !1, requireSorting: !1, noSharedTooltip: !0, trackerGroups: ["group", "markerGroup", "dataLabelsGroup"], takeOrdinalPosition: !1, kdDimensions: 2, drawGraph: function () { this.options.lineWidth && D.prototype.drawGraph.call(this) } })
    })(L); (function (a) {
        var D = a.pick, C = a.relativeLength; a.CenteredSeriesMixin = {
            getCenter: function () {
                var a = this.options, I = this.chart, h = 2 * (a.slicedOffset || 0), f = I.plotWidth - 2 * h, I = I.plotHeight -
                2 * h, p = a.center, p = [D(p[0], "50%"), D(p[1], "50%"), a.size || "100%", a.innerSize || 0], v = Math.min(f, I), l, u; for (l = 0; 4 > l; ++l) u = p[l], a = 2 > l || 2 === l && /%$/.test(u), p[l] = C(u, [f, I, v, p[2]][l]) + (a ? h : 0); p[3] > p[2] && (p[3] = p[2]); return p
            }
        }
    })(L); (function (a) {
        var D = a.addEvent, C = a.defined, G = a.each, I = a.extend, h = a.inArray, f = a.noop, p = a.pick, v = a.Point, l = a.Series, u = a.seriesType, d = a.setAnimation; u("pie", "line", {
            center: [null, null], clip: !1, colorByPoint: !0, dataLabels: {
                distance: 30, enabled: !0, formatter: function () {
                    return null === this.y ?
                    void 0 : this.point.name
                }, x: 0
            }, ignoreHiddenPoint: !0, legendType: "point", marker: null, size: null, showInLegend: !1, slicedOffset: 10, stickyTracking: !1, tooltip: { followPointer: !0 }, borderColor: "#ffffff", borderWidth: 1, states: { hover: { brightness: .1, shadow: !1 } }
        }, {
            isCartesian: !1, requireSorting: !1, directTouch: !0, noSharedTooltip: !0, trackerGroups: ["group", "dataLabelsGroup"], axisTypes: [], pointAttribs: a.seriesTypes.column.prototype.pointAttribs, animate: function (a) {
                var c = this, d = c.points, f = c.startAngleRad; a || (G(d, function (a) {
                    var b =
                    a.graphic, d = a.shapeArgs; b && (b.attr({ r: a.startR || c.center[3] / 2, start: f, end: f }), b.animate({ r: d.r, start: d.start, end: d.end }, c.options.animation))
                }), c.animate = null)
            }, updateTotals: function () { var a, d = 0, f = this.points, h = f.length, m, b = this.options.ignoreHiddenPoint; for (a = 0; a < h; a++) m = f[a], 0 > m.y && (m.y = null), d += b && !m.visible ? 0 : m.y; this.total = d; for (a = 0; a < h; a++) m = f[a], m.percentage = 0 < d && (m.visible || !b) ? m.y / d * 100 : 0, m.total = d }, generatePoints: function () { l.prototype.generatePoints.call(this); this.updateTotals() }, translate: function (a) {
                this.generatePoints();
                var c = 0, d = this.options, f = d.slicedOffset, h = f + (d.borderWidth || 0), b, l, u, F = d.startAngle || 0, e = this.startAngleRad = Math.PI / 180 * (F - 90), F = (this.endAngleRad = Math.PI / 180 * (p(d.endAngle, F + 360) - 90)) - e, r = this.points, x = d.dataLabels.distance, d = d.ignoreHiddenPoint, A, k = r.length, w; a || (this.center = a = this.getCenter()); this.getX = function (b, c) { u = Math.asin(Math.min((b - a[1]) / (a[2] / 2 + x), 1)); return a[0] + (c ? -1 : 1) * Math.cos(u) * (a[2] / 2 + x) }; for (A = 0; A < k; A++) {
                    w = r[A]; b = e + c * F; if (!d || w.visible) c += w.percentage / 100; l = e + c * F; w.shapeType =
                    "arc"; w.shapeArgs = { x: a[0], y: a[1], r: a[2] / 2, innerR: a[3] / 2, start: Math.round(1E3 * b) / 1E3, end: Math.round(1E3 * l) / 1E3 }; u = (l + b) / 2; u > 1.5 * Math.PI ? u -= 2 * Math.PI : u < -Math.PI / 2 && (u += 2 * Math.PI); w.slicedTranslation = { translateX: Math.round(Math.cos(u) * f), translateY: Math.round(Math.sin(u) * f) }; b = Math.cos(u) * a[2] / 2; l = Math.sin(u) * a[2] / 2; w.tooltipPos = [a[0] + .7 * b, a[1] + .7 * l]; w.half = u < -Math.PI / 2 || u > Math.PI / 2 ? 1 : 0; w.angle = u; h = Math.min(h, x / 5); w.labelPos = [a[0] + b + Math.cos(u) * x, a[1] + l + Math.sin(u) * x, a[0] + b + Math.cos(u) * h, a[1] + l + Math.sin(u) *
                    h, a[0] + b, a[1] + l, 0 > x ? "center" : w.half ? "right" : "left", u]
                }
            }, drawGraph: null, drawPoints: function () {
                var a = this, d = a.chart.renderer, f, h, m, b, l = a.options.shadow; l && !a.shadowGroup && (a.shadowGroup = d.g("shadow").add(a.group)); G(a.points, function (c) {
                    if (null !== c.y) {
                        h = c.graphic; b = c.shapeArgs; f = c.sliced ? c.slicedTranslation : {}; var n = c.shadowGroup; l && !n && (n = c.shadowGroup = d.g("shadow").add(a.shadowGroup)); n && n.attr(f); m = a.pointAttribs(c, c.selected && "select"); h ? h.setRadialReference(a.center).attr(m).animate(I(b, f)) : (c.graphic =
                        h = d[c.shapeType](b).addClass(c.getClassName()).setRadialReference(a.center).attr(f).add(a.group), c.visible || h.attr({ visibility: "hidden" }), h.attr(m).attr({ "stroke-linejoin": "round" }).shadow(l, n))
                    }
                })
            }, searchPoint: f, sortByAngle: function (a, d) { a.sort(function (a, c) { return void 0 !== a.angle && (c.angle - a.angle) * d }) }, drawLegendSymbol: a.LegendSymbolMixin.drawRectangle, getCenter: a.CenteredSeriesMixin.getCenter, getSymbol: f
        }, {
            init: function () {
                v.prototype.init.apply(this, arguments); var a = this, d; a.name = p(a.name, "Slice");
                d = function (c) { a.slice("select" === c.type) }; D(a, "select", d); D(a, "unselect", d); return a
            }, setVisible: function (a, d) { var c = this, f = c.series, m = f.chart, b = f.options.ignoreHiddenPoint; d = p(d, b); a !== c.visible && (c.visible = c.options.visible = a = void 0 === a ? !c.visible : a, f.options.data[h(c, f.data)] = c.options, G(["graphic", "dataLabel", "connector", "shadowGroup"], function (b) { if (c[b]) c[b][a ? "show" : "hide"](!0) }), c.legendItem && m.legend.colorizeItem(c, a), a || "hover" !== c.state || c.setState(""), b && (f.isDirty = !0), d && m.redraw()) },
            slice: function (a, f, l) { var c = this.series; d(l, c.chart); p(f, !0); this.sliced = this.options.sliced = a = C(a) ? a : !this.sliced; c.options.data[h(this, c.data)] = this.options; a = a ? this.slicedTranslation : { translateX: 0, translateY: 0 }; this.graphic.animate(a); this.shadowGroup && this.shadowGroup.animate(a) }, haloPath: function (a) { var c = this.shapeArgs; return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(c.x, c.y, c.r + a, c.r + a, { innerR: this.shapeArgs.r, start: c.start, end: c.end }) }
        })
    })(L); (function (a) {
        var D =
        a.addEvent, C = a.arrayMax, G = a.defined, I = a.each, h = a.extend, f = a.format, p = a.map, v = a.merge, l = a.noop, u = a.pick, d = a.relativeLength, c = a.Series, n = a.seriesTypes, y = a.stableSort; a.distribute = function (a, c) {
            function b(a, b) { return a.target - b.target } var d, f = !0, h = a, e = [], m; m = 0; for (d = a.length; d--;) m += a[d].size; if (m > c) { y(a, function (a, b) { return (b.rank || 0) - (a.rank || 0) }); for (m = d = 0; m <= c;) m += a[d].size, d++; e = a.splice(d - 1, a.length) } y(a, b); for (a = p(a, function (a) { return { size: a.size, targets: [a.target] } }) ; f;) {
                for (d = a.length; d--;) f =
                a[d], m = (Math.min.apply(0, f.targets) + Math.max.apply(0, f.targets)) / 2, f.pos = Math.min(Math.max(0, m - f.size / 2), c - f.size); d = a.length; for (f = !1; d--;) 0 < d && a[d - 1].pos + a[d - 1].size > a[d].pos && (a[d - 1].size += a[d].size, a[d - 1].targets = a[d - 1].targets.concat(a[d].targets), a[d - 1].pos + a[d - 1].size > c && (a[d - 1].pos = c - a[d - 1].size), a.splice(d, 1), f = !0)
            } d = 0; I(a, function (a) { var b = 0; I(a.targets, function () { h[d].pos = a.pos + b; b += h[d].size; d++ }) }); h.push.apply(h, e); y(h, b)
        }; c.prototype.drawDataLabels = function () {
            var a = this, c = a.options,
            b = c.dataLabels, d = a.points, l, n, e = a.hasRendered || 0, r, p, A = u(b.defer, !0), k = a.chart.renderer; if (b.enabled || a._hasPointLabels) a.dlProcessOptions && a.dlProcessOptions(b), p = a.plotGroup("dataLabelsGroup", "data-labels", A && !e ? "hidden" : "visible", b.zIndex || 6), A && (p.attr({ opacity: +e }), e || D(a, "afterAnimate", function () { a.visible && p.show(!0); p[c.animation ? "animate" : "attr"]({ opacity: 1 }, { duration: 200 }) })), n = b, I(d, function (e) {
                var d, m = e.dataLabel, q, g, t = e.connector, F = !0, x, A = {}; l = e.dlOptions || e.options && e.options.dataLabels;
                d = u(l && l.enabled, n.enabled) && null !== e.y; if (m && !d) e.dataLabel = m.destroy(); else if (d) {
                    b = v(n, l); x = b.style; d = b.rotation; q = e.getLabelConfig(); r = b.format ? f(b.format, q) : b.formatter.call(q, b); x.color = u(b.color, x.color, a.color, "#000000"); if (m) G(r) ? (m.attr({ text: r }), F = !1) : (e.dataLabel = m = m.destroy(), t && (e.connector = t.destroy())); else if (G(r)) {
                        m = { fill: b.backgroundColor, stroke: b.borderColor, "stroke-width": b.borderWidth, r: b.borderRadius || 0, rotation: d, padding: b.padding, zIndex: 1 }; "contrast" === x.color && (A.color = b.inside ||
                        0 > b.distance || c.stacking ? k.getContrast(e.color || a.color) : "#000000"); c.cursor && (A.cursor = c.cursor); for (g in m) void 0 === m[g] && delete m[g]; m = e.dataLabel = k[d ? "text" : "label"](r, 0, -9999, b.shape, null, null, b.useHTML, null, "data-label").attr(m); m.addClass("highcharts-data-label-color-" + e.colorIndex + " " + (b.className || "") + (b.useHTML ? "highcharts-tracker" : "")); m.css(h(x, A)); m.add(p); m.shadow(b.shadow)
                    } m && a.alignDataLabel(e, m, b, null, F)
                }
            })
        }; c.prototype.alignDataLabel = function (a, c, b, d, f) {
            var m = this.chart, e = m.inverted,
            l = u(a.plotX, -9999), n = u(a.plotY, -9999), p = c.getBBox(), k, q = b.rotation, t = b.align, v = this.visible && (a.series.forceDL || m.isInsidePlot(l, Math.round(n), e) || d && m.isInsidePlot(l, e ? d.x + 1 : d.y + d.height - 1, e)), z = "justify" === u(b.overflow, "justify"); v && (k = b.style.fontSize, k = m.renderer.fontMetrics(k, c).b, d = h({ x: e ? m.plotWidth - n : l, y: Math.round(e ? m.plotHeight - l : n), width: 0, height: 0 }, d), h(b, { width: p.width, height: p.height }), q ? (z = !1, e = m.renderer.rotCorr(k, q), e = {
                x: d.x + b.x + d.width / 2 + e.x, y: d.y + b.y + { top: 0, middle: .5, bottom: 1 }[b.verticalAlign] *
                d.height
            }, c[f ? "attr" : "animate"](e).attr({ align: t }), l = (q + 720) % 360, l = 180 < l && 360 > l, "left" === t ? e.y -= l ? p.height : 0 : "center" === t ? (e.x -= p.width / 2, e.y -= p.height / 2) : "right" === t && (e.x -= p.width, e.y -= l ? 0 : p.height)) : (c.align(b, null, d), e = c.alignAttr), z ? this.justifyDataLabel(c, b, e, p, d, f) : u(b.crop, !0) && (v = m.isInsidePlot(e.x, e.y) && m.isInsidePlot(e.x + p.width, e.y + p.height)), b.shape && !q && c.attr({ anchorX: a.plotX, anchorY: a.plotY })); v || (c.attr({ y: -9999 }), c.placed = !1)
        }; c.prototype.justifyDataLabel = function (a, c, b, d, f, h) {
            var e =
            this.chart, m = c.align, l = c.verticalAlign, n, k, p = a.box ? 0 : a.padding || 0; n = b.x + p; 0 > n && ("right" === m ? c.align = "left" : c.x = -n, k = !0); n = b.x + d.width - p; n > e.plotWidth && ("left" === m ? c.align = "right" : c.x = e.plotWidth - n, k = !0); n = b.y + p; 0 > n && ("bottom" === l ? c.verticalAlign = "top" : c.y = -n, k = !0); n = b.y + d.height - p; n > e.plotHeight && ("top" === l ? c.verticalAlign = "bottom" : c.y = e.plotHeight - n, k = !0); k && (a.placed = !h, a.align(c, null, f))
        }; n.pie && (n.pie.prototype.drawDataLabels = function () {
            var d = this, f = d.data, b, h = d.chart, l = d.options.dataLabels, n =
            u(l.connectorPadding, 10), e = u(l.connectorWidth, 1), r = h.plotWidth, v = h.plotHeight, A, k = l.distance, w = d.center, y = w[2] / 2, D = w[1], G = 0 < k, g, B, L, M, R = [[], []], E, H, P, Q, O = [0, 0, 0, 0]; d.visible && (l.enabled || d._hasPointLabels) && (c.prototype.drawDataLabels.apply(d), I(f, function (a) { a.dataLabel && a.visible && (R[a.half].push(a), a.dataLabel._pos = null) }), I(R, function (c, e) {
                var f, m, q = c.length, t, u, F; if (q) for (d.sortByAngle(c, e - .5), 0 < k && (f = Math.max(0, D - y - k), m = Math.min(D + y + k, h.plotHeight), t = p(c, function (a) {
                if (a.dataLabel) return F =
                a.dataLabel.getBBox().height || 21, { target: a.labelPos[1] - f + F / 2, size: F, rank: a.y }
                }), a.distribute(t, m + F - f)), Q = 0; Q < q; Q++) b = c[Q], L = b.labelPos, g = b.dataLabel, P = !1 === b.visible ? "hidden" : "inherit", u = L[1], t ? void 0 === t[Q].pos ? P = "hidden" : (M = t[Q].size, H = f + t[Q].pos) : H = u, E = l.justify ? w[0] + (e ? -1 : 1) * (y + k) : d.getX(H < f + 2 || H > m - 2 ? u : H, e), g._attr = { visibility: P, align: L[6] }, g._pos = { x: E + l.x + ({ left: n, right: -n }[L[6]] || 0), y: H + l.y - 10 }, L.x = E, L.y = H, null === d.options.size && (B = g.width, E - B < n ? O[3] = Math.max(Math.round(B - E + n), O[3]) : E + B > r - n &&
                (O[1] = Math.max(Math.round(E + B - r + n), O[1])), 0 > H - M / 2 ? O[0] = Math.max(Math.round(-H + M / 2), O[0]) : H + M / 2 > v && (O[2] = Math.max(Math.round(H + M / 2 - v), O[2])))
            }), 0 === C(O) || this.verifyDataLabelOverflow(O)) && (this.placeDataLabels(), G && e && I(this.points, function (a) {
                var b; A = a.connector; if ((g = a.dataLabel) && g._pos && a.visible) {
                    P = g._attr.visibility; if (b = !A) a.connector = A = h.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + a.colorIndex).add(d.dataLabelsGroup), A.attr({
                        "stroke-width": e, stroke: l.connectorColor ||
                        a.color || "#666666"
                    }); A[b ? "attr" : "animate"]({ d: d.connectorPath(a.labelPos) }); A.attr("visibility", P)
                } else A && (a.connector = A.destroy())
            }))
        }, n.pie.prototype.connectorPath = function (a) { var c = a.x, b = a.y; return u(this.options.dataLabels.softConnector, !0) ? ["M", c + ("left" === a[6] ? 5 : -5), b, "C", c, b, 2 * a[2] - a[4], 2 * a[3] - a[5], a[2], a[3], "L", a[4], a[5]] : ["M", c + ("left" === a[6] ? 5 : -5), b, "L", a[2], a[3], "L", a[4], a[5]] }, n.pie.prototype.placeDataLabels = function () {
            I(this.points, function (a) {
                var c = a.dataLabel; c && a.visible && ((a = c._pos) ?
                (c.attr(c._attr), c[c.moved ? "animate" : "attr"](a), c.moved = !0) : c && c.attr({ y: -9999 }))
            })
        }, n.pie.prototype.alignDataLabel = l, n.pie.prototype.verifyDataLabelOverflow = function (a) {
            var c = this.center, b = this.options, f = b.center, h = b.minSize || 80, l, e; null !== f[0] ? l = Math.max(c[2] - Math.max(a[1], a[3]), h) : (l = Math.max(c[2] - a[1] - a[3], h), c[0] += (a[3] - a[1]) / 2); null !== f[1] ? l = Math.max(Math.min(l, c[2] - Math.max(a[0], a[2])), h) : (l = Math.max(Math.min(l, c[2] - a[0] - a[2]), h), c[1] += (a[0] - a[2]) / 2); l < c[2] ? (c[2] = l, c[3] = Math.min(d(b.innerSize ||
            0, l), l), this.translate(c), this.drawDataLabels && this.drawDataLabels()) : e = !0; return e
        }); n.column && (n.column.prototype.alignDataLabel = function (a, d, b, f, h) {
            var l = this.chart.inverted, e = a.series, m = a.dlBox || a.shapeArgs, n = u(a.below, a.plotY > u(this.translatedThreshold, e.yAxis.len)), p = u(b.inside, !!this.options.stacking); m && (f = v(m), 0 > f.y && (f.height += f.y, f.y = 0), m = f.y + f.height - e.yAxis.len, 0 < m && (f.height -= m), l && (f = { x: e.yAxis.len - f.y - f.height, y: e.xAxis.len - f.x - f.width, width: f.height, height: f.width }), p || (l ? (f.x += n ?
            0 : f.width, f.width = 0) : (f.y += n ? f.height : 0, f.height = 0))); b.align = u(b.align, !l || p ? "center" : n ? "right" : "left"); b.verticalAlign = u(b.verticalAlign, l || p ? "middle" : n ? "top" : "bottom"); c.prototype.alignDataLabel.call(this, a, d, b, f, h)
        })
    })(L); (function (a) {
        var D = a.Chart, C = a.each, G = a.pick, I = a.addEvent; D.prototype.callbacks.push(function (a) {
            function f() {
                var f = []; C(a.series, function (a) {
                    var h = a.options.dataLabels, p = a.dataLabelCollections || ["dataLabel"]; (h.enabled || a._hasPointLabels) && !h.allowOverlap && a.visible && C(p, function (d) {
                        C(a.points,
                        function (a) { a[d] && (a[d].labelrank = G(a.labelrank, a.shapeArgs && a.shapeArgs.height), f.push(a[d])) })
                    })
                }); a.hideOverlappingLabels(f)
            } f(); I(a, "redraw", f)
        }); D.prototype.hideOverlappingLabels = function (a) {
            var f = a.length, h, v, l, u, d, c, n, y, t, m = function (a, c, d, f, e, h, l, m) { return !(e > a + d || e + l < a || h > c + f || h + m < c) }; for (v = 0; v < f; v++) if (h = a[v]) h.oldOpacity = h.opacity, h.newOpacity = 1; a.sort(function (a, c) { return (c.labelrank || 0) - (a.labelrank || 0) }); for (v = 0; v < f; v++) for (l = a[v], h = v + 1; h < f; ++h) if (u = a[h], l && u && l.placed && u.placed && 0 !==
            l.newOpacity && 0 !== u.newOpacity && (d = l.alignAttr, c = u.alignAttr, n = l.parentGroup, y = u.parentGroup, t = 2 * (l.box ? 0 : l.padding), d = m(d.x + n.translateX, d.y + n.translateY, l.width - t, l.height - t, c.x + y.translateX, c.y + y.translateY, u.width - t, u.height - t))) (l.labelrank < u.labelrank ? l : u).newOpacity = 0; C(a, function (a) { var b, c; a && (c = a.newOpacity, a.oldOpacity !== c && a.placed && (c ? a.show(!0) : b = function () { a.hide() }, a.alignAttr.opacity = c, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, b)), a.isOld = !0) })
        }
    })(L); (function (a) {
        var D = a.addEvent,
        C = a.Chart, G = a.createElement, I = a.css, h = a.defaultOptions, f = a.defaultPlotOptions, p = a.each, v = a.extend, l = a.fireEvent, u = a.hasTouch, d = a.inArray, c = a.isObject, n = a.Legend, y = a.merge, t = a.pick, m = a.Point, b = a.Series, q = a.seriesTypes, z = a.svg; a = a.TrackerMixin = {
            drawTrackerPoint: function () {
                var a = this, b = a.chart, c = b.pointer, d = function (a) { for (var c = a.target, e; c && !e;) e = c.point, c = c.parentNode; if (void 0 !== e && e !== b.hoverPoint) e.onMouseOver(a) }; p(a.points, function (a) {
                    a.graphic && (a.graphic.element.point = a); a.dataLabel && (a.dataLabel.div ?
                    a.dataLabel.div.point = a : a.dataLabel.element.point = a)
                }); a._hasTracking || (p(a.trackerGroups, function (b) { if (a[b]) { a[b].addClass("highcharts-tracker").on("mouseover", d).on("mouseout", function (a) { c.onTrackerMouseOut(a) }); if (u) a[b].on("touchstart", d); a.options.cursor && a[b].css(I).css({ cursor: a.options.cursor }) } }), a._hasTracking = !0)
            }, drawTrackerGraph: function () {
                var a = this, b = a.options, c = b.trackByArea, d = [].concat(c ? a.areaPath : a.graphPath), f = d.length, h = a.chart, l = h.pointer, m = h.renderer, n = h.options.tooltip.snap,
                q = a.tracker, g, t = function () { if (h.hoverSeries !== a) a.onMouseOver() }, v = "rgba(192,192,192," + (z ? .0001 : .002) + ")"; if (f && !c) for (g = f + 1; g--;) "M" === d[g] && d.splice(g + 1, 0, d[g + 1] - n, d[g + 2], "L"), (g && "M" === d[g] || g === f) && d.splice(g, 0, "L", d[g - 2] + n, d[g - 1]); q ? q.attr({ d: d }) : a.graph && (a.tracker = m.path(d).attr({ "stroke-linejoin": "round", visibility: a.visible ? "visible" : "hidden", stroke: v, fill: c ? v : "none", "stroke-width": a.graph.strokeWidth() + (c ? 0 : 2 * n), zIndex: 2 }).add(a.group), p([a.tracker, a.markerGroup], function (a) {
                    a.addClass("highcharts-tracker").on("mouseover",
                    t).on("mouseout", function (a) { l.onTrackerMouseOut(a) }); b.cursor && a.css({ cursor: b.cursor }); if (u) a.on("touchstart", t)
                }))
            }
        }; q.column && (q.column.prototype.drawTracker = a.drawTrackerPoint); q.pie && (q.pie.prototype.drawTracker = a.drawTrackerPoint); q.scatter && (q.scatter.prototype.drawTracker = a.drawTrackerPoint); v(n.prototype, {
            setItemEvents: function (a, b, c) {
                var e = this, d = e.chart, f = "highcharts-legend-" + (a.series ? "point" : "series") + "-active"; (c ? b : a.legendGroup).on("mouseover", function () {
                    a.setState("hover"); d.seriesGroup.addClass(f);
                    b.css(e.options.itemHoverStyle)
                }).on("mouseout", function () { b.css(a.visible ? e.itemStyle : e.itemHiddenStyle); d.seriesGroup.removeClass(f); a.setState() }).on("click", function (b) { var c = function () { a.setVisible && a.setVisible() }; b = { browserEvent: b }; a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : l(a, "legendItemClick", b, c) })
            }, createCheckboxForItem: function (a) {
                a.checkbox = G("input", { type: "checkbox", checked: a.selected, defaultChecked: a.selected }, this.options.itemCheckboxStyle, this.chart.container); D(a.checkbox,
                "click", function (b) { l(a.series || a, "checkboxClick", { checked: b.target.checked, item: a }, function () { a.select() }) })
            }
        }); h.legend.itemStyle.cursor = "pointer"; v(C.prototype, {
            showResetZoom: function () {
                var a = this, b = h.lang, c = a.options.chart.resetZoomButton, d = c.theme, f = d.states, k = "chart" === c.relativeTo ? null : "plotBox"; this.resetZoomButton = a.renderer.button(b.resetZoom, null, null, function () { a.zoomOut() }, d, f && f.hover).attr({ align: c.position.align, title: b.resetZoomTitle }).addClass("highcharts-reset-zoom").add().align(c.position,
                !1, k)
            }, zoomOut: function () { var a = this; l(a, "selection", { resetSelection: !0 }, function () { a.zoom() }) }, zoom: function (a) { var b, d = this.pointer, f = !1, h; !a || a.resetSelection ? p(this.axes, function (a) { b = a.zoom() }) : p(a.xAxis.concat(a.yAxis), function (a) { var c = a.axis; d[c.isXAxis ? "zoomX" : "zoomY"] && (b = c.zoom(a.min, a.max), c.displayBtn && (f = !0)) }); h = this.resetZoomButton; f && !h ? this.showResetZoom() : !f && c(h) && (this.resetZoomButton = h.destroy()); b && this.redraw(t(this.options.chart.animation, a && a.animation, 100 > this.pointCount)) },
            pan: function (a, b) {
                var c = this, e = c.hoverPoints, d; e && p(e, function (a) { a.setState() }); p("xy" === b ? [1, 0] : [1], function (b) { b = c[b ? "xAxis" : "yAxis"][0]; var e = b.horiz, f = a[e ? "chartX" : "chartY"], e = e ? "mouseDownX" : "mouseDownY", h = c[e], k = (b.pointRange || 0) / 2, g = b.getExtremes(), l = b.toValue(h - f, !0) + k, k = b.toValue(h + b.len - f, !0) - k, m = k < l, h = m ? k : l, l = m ? l : k, k = Math.min(g.dataMin, g.min) - h, g = l - Math.max(g.dataMax, g.max); b.series.length && 0 > k && 0 > g && (b.setExtremes(h, l, !1, !1, { trigger: "pan" }), d = !0); c[e] = f }); d && c.redraw(!1); I(c.container,
                { cursor: "move" })
            }
        }); v(m.prototype, {
            select: function (a, b) { var c = this, e = c.series, f = e.chart; a = t(a, !c.selected); c.firePointEvent(a ? "select" : "unselect", { accumulate: b }, function () { c.selected = c.options.selected = a; e.options.data[d(c, e.data)] = c.options; c.setState(a && "select"); b || p(f.getSelectedPoints(), function (a) { a.selected && a !== c && (a.selected = a.options.selected = !1, e.options.data[d(a, e.data)] = a.options, a.setState(""), a.firePointEvent("unselect")) }) }) }, onMouseOver: function (a, b) {
                var c = this.series, e = c.chart, d =
                e.tooltip, f = e.hoverPoint; if (this.series) { if (!b) { if (f && f !== this) f.onMouseOut(); if (e.hoverSeries !== c) c.onMouseOver(); e.hoverPoint = this } !d || d.shared && !c.noSharedTooltip ? d || this.setState("hover") : (this.setState("hover"), d.refresh(this, a)); this.firePointEvent("mouseOver") }
            }, onMouseOut: function () { var a = this.series.chart, b = a.hoverPoints; this.firePointEvent("mouseOut"); b && -1 !== d(this, b) || (this.setState(), a.hoverPoint = null) }, importEvents: function () {
                if (!this.hasImportedEvents) {
                    var a = y(this.series.options.point,
                    this.options).events, b; this.events = a; for (b in a) D(this, b, a[b]); this.hasImportedEvents = !0
                }
            }, setState: function (a, b) {
                var c = Math.floor(this.plotX), d = this.plotY, e = this.series, h = e.options.states[a] || {}, l = f[e.type].marker && e.options.marker, m = l && !1 === l.enabled, n = l && l.states && l.states[a] || {}, p = !1 === n.enabled, g = e.stateMarkerGraphic, q = this.marker || {}, u = e.chart, y = e.halo, z, F = l && e.markerAttribs; a = a || ""; if (!(a === this.state && !b || this.selected && "select" !== a || !1 === h.enabled || a && (p || m && !1 === n.enabled) || a && q.states &&
                q.states[a] && !1 === q.states[a].enabled)) {
                    F && (z = e.markerAttribs(this, a)); if (this.graphic) this.state && this.graphic.removeClass("highcharts-point-" + this.state), a && this.graphic.addClass("highcharts-point-" + a), this.graphic.attr(e.pointAttribs(this, a)), z && this.graphic.animate(z, t(u.options.chart.animation, n.animation, l.animation)), g && g.hide(); else {
                        if (a && n) {
                            l = q.symbol || e.symbol; g && g.currentSymbol !== l && (g = g.destroy()); if (g) g[b ? "animate" : "attr"]({ x: z.x, y: z.y }); else l && (e.stateMarkerGraphic = g = u.renderer.symbol(l,
                            z.x, z.y, z.width, z.height).add(e.markerGroup), g.currentSymbol = l); g && g.attr(e.pointAttribs(this, a))
                        } g && (g[a && u.isInsidePlot(c, d, u.inverted) ? "show" : "hide"](), g.element.point = this)
                    } (c = h.halo) && c.size ? (y || (e.halo = y = u.renderer.path().add(F ? e.markerGroup : e.group)), y[b ? "animate" : "attr"]({ d: this.haloPath(c.size) }), y.attr({ "class": "highcharts-halo highcharts-color-" + t(this.colorIndex, e.colorIndex) }), y.point = this, y.attr(v({ fill: this.color || e.color, "fill-opacity": c.opacity, zIndex: -1 }, c.attributes))) : y && y.point &&
                    y.point.haloPath && y.animate({ d: y.point.haloPath(0) }); this.state = a
                }
            }, haloPath: function (a) { return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) - a, this.plotY - a, 2 * a, 2 * a) }
        }); v(b.prototype, {
            onMouseOver: function () { var a = this.chart, b = a.hoverSeries; if (b && b !== this) b.onMouseOut(); this.options.events.mouseOver && l(this, "mouseOver"); this.setState("hover"); a.hoverSeries = this }, onMouseOut: function () {
                var a = this.options, b = this.chart, c = b.tooltip, d = b.hoverPoint; b.hoverSeries = null; if (d) d.onMouseOut();
                this && a.events.mouseOut && l(this, "mouseOut"); !c || a.stickyTracking || c.shared && !this.noSharedTooltip || c.hide(); this.setState()
            }, setState: function (a) {
                var b = this, c = b.options, d = b.graph, f = c.states, h = c.lineWidth, c = 0; a = a || ""; if (b.state !== a && (p([b.group, b.markerGroup], function (c) { c && (b.state && c.removeClass("highcharts-series-" + b.state), a && c.addClass("highcharts-series-" + a)) }), b.state = a, !f[a] || !1 !== f[a].enabled) && (a && (h = f[a].lineWidth || h + (f[a].lineWidthPlus || 0)), d && !d.dashstyle)) for (f = { "stroke-width": h }, d.attr(f) ; b["zone-graph-" +
                c];) b["zone-graph-" + c].attr(f), c += 1
            }, setVisible: function (a, b) {
                var c = this, d = c.chart, e = c.legendItem, f, h = d.options.chart.ignoreHiddenSeries, m = c.visible; f = (c.visible = a = c.options.visible = c.userOptions.visible = void 0 === a ? !m : a) ? "show" : "hide"; p(["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"], function (a) { if (c[a]) c[a][f]() }); if (d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut(); e && d.legend.colorizeItem(c, a); c.isDirty = !0; c.options.stacking && p(d.series, function (a) {
                    a.options.stacking &&
                    a.visible && (a.isDirty = !0)
                }); p(c.linkedSeries, function (b) { b.setVisible(a, !1) }); h && (d.isDirtyBox = !0); !1 !== b && d.redraw(); l(c, f)
            }, show: function () { this.setVisible(!0) }, hide: function () { this.setVisible(!1) }, select: function (a) { this.selected = a = void 0 === a ? !this.selected : a; this.checkbox && (this.checkbox.checked = a); l(this, a ? "select" : "unselect") }, drawTracker: a.drawTrackerGraph
        })
    })(L); (function (a) {
        var D = a.Chart, C = a.each, G = a.inArray, I = a.isObject, h = a.pick, f = a.splat; D.prototype.setResponsive = function (a) {
            var f = this.options.responsive;
            f && f.rules && C(f.rules, function (f) { this.matchResponsiveRule(f, a) }, this)
        }; D.prototype.matchResponsiveRule = function (f, v) {
            var l = this.respRules, p = f.condition, d; d = p.callback || function () { return this.chartWidth <= h(p.maxWidth, Number.MAX_VALUE) && this.chartHeight <= h(p.maxHeight, Number.MAX_VALUE) && this.chartWidth >= h(p.minWidth, 0) && this.chartHeight >= h(p.minHeight, 0) }; void 0 === f._id && (f._id = a.uniqueKey()); d = d.call(this); !l[f._id] && d ? f.chartOptions && (l[f._id] = this.currentOptions(f.chartOptions), this.update(f.chartOptions,
            v)) : l[f._id] && !d && (this.update(l[f._id], v), delete l[f._id])
        }; D.prototype.currentOptions = function (a) { function h(a, d, c) { var l, p; for (l in a) if (-1 < G(l, ["series", "xAxis", "yAxis"])) for (a[l] = f(a[l]), c[l] = [], p = 0; p < a[l].length; p++) c[l][p] = {}, h(a[l][p], d[l][p], c[l][p]); else I(a[l]) ? (c[l] = {}, h(a[l], d[l] || {}, c[l])) : c[l] = d[l] || null } var l = {}; h(a, this.options, l); return l }
    })(L); return L
});