{"version":3,"file":"/js/chart.js","mappings":"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","sources":["webpack:///./node_modules/chart.js/dist/chart.js","webpack:///webpack/bootstrap","webpack:///webpack/startup"],"sourcesContent":["/*!\n * Chart.js v3.5.0\n * https://www.chartjs.org\n * (c) 2021 Chart.js Contributors\n * Released under the MIT License\n */\n(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\ntypeof define === 'function' && define.amd ? define(factory) :\n(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Chart = factory());\n}(this, (function () { 'use strict';\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\nconst requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\nfunction throttled(fn, thisArg, updateFn) {\n const updateArgs = updateFn || ((args) => Array.prototype.slice.call(args));\n let ticking = false;\n let args = [];\n return function(...rest) {\n args = updateArgs(rest);\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n}\nfunction debounce(fn, delay) {\n let timeout;\n return function() {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay);\n } else {\n fn();\n }\n return delay;\n };\n}\nconst _toLeftRightCenter = (align) => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\nconst _alignStartEnd = (align, start, end) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\nconst _textX = (align, left, right, rtl) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\nclass Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n const me = this;\n if (me._request) {\n return;\n }\n me._running = true;\n me._request = requestAnimFrame.call(window, () => {\n me._update();\n me._request = null;\n if (me._running) {\n me._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n const me = this;\n let remaining = 0;\n me._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for (; i >= 0; --i) {\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n me._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n me._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n me._lastDate = date;\n if (remaining === 0) {\n me._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = new Animator();\n\n/*!\n * @kurkle/color v0.1.9\n * https://github.com/kurkle/color#readme\n * (c) 2020 Jukka Kurkela\n * Released under the MIT License\n */\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = '0123456789ABCDEF';\nconst h1 = (b) => hex[b & 0xF];\nconst h2 = (b) => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = (b) => (((b & 0xF0) >> 4) === (b & 0xF));\nfunction isShort(v) {\n\treturn eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\n}\nfunction hexParse(str) {\n\tvar len = str.length;\n\tvar ret;\n\tif (str[0] === '#') {\n\t\tif (len === 4 || len === 5) {\n\t\t\tret = {\n\t\t\t\tr: 255 & map$1[str[1]] * 17,\n\t\t\t\tg: 255 & map$1[str[2]] * 17,\n\t\t\t\tb: 255 & map$1[str[3]] * 17,\n\t\t\t\ta: len === 5 ? map$1[str[4]] * 17 : 255\n\t\t\t};\n\t\t} else if (len === 7 || len === 9) {\n\t\t\tret = {\n\t\t\t\tr: map$1[str[1]] << 4 | map$1[str[2]],\n\t\t\t\tg: map$1[str[3]] << 4 | map$1[str[4]],\n\t\t\t\tb: map$1[str[5]] << 4 | map$1[str[6]],\n\t\t\t\ta: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n\t\t\t};\n\t\t}\n\t}\n\treturn ret;\n}\nfunction hexString(v) {\n\tvar f = isShort(v) ? h1 : h2;\n\treturn v\n\t\t? '#' + f(v.r) + f(v.g) + f(v.b) + (v.a < 255 ? f(v.a) : '')\n\t\t: v;\n}\nfunction round(v) {\n\treturn v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n\treturn lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n\treturn lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n\treturn lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n\treturn lim(round(v * 100), 0, 100);\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n\tconst m = RGB_RE.exec(str);\n\tlet a = 255;\n\tlet r, g, b;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[7] !== r) {\n\t\tconst v = +m[7];\n\t\ta = 255 & (m[8] ? p2b(v) : v * 255);\n\t}\n\tr = +m[1];\n\tg = +m[3];\n\tb = +m[5];\n\tr = 255 & (m[2] ? p2b(r) : r);\n\tg = 255 & (m[4] ? p2b(g) : g);\n\tb = 255 & (m[6] ? p2b(b) : b);\n\treturn {\n\t\tr: r,\n\t\tg: g,\n\t\tb: b,\n\t\ta: a\n\t};\n}\nfunction rgbString(v) {\n\treturn v && (\n\t\tv.a < 255\n\t\t\t? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n\t\t\t: `rgb(${v.r}, ${v.g}, ${v.b})`\n\t);\n}\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\treturn [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n\tconst f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n\treturn [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n\tconst rgb = hsl2rgbn(h, 1, 0.5);\n\tlet i;\n\tif (w + b > 1) {\n\t\ti = 1 / (w + b);\n\t\tw *= i;\n\t\tb *= i;\n\t}\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] *= 1 - w - b;\n\t\trgb[i] += w;\n\t}\n\treturn rgb;\n}\nfunction rgb2hsl(v) {\n\tconst range = 255;\n\tconst r = v.r / range;\n\tconst g = v.g / range;\n\tconst b = v.b / range;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h, s, d;\n\tif (max !== min) {\n\t\td = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\th = max === r\n\t\t\t? ((g - b) / d) + (g < b ? 6 : 0)\n\t\t\t: max === g\n\t\t\t\t? (b - r) / d + 2\n\t\t\t\t: (r - g) / d + 4;\n\t\th = h * 60 + 0.5;\n\t}\n\treturn [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n\treturn (\n\t\tArray.isArray(a)\n\t\t\t? f(a[0], a[1], a[2])\n\t\t\t: f(a, b, c)\n\t).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n\treturn calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n\treturn calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n\treturn calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n\treturn (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n\tconst m = HUE_RE.exec(str);\n\tlet a = 255;\n\tlet v;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[5] !== v) {\n\t\ta = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n\t}\n\tconst h = hue(+m[2]);\n\tconst p1 = +m[3] / 100;\n\tconst p2 = +m[4] / 100;\n\tif (m[1] === 'hwb') {\n\t\tv = hwb2rgb(h, p1, p2);\n\t} else if (m[1] === 'hsv') {\n\t\tv = hsv2rgb(h, p1, p2);\n\t} else {\n\t\tv = hsl2rgb(h, p1, p2);\n\t}\n\treturn {\n\t\tr: v[0],\n\t\tg: v[1],\n\t\tb: v[2],\n\t\ta: a\n\t};\n}\nfunction rotate(v, deg) {\n\tvar h = rgb2hsl(v);\n\th[0] = hue(h[0] + deg);\n\th = hsl2rgb(h);\n\tv.r = h[0];\n\tv.g = h[1];\n\tv.b = h[2];\n}\nfunction hslString(v) {\n\tif (!v) {\n\t\treturn;\n\t}\n\tconst a = rgb2hsl(v);\n\tconst h = a[0];\n\tconst s = n2p(a[1]);\n\tconst l = n2p(a[2]);\n\treturn v.a < 255\n\t\t? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n\t\t: `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map$1$1 = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n\tconst unpacked = {};\n\tconst keys = Object.keys(names);\n\tconst tkeys = Object.keys(map$1$1);\n\tlet i, j, k, ok, nk;\n\tfor (i = 0; i < keys.length; i++) {\n\t\tok = nk = keys[i];\n\t\tfor (j = 0; j < tkeys.length; j++) {\n\t\t\tk = tkeys[j];\n\t\t\tnk = nk.replace(k, map$1$1[k]);\n\t\t}\n\t\tk = parseInt(names[ok], 16);\n\t\tunpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n\t}\n\treturn unpacked;\n}\nlet names$1;\nfunction nameParse(str) {\n\tif (!names$1) {\n\t\tnames$1 = unpack();\n\t\tnames$1.transparent = [0, 0, 0, 0];\n\t}\n\tconst a = names$1[str.toLowerCase()];\n\treturn a && {\n\t\tr: a[0],\n\t\tg: a[1],\n\t\tb: a[2],\n\t\ta: a.length === 4 ? a[3] : 255\n\t};\n}\nfunction modHSL(v, i, ratio) {\n\tif (v) {\n\t\tlet tmp = rgb2hsl(v);\n\t\ttmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n\t\ttmp = hsl2rgb(tmp);\n\t\tv.r = tmp[0];\n\t\tv.g = tmp[1];\n\t\tv.b = tmp[2];\n\t}\n}\nfunction clone$1(v, proto) {\n\treturn v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n\tvar v = {r: 0, g: 0, b: 0, a: 255};\n\tif (Array.isArray(input)) {\n\t\tif (input.length >= 3) {\n\t\t\tv = {r: input[0], g: input[1], b: input[2], a: 255};\n\t\t\tif (input.length > 3) {\n\t\t\t\tv.a = n2b(input[3]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tv = clone$1(input, {r: 0, g: 0, b: 0, a: 1});\n\t\tv.a = n2b(v.a);\n\t}\n\treturn v;\n}\nfunction functionParse(str) {\n\tif (str.charAt(0) === 'r') {\n\t\treturn rgbParse(str);\n\t}\n\treturn hueParse(str);\n}\nclass Color {\n\tconstructor(input) {\n\t\tif (input instanceof Color) {\n\t\t\treturn input;\n\t\t}\n\t\tconst type = typeof input;\n\t\tlet v;\n\t\tif (type === 'object') {\n\t\t\tv = fromObject(input);\n\t\t} else if (type === 'string') {\n\t\t\tv = hexParse(input) || nameParse(input) || functionParse(input);\n\t\t}\n\t\tthis._rgb = v;\n\t\tthis._valid = !!v;\n\t}\n\tget valid() {\n\t\treturn this._valid;\n\t}\n\tget rgb() {\n\t\tvar v = clone$1(this._rgb);\n\t\tif (v) {\n\t\t\tv.a = b2n(v.a);\n\t\t}\n\t\treturn v;\n\t}\n\tset rgb(obj) {\n\t\tthis._rgb = fromObject(obj);\n\t}\n\trgbString() {\n\t\treturn this._valid ? rgbString(this._rgb) : this._rgb;\n\t}\n\thexString() {\n\t\treturn this._valid ? hexString(this._rgb) : this._rgb;\n\t}\n\thslString() {\n\t\treturn this._valid ? hslString(this._rgb) : this._rgb;\n\t}\n\tmix(color, weight) {\n\t\tconst me = this;\n\t\tif (color) {\n\t\t\tconst c1 = me.rgb;\n\t\t\tconst c2 = color.rgb;\n\t\t\tlet w2;\n\t\t\tconst p = weight === w2 ? 0.5 : weight;\n\t\t\tconst w = 2 * p - 1;\n\t\t\tconst a = c1.a - c2.a;\n\t\t\tconst w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\tw2 = 1 - w1;\n\t\t\tc1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n\t\t\tc1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n\t\t\tc1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n\t\t\tc1.a = p * c1.a + (1 - p) * c2.a;\n\t\t\tme.rgb = c1;\n\t\t}\n\t\treturn me;\n\t}\n\tclone() {\n\t\treturn new Color(this.rgb);\n\t}\n\talpha(a) {\n\t\tthis._rgb.a = n2b(a);\n\t\treturn this;\n\t}\n\tclearer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 - ratio;\n\t\treturn this;\n\t}\n\tgreyscale() {\n\t\tconst rgb = this._rgb;\n\t\tconst val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n\t\trgb.r = rgb.g = rgb.b = val;\n\t\treturn this;\n\t}\n\topaquer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 + ratio;\n\t\treturn this;\n\t}\n\tnegate() {\n\t\tconst v = this._rgb;\n\t\tv.r = 255 - v.r;\n\t\tv.g = 255 - v.g;\n\t\tv.b = 255 - v.b;\n\t\treturn this;\n\t}\n\tlighten(ratio) {\n\t\tmodHSL(this._rgb, 2, ratio);\n\t\treturn this;\n\t}\n\tdarken(ratio) {\n\t\tmodHSL(this._rgb, 2, -ratio);\n\t\treturn this;\n\t}\n\tsaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, ratio);\n\t\treturn this;\n\t}\n\tdesaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, -ratio);\n\t\treturn this;\n\t}\n\trotate(deg) {\n\t\trotate(this._rgb, deg);\n\t\treturn this;\n\t}\n}\nfunction index_esm(input) {\n\treturn new Color(input);\n}\n\nconst isPatternOrGradient = (value) => value instanceof CanvasGradient || value instanceof CanvasPattern;\nfunction color(value) {\n return isPatternOrGradient(value) ? value : index_esm(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : index_esm(value).saturate(0.5).darken(0.1).hexString();\n}\n\nfunction noop() {}\nconst uid = (function() {\n let id = 0;\n return function() {\n return id++;\n };\n}());\nfunction isNullOrUndef(value) {\n return value === null || typeof value === 'undefined';\n}\nfunction isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n return true;\n }\n return false;\n}\nfunction isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\nconst isNumberFinite = (value) => (typeof value === 'number' || value instanceof Number) && isFinite(+value);\nfunction finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\nfunction valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : value / dimension;\nconst toDimension = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\nfunction callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\nfunction _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\nfunction clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\nfunction _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n for (let i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!isObject(source)) {\n continue;\n }\n const keys = Object.keys(source);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, source, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n return merge(target, source, {merger: _mergerIf});\n}\nfunction _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\nfunction _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\nconst emptyString = '';\nconst dot = '.';\nfunction indexOfDotOrLength(key, start) {\n const idx = key.indexOf(dot, start);\n return idx === -1 ? key.length : idx;\n}\nfunction resolveObjectKey(obj, key) {\n if (key === emptyString) {\n return obj;\n }\n let pos = 0;\n let idx = indexOfDotOrLength(key, pos);\n while (obj && idx > pos) {\n obj = obj[key.substr(pos, idx - pos)];\n pos = idx + 1;\n idx = indexOfDotOrLength(key, pos);\n }\n return obj;\n}\nfunction _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value) => typeof value !== 'undefined';\nconst isFunction = (value) => typeof value === 'function';\nconst setsEqual = (a, b) => {\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\nfunction getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\nclass Defaults {\n constructor(_descriptors) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.describe(_descriptors);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n}\nvar defaults = new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n});\n\nconst PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\nfunction _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b) => a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\nfunction _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\nfunction _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < (-0.5 * PI)) {\n angle += TAU;\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\nfunction _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\nfunction _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\nfunction _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\nfunction _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n\nfunction toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\nfunction _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\nfunction _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\nfunction clearCanvas(canvas, ctx) {\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n let type, xOffset, yOffset, size, cornerRadius;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch (style) {\n default:\n ctx.arc(x, y, radius, 0, TAU);\n ctx.closePath();\n break;\n case 'triangle':\n ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n ctx.rect(x - size, y - size, 2 * size, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n case 'rectRot':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + yOffset, y - xOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n case 'cross':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'star':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n rad += QUARTER_PI;\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'line':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\nfunction _isPointInArea(point, area, margin) {\n margin = margin || 0.5;\n return point && area && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\nfunction _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\nfunction _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\nfunction renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += font.lineHeight;\n }\n ctx.restore();\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction addRoundedRectPath(ctx, rect) {\n const {x, y, w, h, radius} = rect;\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n ctx.lineTo(x, y + h - radius.bottomLeft);\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n ctx.lineTo(x + w, y + radius.topRight);\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {lo, hi};\n}\nconst _lookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] < value);\nconst _rlookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] >= value);\nfunction _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n delete array._chartjs;\n}\nfunction _arrayUnique(items) {\n const set = new Set();\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n set.add(items[i]);\n }\n if (set.size === ilen) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\nfunction _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\nfunction parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element) => window.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);\nfunction getCanvasPosition(evt, canvas) {\n const e = evt.native || evt;\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const {offsetX, offsetY} = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\nfunction getRelativePosition$1(evt, chart) {\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(evt, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect();\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = v => Math.round(v * 10) / 10;\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n height = round1(width / 2);\n }\n return {\n width,\n height\n };\n}\nfunction retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = deviceHeight / pixelRatio;\n chart.width = deviceWidth / pixelRatio;\n const canvas = chart.canvas;\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\nconst supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() {\n passiveSupported = true;\n return false;\n }\n };\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n }\n return passiveSupported;\n}());\nfunction readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\nfunction getRelativePosition(e, chart) {\n if ('native' in e) {\n return {\n x: e.x,\n y: e.y\n };\n }\n return getRelativePosition$1(e, chart);\n}\nfunction evaluateAllVisibleItems(chart, handler) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n let index, data, element;\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n ({index, data} = metasets[i]);\n for (let j = 0, jlen = data.length; j < jlen; ++j) {\n element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n return {lo: 0, hi: data.length - 1};\n}\nfunction optimizedEvaluateItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\nfunction getIntersectItems(chart, position, axis, useFinalPosition) {\n const items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition) {\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n let items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (intersect && !element.inRange(position.x, position.y, useFinalPosition)) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n if (!_isPointInArea(center, chart.chartArea, chart._minPadding) && !element.inRange(position.x, position.y, useFinalPosition)) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n return items;\n}\nfunction getAxisItems(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const items = [];\n const axis = options.axis;\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateAllVisibleItems(chart, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n intersectsItem = true;\n }\n });\n if (options.intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\nvar Interaction = {\n modes: {\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition)\n : getNearestItems(chart, position, axis, false, useFinalPosition);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n return elements;\n },\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition) :\n getNearestItems(chart, position, axis, false, useFinalPosition);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n return items;\n },\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getIntersectItems(chart, position, axis, useFinalPosition);\n },\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition);\n },\n x(chart, e, options, useFinalPosition) {\n options.axis = 'x';\n return getAxisItems(chart, e, options, useFinalPosition);\n },\n y(chart, e, options, useFinalPosition) {\n options.axis = 'y';\n return getAxisItems(chart, e, options, useFinalPosition);\n }\n }\n};\n\nconst LINE_HEIGHT = new RegExp(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\nconst FONT_STYLE = new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);\nfunction toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero$1 = v => +v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n for (const prop of keys) {\n ret[prop] = numberOrZero$1(read(prop));\n }\n return ret;\n}\nfunction toTRBL(value) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\nfunction toTRBLCorners(value) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\nfunction toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\nfunction toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = '';\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\nfunction resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\nfunction _addGrace(minmax, grace) {\n const {min, max} = minmax;\n return {\n min: min - Math.abs(toDimension(grace, min)),\n max: max + toDimension(grace, max)\n };\n}\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\ndefaults.set('layout', {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n});\nvar layouts = {\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n chart.boxes.push(item);\n },\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h);\n });\n }\n};\n\nfunction _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n if (!defined(fallback)) {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: rootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete target._keys;\n delete scopes[0][prop];\n return true;\n },\n get(target, prop) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n has(target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n set(target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n storage[prop] = value;\n delete target[prop];\n delete target._keys;\n return true;\n }\n });\n}\nfunction _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete proxy[prop];\n return true;\n },\n get(target, prop, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n set(target, prop, value) {\n proxy[prop] = value;\n delete target[prop];\n return true;\n }\n });\n}\nfunction _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters';\nfunction _cached(target, prop, resolve) {\n let value = target[prop];\n if (defined(value)) {\n return value;\n }\n value = resolve();\n if (defined(value)) {\n target[prop] = value;\n }\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop];\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, value, target, receiver) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n value = value(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (isObject(value)) {\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n if (defined(_context.index) && isIndexable(prop)) {\n value = value[_context.index % value.length];\n } else if (isObject(value[0])) {\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, scope);\n if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n return fallback;\n }\n } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop);\n if (key === null) {\n return false;\n }\n if (defined(fallback) && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n return value;\n }\n return target;\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (defined(value)) {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (defined(value)) {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i) => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis) => indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01;\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\nfunction monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\nfunction splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\nfunction _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\nconst atEdge = (t) => t === 0 || t === 1;\nconst elasticIn = (t, s, p) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\nconst effects = {\n linear: t => t,\n easeInQuad: t => t * t,\n easeOutQuad: t => -t * (t - 2),\n easeInOutQuad: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n easeInCubic: t => t * t * t,\n easeOutCubic: t => (t -= 1) * t * t + 1,\n easeInOutCubic: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: t => t * t * t * t,\n easeOutQuart: t => -((t -= 1) * t * t * t - 1),\n easeInOutQuart: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: t => t * t * t * t * t,\n easeOutQuint: t => (t -= 1) * t * t * t * t + 1,\n easeInOutQuint: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: t => -Math.cos(t * HALF_PI) + 1,\n easeOutSine: t => Math.sin(t * HALF_PI),\n easeInOutSine: t => -0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: t => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: t => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: t => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: t => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: t => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: t => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: t => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic(t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack(t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack(t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack(t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n easeInBounce: t => 1 - effects.easeOutBounce(1 - t),\n easeOutBounce(t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n easeInOutBounce: t => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n};\n\nfunction _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\nfunction _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\nfunction _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x(x) {\n return x;\n },\n setWidth(w) {\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) {\n return x;\n },\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: (n, s, e) => n >= Math.min(s, e) && n <= Math.max(e, s),\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n let {start, end, loop} = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\nfunction _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n return result;\n}\nfunction _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n while (start < count && points[start].skip) {\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while (end > start && points[end % count].skip) {\n end--;\n }\n end %= count;\n return {start, end};\n}\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n return result;\n}\nfunction _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const baseStyle = readStyle(line.options);\n const count = points.length;\n const result = [];\n let start = segments[0].start;\n let i = start;\n for (const segment of segments) {\n let prevStyle = baseStyle;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext({\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex: line._datasetIndex\n }));\n if (styleChanged(style, prevStyle)) {\n result.push({start: start, end: i - 1, loop: segment.loop, style: prevStyle});\n prevStyle = style;\n start = i - 1;\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n result.push({start, end: i - 1, loop: segment.loop, style});\n start = i - 1;\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n\nvar helpers = /*#__PURE__*/Object.freeze({\n__proto__: null,\neasingEffects: effects,\ncolor: color,\ngetHoverColor: getHoverColor,\nnoop: noop,\nuid: uid,\nisNullOrUndef: isNullOrUndef,\nisArray: isArray,\nisObject: isObject,\nisFinite: isNumberFinite,\nfiniteOrDefault: finiteOrDefault,\nvalueOrDefault: valueOrDefault,\ntoPercentage: toPercentage,\ntoDimension: toDimension,\ncallback: callback,\neach: each,\n_elementsEqual: _elementsEqual,\nclone: clone,\n_merger: _merger,\nmerge: merge,\nmergeIf: mergeIf,\n_mergerIf: _mergerIf,\n_deprecated: _deprecated,\nresolveObjectKey: resolveObjectKey,\n_capitalize: _capitalize,\ndefined: defined,\nisFunction: isFunction,\nsetsEqual: setsEqual,\ntoFontString: toFontString,\n_measureText: _measureText,\n_longestText: _longestText,\n_alignPixel: _alignPixel,\nclearCanvas: clearCanvas,\ndrawPoint: drawPoint,\n_isPointInArea: _isPointInArea,\nclipArea: clipArea,\nunclipArea: unclipArea,\n_steppedLineTo: _steppedLineTo,\n_bezierCurveTo: _bezierCurveTo,\nrenderText: renderText,\naddRoundedRectPath: addRoundedRectPath,\n_lookup: _lookup,\n_lookupByKey: _lookupByKey,\n_rlookupByKey: _rlookupByKey,\n_filterBetween: _filterBetween,\nlistenArrayEvents: listenArrayEvents,\nunlistenArrayEvents: unlistenArrayEvents,\n_arrayUnique: _arrayUnique,\n_createResolver: _createResolver,\n_attachContext: _attachContext,\n_descriptors: _descriptors,\nsplineCurve: splineCurve,\nsplineCurveMonotone: splineCurveMonotone,\n_updateBezierControlPoints: _updateBezierControlPoints,\n_isDomSupported: _isDomSupported,\n_getParentNode: _getParentNode,\ngetStyle: getStyle,\ngetRelativePosition: getRelativePosition$1,\ngetMaximumSize: getMaximumSize,\nretinaScale: retinaScale,\nsupportsEventListenerOptions: supportsEventListenerOptions,\nreadUsedSize: readUsedSize,\nfontString: fontString,\nrequestAnimFrame: requestAnimFrame,\nthrottled: throttled,\ndebounce: debounce,\n_toLeftRightCenter: _toLeftRightCenter,\n_alignStartEnd: _alignStartEnd,\n_textX: _textX,\n_pointInLine: _pointInLine,\n_steppedInterpolation: _steppedInterpolation,\n_bezierInterpolation: _bezierInterpolation,\nformatNumber: formatNumber,\ntoLineHeight: toLineHeight,\n_readValueToProps: _readValueToProps,\ntoTRBL: toTRBL,\ntoTRBLCorners: toTRBLCorners,\ntoPadding: toPadding,\ntoFont: toFont,\nresolve: resolve,\n_addGrace: _addGrace,\nPI: PI,\nTAU: TAU,\nPITAU: PITAU,\nINFINITY: INFINITY,\nRAD_PER_DEG: RAD_PER_DEG,\nHALF_PI: HALF_PI,\nQUARTER_PI: QUARTER_PI,\nTWO_THIRDS_PI: TWO_THIRDS_PI,\nlog10: log10,\nsign: sign,\nniceNum: niceNum,\n_factorize: _factorize,\nisNumber: isNumber,\nalmostEquals: almostEquals,\nalmostWhole: almostWhole,\n_setMinAndMaxByKey: _setMinAndMaxByKey,\ntoRadians: toRadians,\ntoDegrees: toDegrees,\n_decimalPlaces: _decimalPlaces,\ngetAngleFromPoint: getAngleFromPoint,\ndistanceBetweenPoints: distanceBetweenPoints,\n_angleDiff: _angleDiff,\n_normalizeAngle: _normalizeAngle,\n_angleBetween: _angleBetween,\n_limitValue: _limitValue,\n_int16Range: _int16Range,\ngetRtlAdapter: getRtlAdapter,\noverrideTextDirection: overrideTextDirection,\nrestoreTextDirection: restoreTextDirection,\n_boundSegment: _boundSegment,\n_boundSegments: _boundSegments,\n_computeSegments: _computeSegments\n});\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = value => value === null || value === '';\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition$1(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n const element = container || canvas;\n const observer = new MutationObserver(entries => {\n const parent = _getParentNode(element);\n entries.forEach(entry => {\n for (let i = 0; i < entry.addedNodes.length; i++) {\n const added = entry.addedNodes[i];\n if (added === element || added === parent) {\n listener(entry.target);\n }\n }\n });\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const observer = new MutationObserver(entries => {\n entries.forEach(entry => {\n for (let i = 0; i < entry.removedNodes.length; i++) {\n if (entry.removedNodes[i] === canvas) {\n listener();\n break;\n }\n }\n });\n });\n observer.observe(container, {childList: true});\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart, (args) => {\n const event = args[0];\n return [event, event.offsetX, event.offsetY];\n });\n addListener(canvas, type, proxy);\n return proxy;\n}\nclass DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nvar platforms = /*#__PURE__*/Object.freeze({\n__proto__: null,\n_detectPlatform: _detectPlatform,\nBasePlatform: BasePlatform,\nBasicPlatform: BasicPlatform,\nDomPlatform: DomPlatform\n});\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color(from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n const me = this;\n if (me._active) {\n me._notify(false);\n const currentValue = me._target[me._prop];\n const elapsed = date - me._start;\n const remain = me._duration - elapsed;\n me._start = date;\n me._duration = Math.floor(Math.max(remain, cfg.duration));\n me._total += elapsed;\n me._loop = !!cfg.loop;\n me._to = resolve([cfg.to, to, currentValue, cfg.from]);\n me._from = resolve([cfg.from, currentValue, to]);\n }\n }\n cancel() {\n const me = this;\n if (me._active) {\n me.tick(Date.now());\n me._active = false;\n me._notify(false);\n }\n }\n tick(date) {\n const me = this;\n const elapsed = date - me._start;\n const duration = me._duration;\n const prop = me._prop;\n const from = me._from;\n const loop = me._loop;\n const to = me._to;\n let factor;\n me._active = from !== to && (loop || (elapsed < duration));\n if (!me._active) {\n me._target[prop] = to;\n me._notify(true);\n return;\n }\n if (elapsed < 0) {\n me._target[prop] = from;\n return;\n }\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = me._easing(Math.min(1, Math.max(0, factor)));\n me._target[prop] = me._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n\nconst numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\ndefaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n});\nconst animationOptions = Object.keys(defaults.animation);\ndefaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n});\ndefaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n});\ndefaults.describe('animations', {\n _fallback: 'animation',\n});\ndefaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0\n },\n }\n }\n});\nclass Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n return value;\n}\nfunction convertObjectDataToArray(data) {\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n x: key,\n y: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive) {\n for (const meta of vScale.getMatchingVisibleMetas('bar').reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true);\n stack._bottom = getLastIndexInStack(stack, vScale, false);\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return Object.assign(Object.create(parent),\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\nfunction createDataContext(parent, index, element) {\n return Object.assign(Object.create(parent), {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n }\n}\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nclass DatasetController {\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.$context = undefined;\n this._syncList = [];\n this.initialize();\n }\n initialize() {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n me.addElements();\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const me = this;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = me.getScaleForId(xid);\n meta.yScale = me.getScaleForId(yid);\n meta.rScale = me.getScaleForId(rid);\n meta.iScale = me.getScaleForId(iid);\n meta.vScale = me.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const me = this;\n const dataset = me.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = me._data;\n if (isObject(data)) {\n me._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, me);\n const meta = me._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, me);\n }\n me._syncList = [];\n me._data = data;\n }\n }\n addElements() {\n const me = this;\n const meta = me._cachedMeta;\n me._dataCheck();\n if (me.datasetElementType) {\n meta.dataset = new me.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n let stackChanged = false;\n me._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n me._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(me, meta._parsed);\n }\n }\n configure() {\n const me = this;\n const config = me.chart.config;\n const scopeKeys = config.datasetScopeKeys(me._type);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys, true);\n me.options = config.createResolver(scopes, me.getContext());\n me._parsing = me.options.parsing;\n }\n parse(start, count) {\n const me = this;\n const {_cachedMeta: meta, _data: data} = me;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (me._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = me.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = me.parseObjectData(meta, data, start, count);\n } else {\n parsed = me.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(me, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n value = applyStack(stack, parsedValue, this._cachedMeta.index, {all: true});\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const me = this;\n const meta = me._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = me._getOtherScale(scale);\n const stack = canStack && meta._stacked && {keys: getSortedDatasetIndices(me.chart, true), values: null};\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, value, parsed, otherValue;\n function _skip() {\n parsed = _parsed[i];\n value = parsed[scale.axis];\n otherValue = parsed[otherScale.axis];\n return !isNumberFinite(value) || otherMin > otherValue || otherMax < otherValue;\n }\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me._cachedDataOpts = {};\n me.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(me.options.clip, defaultClip(meta.xScale, meta.yScale, me.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const me = this;\n const ctx = me._ctx;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = me._drawStart || 0;\n const count = me._drawCount || (elements.length - start);\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const me = this;\n const dataset = me.getDataset();\n let context;\n if (index >= 0 && index < me._cachedMeta.data.length) {\n const element = me._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(me.getContext(), index, element));\n context.parsed = me.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = me.$context ||\n (me.$context = createDatasetContext(me.chart.getContext(), me.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = me.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const me = this;\n const active = mode === 'active';\n const cache = me._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = me.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = me.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(me._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = () => me.getContext(index, active);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const me = this;\n const chart = me.chart;\n const cache = me._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = me.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(me._type, transition);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n options = config.createResolver(scopes, me.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const me = this;\n const data = me._data;\n const elements = me._cachedMeta.data;\n for (const [method, arg1, arg2] of me._syncList) {\n me[method](arg1, arg2);\n }\n me._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n me.parse(0, count);\n }\n if (numData > numMeta) {\n me._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n me._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const me = this;\n const meta = me._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for (i = start; i < end; ++i) {\n data[i] = new me.dataElementType();\n }\n if (me._parsing) {\n move(meta._parsed);\n }\n me.parse(start, count);\n if (resetNewElements) {\n me.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const me = this;\n const meta = me._cachedMeta;\n if (me._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _onDataPush() {\n const count = arguments.length;\n this._syncList.push(['_insertElements', this.getDataset().data.length - count, count]);\n }\n _onDataPop() {\n this._syncList.push(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n _onDataShift() {\n this._syncList.push(['_removeElements', 0, 1]);\n }\n _onDataSplice(start, count) {\n this._syncList.push(['_removeElements', start, count]);\n this._syncList.push(['_insertElements', start, arguments.length - 2]);\n }\n _onDataUnshift() {\n this._syncList.push(['_insertElements', 0, arguments.length]);\n }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nclass Element {\n constructor() {\n this.x = undefined;\n this.y = undefined;\n this.active = false;\n this.options = undefined;\n this.$animations = undefined;\n }\n tooltipPosition(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const me = this;\n const anims = this.$animations;\n if (!final || !anims) {\n return me;\n }\n const ret = {};\n props.forEach(prop => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : me[prop];\n });\n return ret;\n }\n}\nElement.defaults = {};\nElement.defaultRoutes = undefined;\n\nconst formatters = {\n values(value) {\n return isArray(value) ? value : '' + value;\n },\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = tickValue / (Math.pow(10, Math.floor(log10(tickValue))));\n if (remain === 1 || remain === 2 || remain === 5) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\nvar Ticks = {formatters};\n\ndefaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n borderDash: [],\n borderDashOffset: 0.0,\n borderWidth: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n});\ndefaults.route('scale.ticks', 'color', '', 'color');\ndefaults.route('scale.grid', 'color', '', 'borderColor');\ndefaults.route('scale.grid', 'borderColor', '', 'borderColor');\ndefaults.route('scale.title', 'color', '', 'color');\ndefaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash',\n});\ndefaults.describe('scales', {\n _fallback: 'scale',\n});\ndefaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n});\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return (lines * font.lineHeight) + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return Object.assign(Object.create(parent), {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return Object.assign(Object.create(parent), {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\nclass Scale extends Element {\n constructor(cfg) {\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n const me = this;\n me.options = options.setContext(me.getContext());\n me.axis = options.axis;\n me._userMin = me.parse(options.min);\n me._userMax = me.parse(options.max);\n me._suggestedMin = me.parse(options.suggestedMin);\n me._suggestedMax = me.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n const me = this;\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {min, max};\n }\n const metas = me.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(me, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n const me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [this]);\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n const tickOpts = me.options.ticks;\n const sampleSize = tickOpts.sampleSize;\n me.beforeUpdate();\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me.ticks = null;\n me._labelSizes = null;\n me._gridLineItems = null;\n me._labelItems = null;\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n me._maxLength = me.isHorizontal()\n ? me.width + margins.left + margins.right\n : me.height + margins.top + margins.bottom;\n if (!me._dataLimitsCached) {\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n me._range = _addGrace(me, me.options.grace);\n me._dataLimitsCached = true;\n }\n me.beforeBuildTicks();\n me.ticks = me.buildTicks() || [];\n me.afterBuildTicks();\n const samplingEnabled = sampleSize < me.ticks.length;\n me._convertTicksToLabels(samplingEnabled ? sample(me.ticks, sampleSize) : me.ticks);\n me.configure();\n me.beforeCalculateLabelRotation();\n me.calculateLabelRotation();\n me.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n me.ticks = autoSkip(me, me.ticks);\n me._labelSizes = null;\n }\n if (samplingEnabled) {\n me._convertTicksToLabels(me.ticks);\n }\n me.beforeFit();\n me.fit();\n me.afterFit();\n me.afterUpdate();\n }\n configure() {\n const me = this;\n let reversePixels = me.options.reverse;\n let startPixel, endPixel;\n if (me.isHorizontal()) {\n startPixel = me.left;\n endPixel = me.right;\n } else {\n startPixel = me.top;\n endPixel = me.bottom;\n reversePixels = !reversePixels;\n }\n me._startPixel = startPixel;\n me._endPixel = endPixel;\n me._reversePixels = reversePixels;\n me._length = endPixel - startPixel;\n me._alignToPixels = me.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [this]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = 0;\n me.bottom = me.height;\n }\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [this]);\n }\n _callHooks(name) {\n const me = this;\n me.chart.notifyPlugins(name, me.getContext());\n callback(me.options[name], [me]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [this]);\n }\n generateTickLabels(ticks) {\n const me = this;\n const tickOpts = me.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [tick.value, i, ticks], me);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [this]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const me = this;\n const options = me.options;\n const tickOpts = options.ticks;\n const numTicks = me.ticks.length;\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {\n me.labelRotation = minRotation;\n return;\n }\n const labelSizes = me._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(me.chart.width - maxLabelWidth, 0, me.maxWidth);\n tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = me.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, me.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n me.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [this]);\n }\n beforeFit() {\n callback(this.options.beforeFit, [this]);\n }\n fit() {\n const me = this;\n const minSize = {\n width: 0,\n height: 0\n };\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = me;\n const display = me._isVisible();\n const isHorizontal = me.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = me.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = me.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && me.ticks.length) {\n const {first, last, widest, highest} = me._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(me.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n me._calculatePadding(first, last, sin, cos);\n }\n }\n me._handleMargins();\n if (isHorizontal) {\n me.width = me._length = chart.width - me._margins.left - me._margins.right;\n me.height = minSize.height;\n } else {\n me.width = minSize.width;\n me.height = me._length = chart.height - me._margins.top - me._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const me = this;\n const {ticks: {align, padding}, position} = me.options;\n const isRotated = me.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && me.axis === 'x';\n if (me.isHorizontal()) {\n const offsetLeft = me.getPixelForTick(0) - me.left;\n const offsetRight = me.right - me.getPixelForTick(me.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n me.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * me.width / (me.width - offsetLeft), 0);\n me.paddingRight = Math.max((paddingRight - offsetRight + padding) * me.width / (me.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n me.paddingTop = paddingTop + padding;\n me.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n const me = this;\n if (me._margins) {\n me._margins.left = Math.max(me.paddingLeft, me._margins.left);\n me._margins.top = Math.max(me.paddingTop, me._margins.top);\n me._margins.right = Math.max(me.paddingRight, me._margins.right);\n me._margins.bottom = Math.max(me.paddingBottom, me._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [this]);\n }\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n const me = this;\n me.beforeTickToLabelConversion();\n me.generateTickLabels(ticks);\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n me.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n const me = this;\n let labelSizes = me._labelSizes;\n if (!labelSizes) {\n const sampleSize = me.options.ticks.sampleSize;\n let ticks = me.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n me._labelSizes = labelSizes = me._computeLabelSizes(ticks, ticks.length);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for (i = 0; i < length; ++i) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n const me = this;\n if (me._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = me._startPixel + decimal * me._length;\n return _int16Range(me._alignToPixels ? _alignPixel(me.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const {min, max} = this;\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n getContext(index) {\n const me = this;\n const ticks = me.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(me.getContext(), index, tick));\n }\n return me.$context ||\n\t\t\t(me.$context = createScaleContext(me.chart.getContext(), me));\n }\n _tickSize() {\n const me = this;\n const optionTicks = me.options.ticks;\n const rot = toRadians(me.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = me._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return me.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const chart = me.chart;\n const options = me.options;\n const {grid, position} = options;\n const offset = grid.offset;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(me.bottom);\n ty1 = me.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(me.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = me.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(me.right);\n tx1 = me.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(me.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = me.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const optsAtIndex = grid.setContext(me.getContext(i));\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = grid.borderDash || [];\n const borderDashOffset = optsAtIndex.borderDashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(me, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n me._ticksLength = ticksLength;\n me._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const options = me.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(me.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = me.bottom - hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = me.top + hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = me.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = me._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = me.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = me._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = me._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(me.getContext(i));\n pixel = me.getPixelForTick(i) + optionTicks.labelOffset;\n font = me._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n if (isHorizontal) {\n x = pixel;\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = y + textOffset - labelPadding.top;\n let left = x - labelPadding.left;\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor,\n };\n }\n items.push({\n rotation,\n label,\n font,\n color,\n strokeColor,\n strokeWidth,\n textOffset,\n textAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const me = this;\n const {position, ticks} = me.options;\n const rotation = -toRadians(me.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const me = this;\n const {position, ticks: {crossAlign, mirror, padding}} = me.options;\n const labelSizes = me._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n textAlign = 'left';\n x = me.right + padding;\n } else {\n x = me.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = me.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n textAlign = 'right';\n x = me.left + padding;\n } else {\n x = me.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = me.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {textAlign, x};\n }\n _computeLabelArea() {\n const me = this;\n if (me.options.ticks.mirror) {\n return;\n }\n const chart = me.chart;\n const position = me.options.position;\n if (position === 'left' || position === 'right') {\n return {top: 0, left: me.left, bottom: chart.height, right: me.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: me.top, left: 0, bottom: me.bottom, right: chart.width};\n }\n }\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const me = this;\n const grid = me.options.grid;\n if (!me._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = me.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(me.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const me = this;\n const grid = me.options.grid;\n const ctx = me.ctx;\n const items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n drawBorder() {\n const me = this;\n const {chart, ctx, options: {grid}} = me;\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(me.getContext(0)).lineWidth;\n const borderValue = me._borderValue;\n let x1, x2, y1, y2;\n if (me.isHorizontal()) {\n x1 = _alignPixel(chart, me.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, me.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.borderWidth;\n ctx.strokeStyle = borderOpts.borderColor;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const me = this;\n const optionTicks = me.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = me.ctx;\n const area = me._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = me._labelItems || (me._labelItems = me._computeLabelItems(chartArea));\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n const tickFont = item.font;\n const label = item.label;\n if (item.backdrop) {\n ctx.fillStyle = item.backdrop.color;\n ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);\n }\n let y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, item);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n draw(chartArea) {\n const me = this;\n if (!me._isVisible()) {\n return;\n }\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawBorder();\n me.drawTitle();\n me.drawLabels(chartArea);\n }\n _layers() {\n const me = this;\n const opts = me.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n if (!me._isVisible() || me.draw !== Scale.prototype.draw) {\n return [{\n z: tz,\n draw(chartArea) {\n me.draw(chartArea);\n }\n }];\n }\n return [{\n z: gz,\n draw(chartArea) {\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawTitle();\n }\n }, {\n z: gz + 1,\n draw() {\n me.drawBorder();\n }\n }, {\n z: tz,\n draw(chartArea) {\n me.drawLabels(chartArea);\n }\n }];\n }\n getMatchingVisibleMetas(type) {\n const me = this;\n const metas = me.chart.getSortedVisibleDatasetMetas();\n const axisID = me.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === me.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const me = this;\n const fontSize = me._resolveTickFontOptions(0).lineHeight;\n return (me.isHorizontal() ? me.width : me.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const me = this;\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = me.register(proto);\n }\n const items = me.items;\n const id = item.id;\n const scope = me.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (me.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n const me = this;\n [...args].forEach(arg => {\n const reg = typedRegistry || me._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === me.plugins && arg.id)) {\n me._exec(method, reg, arg);\n } else {\n each(arg, item => {\n const itemReg = typedRegistry || me._getRegistryForType(item);\n me._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = new Registry();\n\nclass PluginService {\n constructor() {\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n const me = this;\n if (hook === 'beforeInit') {\n me._init = me._createDescriptors(chart, true);\n me._notify(me._init, chart, 'install');\n }\n const descriptors = filter ? me._descriptors(chart).filter(filter) : me._descriptors(chart);\n const result = me._notify(descriptors, chart, hook, args);\n if (hook === 'destroy') {\n me._notify(descriptors, chart, 'stop');\n me._notify(me._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\nfunction allPlugins(config) {\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n }\n }\n return plugins;\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, plugins, options, all) {\n const result = [];\n const context = chart.getContext();\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, plugin, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, plugin, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false, allKeys: true});\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, scaleOptions) {\n if (id === 'x' || id === 'y') {\n return id;\n }\n return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase();\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const firstIDs = Object.create(null);\n const scales = Object.create(null);\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n const axis = determineAxis(id, scaleConf);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n firstIDs[axis] = firstIDs[axis] || id;\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const {options, type} = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {type},\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n for (const prop of names) {\n if ((isScriptable(prop) && isFunction(proxy[prop]))\n || (isIndexable(prop) && isArray(proxy[prop]))) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"3.5.0\";\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [context], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [context], chart);\n}\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\nclass Chart {\n constructor(item, userConfig) {\n const me = this;\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas can be reused.'\n );\n }\n const options = config.createResolver(config.chartOptionScopes(), me.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n const context = me.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this.scale = undefined;\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(() => this.update('resize'), options.resizeDelay || 0);\n instances[me.id] = me;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(me, 'complete', onAnimationsComplete);\n animator.listen(me, 'progress', onAnimationProgress);\n me._initialize();\n if (me.attached) {\n me.update();\n }\n }\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n _initialize() {\n const me = this;\n me.notifyPlugins('beforeInit');\n if (me.options.responsive) {\n me.resize();\n } else {\n retinaScale(me, me.options.devicePixelRatio);\n }\n me.bindEvents();\n me.notifyPlugins('afterInit');\n return me;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n _resize(width, height) {\n const me = this;\n const options = me.options;\n const canvas = me.canvas;\n const aspectRatio = options.maintainAspectRatio && me.aspectRatio;\n const newSize = me.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || me.platform.getDevicePixelRatio();\n me.width = newSize.width;\n me.height = newSize.height;\n me._aspectRatio = me.aspectRatio;\n if (!retinaScale(me, newRatio, true)) {\n return;\n }\n me.notifyPlugins('resize', {size: newSize});\n callback(options.onResize, [me, newSize], me);\n if (me.attached) {\n if (me._doResize()) {\n me.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const me = this;\n const options = me.options;\n const scaleOpts = options.scales;\n const scales = me.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: me.ctx,\n chart: me\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale) => {\n layouts.configure(me, scale, scale.options);\n layouts.addBox(me, scale);\n });\n }\n _updateMetasets() {\n const me = this;\n const metasets = me._metasets;\n const numData = me.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n me._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n me._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const me = this;\n const {_metasets: metasets, data: {datasets}} = me;\n if (metasets.length > datasets.length) {\n delete me._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n me._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const me = this;\n const newControllers = [];\n const datasets = me.data.datasets;\n let i, ilen;\n me._removeUnreferencedMetasets();\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = me.getDatasetMeta(i);\n const type = dataset.type || me.config.type;\n if (meta.type && meta.type !== type) {\n me._destroyDatasetMeta(i);\n meta = me.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, me.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = me.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass.prototype, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(me, i);\n newControllers.push(meta.controller);\n }\n }\n me._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n const me = this;\n each(me.data.datasets, (dataset, datasetIndex) => {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const me = this;\n const config = me.config;\n config.update();\n me._options = config.createResolver(config.chartOptionScopes(), me.getContext());\n each(me.scales, (scale) => {\n layouts.removeBox(me, scale);\n });\n const animsDisabled = me._animationsDisabled = !me.options.animation;\n me.ensureScalesHaveIDs();\n me.buildOrUpdateScales();\n const existingEvents = new Set(Object.keys(me._listeners));\n const newEvents = new Set(me.options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== me.options.responsive) {\n me.unbindEvents();\n me.bindEvents();\n }\n me._plugins.invalidate();\n if (me.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n const newControllers = me.buildOrUpdateControllers();\n me.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; i++) {\n const {controller} = me.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n me._minPadding = minPadding;\n me._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n me._updateDatasets(mode);\n me.notifyPlugins('afterUpdate', {mode});\n me._layers.sort(compare2Level('z', '_idx'));\n if (me._lastEvent) {\n me._eventHandler(me._lastEvent, true);\n }\n me.render();\n }\n _updateLayout(minPadding) {\n const me = this;\n if (me.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n layouts.update(me, me.width, me.height, minPadding);\n const area = me.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n me._layers = [];\n each(me.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n me._layers.push(...box._layers());\n }, me);\n me._layers.forEach((item, index) => {\n item._idx = index;\n });\n me.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n const me = this;\n const isFunction = typeof mode === 'function';\n if (me.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._updateDataset(i, isFunction ? mode({datasetIndex: i}) : mode);\n }\n me.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n _updateDataset(index, mode) {\n const me = this;\n const meta = me.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n if (me.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n me.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n const me = this;\n if (me.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n if (animator.has(me)) {\n if (me.attached && !animator.running(me)) {\n animator.start(me);\n }\n } else {\n me.draw();\n onAnimationsComplete({chart: me});\n }\n }\n draw() {\n const me = this;\n let i;\n if (me._resizeBeforeDraw) {\n const {width, height} = me._resizeBeforeDraw;\n me._resize(width, height);\n me._resizeBeforeDraw = null;\n }\n me.clear();\n if (me.width <= 0 || me.height <= 0) {\n return;\n }\n if (me.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n const layers = me._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(me.chartArea);\n }\n me._drawDatasets();\n for (; i < layers.length; ++i) {\n layers[i].draw(me.chartArea);\n }\n me.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const me = this;\n const metasets = me._sortedMetasets;\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n const me = this;\n if (me.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n const metasets = me.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n me._drawDataset(metasets[i]);\n }\n me.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const me = this;\n const ctx = me.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = me.chartArea;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (me.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? me.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? me.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n me.notifyPlugins('afterDatasetDraw', args);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const me = this;\n const dataset = me.data.datasets[datasetIndex];\n const metasets = me._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = {chart: this, type: 'chart'});\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const me = this;\n const mode = visible ? 'show' : 'hide';\n const meta = me.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n me.update();\n } else {\n me.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {visible});\n me.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const me = this;\n const meta = me._metasets && me._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n delete me._metasets[datasetIndex];\n }\n }\n destroy() {\n const me = this;\n const {canvas, ctx} = me;\n let i, ilen;\n me.stop();\n animator.remove(me);\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._destroyDatasetMeta(i);\n }\n me.config.clearCache();\n if (canvas) {\n me.unbindEvents();\n clearCanvas(canvas, ctx);\n me.platform.releaseContext(ctx);\n me.canvas = null;\n me.ctx = null;\n }\n me.notifyPlugins('destroy');\n delete instances[me.id];\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const me = this;\n const listeners = me._listeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const listener = function(e, x, y) {\n e.offsetX = x;\n e.offsetY = y;\n me._eventHandler(e);\n };\n each(me.options.events, (type) => _add(type, listener));\n }\n bindResponsiveEvents() {\n const me = this;\n if (!me._responsiveListeners) {\n me._responsiveListeners = {};\n }\n const listeners = me._responsiveListeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(me, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height) => {\n if (me.canvas) {\n me.resize(width, height);\n }\n };\n let detached;\n const attached = () => {\n _remove('attach', attached);\n me.attached = true;\n me.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = () => {\n me.attached = false;\n _remove('resize', listener);\n _add('attach', attached);\n };\n if (platform.isAttached(me.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n const me = this;\n each(me._listeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._listeners = {};\n each(me._responsiveListeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const me = this;\n const lastActive = me._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n me._active = active;\n me._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n _updateHoverStyles(active, lastActive, replay) {\n const me = this;\n const hoverOptions = me.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n me.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n me.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const me = this;\n const args = {event: e, replay, cancelable: true};\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.type);\n if (me.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = me._handleEvent(e, replay);\n args.cancelable = false;\n me.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n me.render();\n }\n return me;\n }\n _handleEvent(e, replay) {\n const me = this;\n const {_active: lastActive = [], options} = me;\n const hoverOptions = options.hover;\n const useFinalPosition = replay;\n let active = [];\n let changed = false;\n let lastEvent = null;\n if (e.type !== 'mouseout') {\n active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n lastEvent = e.type === 'click' ? me._lastEvent : e;\n }\n me._lastEvent = null;\n if (_isPointInArea(e, me.chartArea, me._minPadding)) {\n callback(options.onHover, [e, active, me], me);\n if (e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu') {\n callback(options.onClick, [e, active, me], me);\n }\n }\n changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n me._active = active;\n me._updateHoverStyles(active, lastActive, replay);\n }\n me._lastEvent = lastEvent;\n return changed;\n }\n}\nconst invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate());\nconst enumerable = true;\nObject.defineProperties(Chart, {\n defaults: {\n enumerable,\n value: defaults\n },\n instances: {\n enumerable,\n value: instances\n },\n overrides: {\n enumerable,\n value: overrides\n },\n registry: {\n enumerable,\n value: registry\n },\n version: {\n enumerable,\n value: version\n },\n getChart: {\n enumerable,\n value: getChart\n },\n register: {\n enumerable,\n value: (...items) => {\n registry.add(...items);\n invalidatePlugins();\n }\n },\n unregister: {\n enumerable,\n value: (...items) => {\n registry.remove(...items);\n invalidatePlugins();\n }\n }\n});\n\nfunction abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\nclass DateAdapter {\n constructor(options) {\n this.options = options || {};\n }\n formats() {\n return abstract();\n }\n parse(value, format) {\n return abstract();\n }\n format(timestamp, format) {\n return abstract();\n }\n add(timestamp, amount, unit) {\n return abstract();\n }\n diff(a, b, unit) {\n return abstract();\n }\n startOf(timestamp, unit, weekday) {\n return abstract();\n }\n endOf(timestamp, unit) {\n return abstract();\n }\n}\nDateAdapter.override = function(members) {\n Object.assign(DateAdapter.prototype, members);\n};\nvar _adapters = {\n _date: DateAdapter\n};\n\nfunction getAllScaleValues(scale) {\n if (!scale._cache.$bar) {\n const metas = scale.getMatchingVisibleMetas('bar');\n let values = [];\n for (let i = 0, ilen = metas.length; i < ilen; i++) {\n values = values.concat(metas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\nfunction computeMinSampleSize(scale) {\n const values = getAllScaleValues(scale);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n const {start, end, reverse, top, bottom} = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nclass BarController extends DatasetController {\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n const me = this;\n me.enableOptionSharing = true;\n super.initialize();\n const meta = me._cachedMeta;\n meta.stack = me.getDataset().stack;\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = me;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = me._getRuler();\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n for (let i = start; i < start + count; i++) {\n const parsed = me.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : me._calculateBarValuePixels(i);\n const ipixels = me._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n setBorderSkipped(properties, properties.options || bars[i].options, stack, index);\n me.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const metasets = iScale.getMatchingVisibleMetas(me._type);\n const stacked = iScale.options.stacked;\n const ilen = metasets.length;\n const stacks = [];\n let i, item;\n for (i = 0; i < ilen; ++i) {\n item = metasets[i];\n if (!item.controller.options.grouped) {\n continue;\n }\n if (typeof dataIndex !== 'undefined') {\n const val = item.controller.getParsed(dataIndex)[\n item.controller._cachedMeta.vScale.axis\n ];\n if (isNullOrUndef(val) || isNaN(val)) {\n continue;\n }\n }\n if (stacked === false || stacks.indexOf(item.stack) === -1 ||\n\t\t\t\t(stacked === undefined && item.stack === undefined)) {\n stacks.push(item.stack);\n }\n if (item.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1;\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n _getRuler() {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(me.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(iScale);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: me._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const me = this;\n const {_cachedMeta: {vScale, _stacked}, options: {base: baseValue, minBarLength}} = me;\n const actualBase = baseValue || 0;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? me.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (me.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n head = base + size;\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const me = this;\n const scale = ruler.scale;\n const options = me.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? me._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = me._getStackIndex(me.index, me._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(me.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const me = this;\n const meta = me._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for (; i < ilen; ++i) {\n if (me.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(me._ctx);\n }\n }\n }\n}\nBarController.id = 'bar';\nBarController.defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n};\nBarController.overrides = {\n interaction: {\n mode: 'index'\n },\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n};\n\nclass BubbleController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = [];\n let i, ilen, item;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n item = data[i];\n parsed.push({\n x: xScale.parse(resolveObjectKey(item, xAxisKey), i),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), i),\n _custom: item && item.r && +item.r\n });\n }\n return parsed;\n }\n getMaxOverflow() {\n const {data, _parsed} = this._cachedMeta;\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size() / 2, _parsed[i]._custom);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {xScale, yScale} = meta;\n const parsed = me.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: meta.label,\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const me = this;\n const points = me._cachedMeta.data;\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && me.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n me.updateElement(point, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\nBubbleController.id = 'bubble';\nBubbleController.defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n};\nBubbleController.overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n }\n }\n }\n }\n};\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\nclass DoughnutController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = +data[i];\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n const me = this;\n for (let i = 0; i < me.chart.data.datasets.length; ++i) {\n if (me.chart.isDatasetVisible(i)) {\n const controller = me.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n update(mode) {\n const me = this;\n const chart = me.chart;\n const {chartArea} = chart;\n const meta = me._cachedMeta;\n const arcs = meta.data;\n const spacing = me.getMaxBorderWidth() + me.getMaxOffset(arcs) + me.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(me.options.cutout, maxSize), 1);\n const chartWeight = me._getRingWeight(me.index);\n const {circumference, rotation} = me._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(me.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / me._getVisibleDatasetWeightTotal();\n me.offsetX = offsetX * outerRadius;\n me.offsetY = offsetY * outerRadius;\n meta.total = me.calculateTotal();\n me.outerRadius = outerRadius - radiusLength * me._getRingWeightOffset(me.index);\n me.innerRadius = Math.max(me.outerRadius - radiusLength * chartWeight, 0);\n me.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const circumference = me._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return me.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : me.innerRadius;\n const outerRadius = animateScale ? 0 : me.outerRadius;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n let startAngle = me._getRotation();\n let i;\n for (i = 0; i < start; ++i) {\n startAngle += me._circumference(i, reset);\n }\n for (i = start; i < start + count; ++i) {\n const circumference = me._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + me.offsetX,\n y: centerY + me.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n me.updateElement(arc, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n getMaxBorderWidth(arcs) {\n const me = this;\n let max = 0;\n const chart = me.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n if (controller !== me) {\n controller.configure();\n }\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\nDoughnutController.id = 'doughnut';\nDoughnutController.defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r',\n};\nDoughnutController.descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing',\n};\nDoughnutController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle}} = chart.legend.options;\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(tooltipItem) {\n let dataLabel = tooltipItem.label;\n const value = ': ' + tooltipItem.formattedValue;\n if (isArray(dataLabel)) {\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n return dataLabel;\n }\n }\n }\n }\n};\n\nclass LineController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n const animationsDisabled = me.chart._animationsDisabled;\n let {start, count} = getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n me._drawStart = start;\n me._drawCount = count;\n if (scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._datasetIndex = me.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = me.options.segment;\n me.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n me.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const spanGaps = me.options.spanGaps;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = me.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && me.getParsed(start - 1);\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = me.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? me.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n properties.parsed = parsed;\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n me.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(me.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(me.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\nLineController.id = 'line';\nLineController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false,\n};\nLineController.overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n};\nfunction getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(\n _lookupByKey(_parsed, iScale.axis, min).lo,\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n _lookupByKey(_parsed, iScale.axis, max).hi + 1,\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {start, count};\n}\nfunction scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nclass PolarAreaController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _updateRadius() {\n const me = this;\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n me.outerRadius = outerRadius - (radiusLength * me.index);\n me.innerRadius = me.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const dataset = me.getDataset();\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = me._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / me.countVisibleElements();\n for (i = 0; i < start; ++i) {\n angle += me._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + me._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: me.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n me.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const dataset = this.getDataset();\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index) => {\n if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\nPolarAreaController.id = 'polarArea';\nPolarAreaController.defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n};\nPolarAreaController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle}} = chart.legend.options;\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(context) {\n return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue;\n }\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n};\n\nclass PieController extends DoughnutController {\n}\nPieController.id = 'pie';\nPieController.defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n};\n\nclass RadarController extends DatasetController {\n getLabelAndValue(index) {\n const me = this;\n const vScale = me._cachedMeta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n me.updateElement(line, undefined, properties, mode);\n }\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const dataset = me.getDataset();\n const scale = me._cachedMeta.rScale;\n const reset = mode === 'reset';\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n me.updateElement(point, i, properties, mode);\n }\n }\n}\nRadarController.id = 'radar';\nRadarController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n};\nRadarController.overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n};\n\nclass ScatterController extends LineController {\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n showLine: false,\n fill: false\n};\nScatterController.overrides = {\n interaction: {\n mode: 'point'\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(item) {\n return '(' + item.label + ', ' + item.formattedValue + ')';\n }\n }\n }\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n};\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\nfunction clipArc(ctx, element, endAngle) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\nfunction parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\nfunction rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\nfunction pathArc(ctx, element, offset, spacing, end) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle);\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true);\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, startAngle + TAU);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + circumference % TAU;\n if (circumference % TAU === 0) {\n endAngle += TAU;\n }\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle);\n ctx.fill();\n return endAngle;\n}\nfunction drawFullCircleBorders(ctx, element, inner) {\n const {x, y, startAngle, pixelMargin, fullCircles} = element;\n const outerRadius = Math.max(element.outerRadius - pixelMargin, 0);\n const innerRadius = element.innerRadius + pixelMargin;\n let i;\n if (inner) {\n clipArc(ctx, element, startAngle + TAU);\n }\n ctx.beginPath();\n ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n}\nfunction drawBorder(ctx, element, offset, spacing, endAngle) {\n const {options} = element;\n const inner = options.borderAlign === 'inner';\n if (!options.borderWidth) {\n return;\n }\n if (inner) {\n ctx.lineWidth = options.borderWidth * 2;\n ctx.lineJoin = 'round';\n } else {\n ctx.lineWidth = options.borderWidth;\n ctx.lineJoin = 'bevel';\n }\n if (element.fullCircles) {\n drawFullCircleBorders(ctx, element, inner);\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n pathArc(ctx, element, offset, spacing, endAngle);\n ctx.stroke();\n}\nclass ArcElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = this.options.spacing / 2;\n const betweenAngles = circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = (distance >= innerRadius + rAdjust && distance <= outerRadius + rAdjust);\n return (betweenAngles && withinRadius);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference',\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const me = this;\n const {options, circumference} = me;\n const offset = (options.offset || 0) / 2;\n const spacing = (options.spacing || 0) / 2;\n me.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n me.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || me.innerRadius < 0 || me.outerRadius < 0) {\n return;\n }\n ctx.save();\n let radiusOffset = 0;\n if (offset) {\n radiusOffset = offset / 2;\n const halfAngle = (me.startAngle + me.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n if (me.circumference >= PI) {\n radiusOffset = offset;\n }\n }\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n const endAngle = drawArc(ctx, me, radiusOffset, spacing);\n drawBorder(ctx, me, radiusOffset, spacing, endAngle);\n ctx.restore();\n }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n};\nArcElement.defaultRoutes = {\n backgroundColor: 'backgroundColor'\n};\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let {move = true, reverse} = params || {};\n let i, point, prev;\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && line.segments.length === 1) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n constructor(cfg) {\n super();\n this.animated = true;\n this.options = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const me = this;\n const options = me.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !me._pointsUpdated) {\n const loop = options.spanGaps ? me._loop : me._fullLoop;\n _updateBezierControlPoints(me._points, options, chartArea, loop, indexAxis);\n me._pointsUpdated = true;\n }\n }\n set points(points) {\n const me = this;\n me._points = points;\n delete me._segments;\n delete me._path;\n me._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const me = this;\n const options = me.options;\n const value = point[property];\n const points = me.points;\n const segments = _boundSegments(me, {property, start: value, end: value});\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const me = this;\n const segments = me.segments;\n const segmentMethod = _getSegmentMethod(me);\n let loop = me._loop;\n start = start || 0;\n count = count || (me.points.length - start);\n for (const segment of segments) {\n loop &= segmentMethod(ctx, me, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const me = this;\n const options = me.options || {};\n const points = me.points || [];\n if (!points.length || !options.borderWidth) {\n return;\n }\n ctx.save();\n draw(ctx, me, start, count);\n ctx.restore();\n if (me.animated) {\n me._pointsUpdated = false;\n me._path = undefined;\n }\n }\n}\nLineElement.id = 'line';\nLineElement.defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n};\nLineElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\nLineElement.descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n};\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\nclass PointElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const me = this;\n const options = me.options;\n if (me.skip || options.radius < 0.1 || !_isPointInArea(me, area, me.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, me.x, me.y);\n }\n getRange() {\n const options = this.options || {};\n return options.radius + options.hitRadius;\n }\n}\nPointElement.id = 'point';\nPointElement.defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n};\nPointElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {left, top, right, bottom};\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const options = this.options;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n const inflateAmount = 0.33;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = options.borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount, outer));\n ctx.fillStyle = options.backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\nBarElement.id = 'bar';\nBarElement.defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n enableBorderRadius: true,\n pointStyle: undefined\n};\nBarElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\n});\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for (i = 0; i < samples - 2; i++) {\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for (j = avgRangeStart; j < avgRangeEnd; j++) {\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const {x: pointAx, y: pointAy} = data[a];\n maxArea = area = -1;\n for (j = rangeOffs; j < rangeTo; j++) {\n area = 0.5 * Math.abs(\n (pointAx - avgX) * (data[j].y - pointAy) -\n (pointAx - data[j].x) * (avgY - pointAy)\n );\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for (i = start; i < start + count; ++i) {\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX,\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {value: data});\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset) => {\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const {iScale} = meta;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {start, count};\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false,\n },\n beforeElementsUpdate: (chart, args, options) => {\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex) => {\n const {_data, indexAxis} = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n return;\n }\n if (meta.type !== 'line') {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch (options.algorithm) {\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy(chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\nfunction decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n }\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n let target = null;\n let horizontal;\n if (fill === 'start') {\n target = scale.bottom;\n } else if (fill === 'end') {\n target = scale.top;\n } else if (isObject(fill)) {\n target = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n if (isNumberFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n return null;\n}\nclass simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const target = [];\n const start = options.reverse ? scale.max : scale.min;\n const end = options.reverse ? scale.min : scale.max;\n let i, center, value;\n if (fill === 'start') {\n value = start;\n } else if (fill === 'end') {\n value = end;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n if (options.grid.circular) {\n center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for (i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\nfunction buildStackLine(source) {\n const {chart, scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(chart, index);\n linesBelow.push(createBoundaryLine({x: null, y: scale.bottom}, line));\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\nconst isLineAndNotInHideAnimation = (meta) => meta.type === 'line' && !meta.hidden;\nfunction getLinesBelow(chart, index) {\n const below = [];\n const metas = chart.getSortedVisibleDatasetMetas();\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (isLineAndNotInHideAnimation(meta)) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (pointValue >= firstValue && pointValue <= lastValue) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\nfunction getTarget(source) {\n const {chart, fill, line} = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return createBoundaryLine(boundary, line);\n}\nfunction createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n if (!propagate) {\n return fill;\n }\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\nfunction _clip(ctx, target, clipY) {\n ctx.beginPath();\n target.path(ctx);\n ctx.lineTo(target.last().x, clipY);\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments) {\n let {start, end} = segment;\n end = findSegmentEnd(start, end, points);\n const bounds = getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments) {\n const subBounds = getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction clipBounds(ctx, scale, bounds) {\n const {top, bottom} = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\nfunction _fill(ctx, cfg) {\n const {line, target, property, color, scale} = cfg;\n const segments = _segments(line, target, property);\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, notShape && getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n _clip(ctx, target, area.top);\n _fill(ctx, {line, target, color: above, scale, property});\n ctx.restore();\n ctx.save();\n _clip(ctx, target, area.bottom);\n }\n _fill(ctx, {line, target, color: below, scale, property});\n ctx.restore();\n}\nfunction drawfill(ctx, source, area) {\n const target = getTarget(source);\n const {line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis});\n unclipArea(ctx);\n }\n}\nvar plugin_filler = {\n id: 'filler',\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw) {\n drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (source) {\n drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n if (!source || source.fill === false || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config) {\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins;\n me.setDimensions();\n me.buildLabels();\n me.fit();\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = me._margins.left;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = me._margins.top;\n me.bottom = me.height;\n }\n }\n buildLabels() {\n const me = this;\n const labelOpts = me.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [me.chart], me) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, me.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, me.chart.data));\n }\n if (me.options.reverse) {\n legendItems.reverse();\n }\n me.legendItems = legendItems;\n }\n fit() {\n const me = this;\n const {options, ctx} = me;\n if (!options.display) {\n me.width = me.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = me._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (me.isHorizontal()) {\n width = me.maxWidth;\n height = me._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = me.maxHeight;\n width = me._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n }\n me.width = Math.min(width, options.maxWidth || me.maxWidth);\n me.height = Math.min(height, options.maxHeight || me.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxWidth, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const lineWidths = me.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxHeight, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const columnSizes = me.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n return totalWidth;\n }\n adjustHitBoxes() {\n const me = this;\n if (!me.options.display) {\n return;\n }\n const titleHeight = me._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = me;\n const rtlHelper = getRtlAdapter(rtl, me.left, me.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n }\n hitbox.top += me.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += me.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n const me = this;\n if (me.options.display) {\n const ctx = me.ctx;\n clipArea(ctx, me);\n me._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const me = this;\n const {options: opts, columnSizes, lineWidths, ctx} = me;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const labelFont = toFont(labelOpts.font);\n const {color: fontColor, padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n me.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxWidth * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = me.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, me.left + padding, me.right - lineWidths[0]),\n y: me.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + padding,\n y: _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(me.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n me.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor || fontColor;\n ctx.fillStyle = legendItem.fontColor || fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(me.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > me.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, me.left + padding, me.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > me.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : me.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(me.ctx, opts.textDirection);\n }\n drawTitle() {\n const me = this;\n const opts = me.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const ctx = me.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = me.left;\n let maxWidth = me.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...me.lineWidths);\n y = me.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, me.right - maxWidth);\n } else {\n const maxHeight = me.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, me.top, me.bottom - maxHeight - opts.labels.padding - me._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n const me = this;\n let i, hitBox, lh;\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n lh = me.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n return me.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const me = this;\n const opts = me.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = me._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove') {\n const previous = me._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [e, previous, me], me);\n }\n me._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [e, hoveredItem, me], me);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [e, hoveredItem, me], me);\n }\n }\n}\nfunction isListened(type, opts) {\n if (type === 'mousemove' && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color}} = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: 0,\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n\nclass Title extends Element {\n constructor(config) {\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const me = this;\n const opts = me.options;\n me.left = 0;\n me.top = 0;\n if (!opts.display) {\n me.width = me.height = me.right = me.bottom = 0;\n return;\n }\n me.width = me.right = maxWidth;\n me.height = me.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n me._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + me._padding.height;\n if (me.isHorizontal()) {\n me.height = textSize;\n } else {\n me.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const {top, left, bottom, right, options} = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {titleX, titleY, maxWidth, rotation};\n }\n draw() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + me._padding.top;\n const {titleX, titleY, maxWidth, rotation} = me._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold',\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n\nconst positioners = {\n average(items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n return {\n x: x / count,\n y: y / count\n };\n },\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip._chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? (boxWidth + 2) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {width, height};\n}\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\nfunction determineAlignment(chart, options, size) {\n const yAlign = options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const radiusAndPadding = cornerRadius + caretPadding;\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return Object.assign(Object.create(parent), {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nclass Tooltip extends Element {\n constructor(config) {\n super();\n this.opacity = 0;\n this._active = [];\n this._chart = config._chart;\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const me = this;\n const cached = me._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = me._chart;\n const options = me.options.setContext(me.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(me._chart, opts);\n if (opts._cacheable) {\n me._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n const me = this;\n return me.$context ||\n\t\t\t(me.$context = createTooltipContext(me._chart.getContext(), me, me._tooltipItems));\n }\n getTitle(context, options) {\n const me = this;\n const {callbacks} = options;\n const beforeTitle = callbacks.beforeTitle.apply(me, [context]);\n const title = callbacks.title.apply(me, [context]);\n const afterTitle = callbacks.afterTitle.apply(me, [context]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems]));\n }\n getBody(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const bodyItems = [];\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(me, context)));\n pushOrConcat(bodyItem.lines, scoped.label.call(me, context));\n pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(me, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems]));\n }\n getFooter(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const beforeFooter = callbacks.beforeFooter.apply(me, [tooltipItems]);\n const footer = callbacks.footer.apply(me, [tooltipItems]);\n const afterFooter = callbacks.afterFooter.apply(me, [tooltipItems]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const me = this;\n const active = me._active;\n const data = me._chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(me._chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(scoped.labelColor.call(me, context));\n labelPointStyles.push(scoped.labelPointStyle.call(me, context));\n labelTextColors.push(scoped.labelTextColor.call(me, context));\n });\n me.labelColors = labelColors;\n me.labelPointStyles = labelPointStyles;\n me.labelTextColors = labelTextColors;\n me.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n const active = me._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (me.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(me, active, me._eventPosition);\n tooltipItems = me._createItems(options);\n me.title = me.getTitle(tooltipItems, options);\n me.beforeBody = me.getBeforeBody(tooltipItems, options);\n me.body = me.getBody(tooltipItems, options);\n me.afterBody = me.getAfterBody(tooltipItems, options);\n me.footer = me.getFooter(tooltipItems, options);\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(me._chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, me._chart);\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n me._tooltipItems = tooltipItems;\n me.$context = undefined;\n if (properties) {\n me._resolveAnimations().update(me, properties);\n }\n if (changed && options.external) {\n options.external.call(me, {chart: me._chart, tooltip: me, replay});\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {cornerRadius, caretSize} = options;\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n drawTitle(pt, ctx, options) {\n const me = this;\n const title = me.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const me = this;\n const labelColors = me.labelColors[i];\n const labelPointStyle = me.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(me, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColors.borderColor;\n ctx.fillStyle = labelColors.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = labelColors.borderWidth || 1;\n ctx.strokeStyle = labelColors.borderColor;\n ctx.setLineDash(labelColors.borderDash || []);\n ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColors.borderRadius);\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = me.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const me = this;\n const {body} = me;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(me, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(me.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + 1) : (boxWidth + 2)\n : 0;\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = me.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n me._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(me.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const me = this;\n const footer = me.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const radius = options.cornerRadius;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const me = this;\n const chart = me._chart;\n const anims = me.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(me, me._active, me._eventPosition);\n if (!position) {\n return;\n }\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, me._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n me.width = size.width;\n me.height = size.height;\n me.caretX = position.x;\n me.caretY = position.y;\n me._resolveAnimations().update(me, point);\n }\n }\n }\n draw(ctx) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n let opacity = me.opacity;\n if (!opacity) {\n return;\n }\n me._updateAnimationTarget(options);\n const tooltipSize = {\n width: me.width,\n height: me.height\n };\n const pt = {\n x: me.x,\n y: me.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = me.title.length || me.beforeBody.length || me.body.length || me.afterBody.length || me.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n me.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n me.drawTitle(pt, ctx, options);\n me.drawBody(pt, ctx, options);\n me.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const me = this;\n const lastActive = me._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me._chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = me._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n me._active = active;\n me._eventPosition = eventPosition;\n me.update(true);\n }\n }\n handleEvent(e, replay) {\n const me = this;\n const options = me.options;\n const lastActive = me._active || [];\n let changed = false;\n let active = [];\n if (e.type !== 'mouseout') {\n active = me._chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n }\n const positionChanged = me._positionChanged(active, e);\n changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n me._active = active;\n if (options.enabled || options.external) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n me.update(true, replay);\n }\n }\n return changed;\n }\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nTooltip.positioners = positioners;\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({_chart: chart, options});\n }\n },\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n return;\n }\n if (tooltip) {\n tooltip.draw(chart.ctx);\n }\n chart.notifyPlugins('afterTooltipDraw', args);\n },\n afterEvent(chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: {\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n }\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: ['interaction']\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nDecimation: plugin_decimation,\nFiller: plugin_filler,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index) => typeof raw === 'string'\n ? labels.push(raw) - 1\n : isNaN(raw) ? null : index;\nfunction findOrAddLabel(labels, raw, index) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\nclass CategoryScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw));\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me.getMinMax(true);\n if (me.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = me.getLabels().length - 1;\n }\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const min = me.min;\n const max = me.max;\n const offset = me.options.offset;\n const ticks = [];\n let labels = me.getLabels();\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n me._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n me._startValue = me.min - (offset ? 0.5 : 0);\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n getLabelForValue(value) {\n const me = this;\n const labels = me.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n }\n configure() {\n const me = this;\n super.configure();\n if (!me.isHorizontal()) {\n me._reversePixels = !me._reversePixels;\n }\n }\n getPixelForValue(value) {\n const me = this;\n if (typeof value !== 'number') {\n value = me.parse(value);\n }\n return value === null ? NaN : me.getPixelForDecimal((value - me._startValue) / me._valueRange);\n }\n getPixelForTick(index) {\n const me = this;\n const ticks = me.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return me.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n const me = this;\n return Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\nCategoryScale.id = 'category';\nCategoryScale.defaults = {\n ticks: {\n callback: CategoryScale.prototype.getLabelForValue\n }\n};\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for (; j < numSpaces; ++j) {\n ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const me = this;\n const {beginAtZero} = me.options;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = 1;\n if (max >= Number.MAX_SAFE_INTEGER || min <= Number.MIN_SAFE_INTEGER) {\n offset = Math.abs(max * 0.05);\n }\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n me.min = min;\n me.max = max;\n }\n getTickLimit() {\n const me = this;\n const tickOpts = me.options.ticks;\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\n } else {\n maxTicks = me.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const tickOpts = opts.ticks;\n let maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: me._maxDigits(),\n horizontal: me.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = me._range || me;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n configure() {\n const me = this;\n const ticks = me.ticks;\n let start = me.min;\n let end = me.max;\n super.configure();\n if (me.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n me._startValue = start;\n me._endValue = end;\n me._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? min : 0;\n me.max = isNumberFinite(max) ? max : 1;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n const me = this;\n const horizontal = me.isHorizontal();\n const length = horizontal ? me.width : me.height;\n const minRotation = toRadians(me.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = me._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\nLinearScale.id = 'linear';\nLinearScale.defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n};\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, Math.floor(log10(tickVal))));\n return remain === 1;\n}\nfunction generateTicks(generationOptions, dataRange) {\n const endExp = Math.floor(log10(dataRange.max));\n const endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n const ticks = [];\n let tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n let exp = Math.floor(log10(tickVal));\n let significand = Math.floor(tickVal / Math.pow(10, exp));\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n do {\n ticks.push({value: tickVal, major: isMajor(tickVal)});\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n precision = exp >= 0 ? 1 : precision;\n }\n tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n } while (exp < endExp || (exp === endExp && significand < endSignificand));\n const lastTick = finiteOrDefault(generationOptions.max, tickVal);\n ticks.push({value: lastTick, major: isMajor(tickVal)});\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? Math.max(0, min) : null;\n me.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (me.options.beginAtZero) {\n me._zero = true;\n }\n me.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let min = me.min;\n let max = me.max;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n const exp = (v, m) => Math.pow(10, Math.floor(log10(v)) + m);\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(exp(min, -1));\n setMax(exp(max, +1));\n }\n }\n if (min <= 0) {\n setMin(exp(max, -1));\n }\n if (max <= 0) {\n setMax(exp(min, +1));\n }\n if (me._zero && me.min !== me._suggestedMin && min === exp(me.min, 0)) {\n setMin(exp(min, -1));\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const generationOptions = {\n min: me._userMin,\n max: me._userMax\n };\n const ticks = generateTicks(generationOptions, me);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale);\n }\n configure() {\n const me = this;\n const start = me.min;\n super.configure();\n me._startValue = log10(start);\n me._valueRange = log10(me.max) - log10(start);\n }\n getPixelForValue(value) {\n const me = this;\n if (value === undefined || value === 0) {\n value = me.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return me.getPixelForDecimal(value === me.min\n ? 0\n : (log10(value) - me._startValue) / me._valueRange);\n }\n getValueForPixel(pixel) {\n const me = this;\n const decimal = me.getDecimalForPixel(pixel);\n return Math.pow(10, me._startValue + decimal * me._valueRange);\n }\n}\nLogarithmicScale.id = 'logarithmic';\nLogarithmicScale.defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n};\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\nfunction fitWithPointLabels(scale) {\n const furthestLimits = {\n l: 0,\n r: scale.width,\n t: 0,\n b: scale.height - scale.paddingTop\n };\n const furthestAngles = {};\n const labelSizes = [];\n const padding = [];\n const valueCount = scale.getLabels().length;\n for (let i = 0; i < valueCount; i++) {\n const opts = scale.options.pointLabels.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i]);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = scale.getIndexAngle(i);\n const angle = toDegrees(angleRadians);\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n scale._setReductions(scale.drawingArea, furthestLimits, furthestAngles);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale.getLabels().length;\n const opts = scale.options;\n const tickBackdropHeight = getTickBackdropHeight(opts);\n const outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n for (let i = 0; i < valueCount; i++) {\n const extra = (i === 0 ? tickBackdropHeight / 2 : 0);\n const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i]);\n const angle = toDegrees(scale.getIndexAngle(i));\n const size = labelSizes[i];\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n items.push({\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n });\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n for (let i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n const {backdropColor} = optsAtIndex;\n if (!isNullOrUndef(backdropColor)) {\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillStyle = backdropColor;\n ctx.fillRect(left - padding.left, top - padding.top, right - left + padding.width, bottom - top + padding.height);\n }\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const {color, lineWidth} = gridLineOpts;\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(gridLineOpts.borderDash);\n ctx.lineDashOffset = gridLineOpts.borderDashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction numberOrZero(param) {\n return isNumber(param) ? param : 0;\n}\nfunction createPointLabelContext(parent, index, label) {\n return Object.assign(Object.create(parent), {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n constructor(cfg) {\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const me = this;\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.paddingTop = getTickBackdropHeight(me.options) / 2;\n me.xCenter = Math.floor(me.width / 2);\n me.yCenter = Math.floor((me.height - me.paddingTop) / 2);\n me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(false);\n me.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n me.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n const me = this;\n LinearScaleBase.prototype.generateTickLabels.call(me, ticks);\n me._pointLabels = me.getLabels().map((value, index) => {\n const label = callback(me.options.pointLabels.callback, [value, index], me);\n return label || label === 0 ? label : '';\n });\n }\n fit() {\n const me = this;\n const opts = me.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(me);\n } else {\n me.setCenterPoint(0, 0, 0, 0);\n }\n }\n _setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n const me = this;\n let radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n let radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n let radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n let radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n me.drawingArea = Math.max(largestPossibleRadius / 2, Math.min(\n Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n const me = this;\n const maxRight = me.width - rightMovement - me.drawingArea;\n const maxLeft = leftMovement + me.drawingArea;\n const maxTop = topMovement + me.drawingArea;\n const maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;\n me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);\n me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / this.getLabels().length;\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n const me = this;\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const me = this;\n const scaledDistance = distance / (me.drawingArea / (me.max - me.min));\n return me.options.reverse ? me.max - scaledDistance : me.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const me = this;\n const pointLabels = me._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(me.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter) {\n const me = this;\n const angle = me.getIndexAngle(index) - HALF_PI;\n return {\n x: Math.cos(angle) * distanceFromCenter + me.xCenter,\n y: Math.sin(angle) * distanceFromCenter + me.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n drawBackground() {\n const me = this;\n const {backgroundColor, grid: {circular}} = me.options;\n if (backgroundColor) {\n const ctx = me.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(me, me.getDistanceFromCenterForValue(me._endValue), circular, me.getLabels().length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const {angleLines, grid} = opts;\n const labelCount = me.getLabels().length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(me, labelCount);\n }\n if (grid.display) {\n me.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = me.getDistanceFromCenterForValue(tick.value);\n const optsAtIndex = grid.setContext(me.getContext(index - 1));\n drawRadiusLine(me, optsAtIndex, offset, labelCount);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for (i = me.getLabels().length - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(me.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);\n position = me.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(me.xCenter, me.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = me.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n me.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(me.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = me.getDistanceFromCenterForValue(me.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\nRadialLinearScale.id = 'radialLinear';\nRadialLinearScale.defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback(label) {\n return label;\n },\n padding: 5\n }\n};\nRadialLinearScale.defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n};\nRadialLinearScale.descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n};\n\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\nconst UNITS = (Object.keys(INTERVALS));\nfunction sorter(a, b) {\n return a - b;\n}\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n return +value;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n constructor(props) {\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new _adapters._date(scaleOpts.adapters.date);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const me = this;\n const options = me.options;\n const adapter = me._adapter;\n const unit = options.time.unit || 'day';\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(me._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(me.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n me.min = Math.min(min, max - 1);\n me.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n buildTicks() {\n const me = this;\n const options = me.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? me.getLabelTimestamps() : me._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n me.min = me._userMin || timestamps[0];\n me.max = me._userMax || timestamps[timestamps.length - 1];\n }\n const min = me.min;\n const max = me.max;\n const ticks = _filterBetween(timestamps, min, max);\n me._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, me._getLabelCapacity(min))\n : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));\n me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined\n : determineMajorUnit(me._unit);\n me.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(me, ticks, me._majorUnit);\n }\n initOffsets(timestamps) {\n const me = this;\n let start = 0;\n let end = 0;\n let first, last;\n if (me.options.offset && timestamps.length) {\n first = me.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (me.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = me.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - me.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n me._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n _generate() {\n const me = this;\n const adapter = me._adapter;\n const min = me.min;\n const max = me.max;\n const options = me.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, me._getLabelCapacity(min));\n const stepSize = valueOrDefault(timeOpts.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && me.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n }\n getLabelForValue(value) {\n const me = this;\n const adapter = me._adapter;\n const timeOpts = me.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const me = this;\n const options = me.options;\n const formats = options.time.displayFormats;\n const unit = me._unit;\n const majorUnit = me._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n const label = me._adapter.format(time, format || (major ? majorFormat : minorFormat));\n const formatter = options.ticks.callback;\n return formatter ? callback(formatter, [label, index, ticks], me) : label;\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n const me = this;\n return value === null ? NaN : (value - me.min) / (me.max - me.min);\n }\n getPixelForValue(value) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForValue(value);\n return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return me.min + pos * (me.max - me.min);\n }\n _getLabelSize(label) {\n const me = this;\n const ticksOpts = me.options.ticks;\n const tickLabelWidth = me.ctx.measureText(label).width;\n const angle = toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = me._resolveTickFontOptions(0).size;\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n _getLabelCapacity(exampleTime) {\n const me = this;\n const timeOpts = me.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = me._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);\n const size = me._getLabelSize(exampleLabel);\n const capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n const me = this;\n let timestamps = me._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = me.getMatchingVisibleMetas();\n if (me._normalized && metas.length) {\n return (me._cache.data = metas[0].controller.getAllParsedValues(me));\n }\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(me));\n }\n return (me._cache.data = me.normalize(timestamps));\n }\n getLabelTimestamps() {\n const me = this;\n const timestamps = me._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = me.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(me, labels[i]));\n }\n return (me._cache.labels = me._normalized ? timestamps : me.normalize(timestamps));\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\nTimeScale.id = 'time';\nTimeScale.defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n major: {\n enabled: false\n }\n }\n};\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n constructor(props) {\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const me = this;\n const timestamps = me._getTimestampsForTable();\n const table = me._table = me.buildLookupTable(timestamps);\n me._minPos = interpolate(table, me.min);\n me._tableRange = interpolate(table, me.max) - me._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n _getTimestampsForTable() {\n const me = this;\n let timestamps = me._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = me.getDataTimestamps();\n const label = me.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = me.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = me._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const decimal = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(me._table, decimal * me._tableRange + me._minPos, true);\n }\n}\nTimeSeriesScale.id = 'timeseries';\nTimeSeriesScale.defaults = TimeScale.defaults;\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nChart.register(controllers, scales, elements, plugins);\nChart.helpers = {...helpers};\nChart._adapters = _adapters;\nChart.Animation = Animation;\nChart.Animations = Animations;\nChart.animator = animator;\nChart.controllers = registry.controllers.items;\nChart.DatasetController = DatasetController;\nChart.Element = Element;\nChart.elements = elements;\nChart.Interaction = Interaction;\nChart.layouts = layouts;\nChart.platforms = platforms;\nChart.Scale = Scale;\nChart.Ticks = Ticks;\nObject.assign(Chart, controllers, scales, elements, plugins, platforms);\nChart.Chart = Chart;\nif (typeof window !== 'undefined') {\n window.Chart = Chart;\n}\n\nreturn Chart;\n\n})));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(548);\n"],"names":["module","exports","fontString","pixelSize","fontStyle","fontFamily","requestAnimFrame","window","callback","requestAnimationFrame","throttled","fn","thisArg","updateFn","updateArgs","args","Array","prototype","slice","call","ticking","rest","apply","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","start","end","_textX","left","right","rtl","Animator","constructor","this","_request","_charts","Map","_running","_lastDate","undefined","_notify","chart","anims","date","type","callbacks","listeners","numSteps","duration","forEach","initial","currentStep","Math","min","_refresh","me","_update","Date","now","remaining","running","items","length","item","i","draw","_active","_total","tick","pop","_getAnims","charts","get","complete","progress","set","listen","event","cb","push","add","has","reduce","acc","cur","max","_duration","stop","cancel","remove","delete","animator","map$1","A","B","C","D","E","F","a","b","c","d","e","f","hex","h1","h2","eq","isShort","v","r","g","hexParse","str","ret","len","hexString","round","lim","l","h","p2b","n2b","b2n","n2p","RGB_RE","rgbParse","m","exec","rgbString","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","rgb2hsl","range","calln","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","p1","p2","rotate","deg","hslString","map$1$1","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","keys","Object","tkeys","j","ok","nk","replace","parseInt","names$1","nameParse","transparent","toLowerCase","modHSL","ratio","tmp","clone$1","proto","assign","fromObject","input","functionParse","charAt","Color","_rgb","_valid","obj","mix","color","weight","c1","c2","w2","p","w1","clone","alpha","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","index_esm","isPatternOrGradient","value","CanvasGradient","CanvasPattern","getHoverColor","noop","uid","id","isNullOrUndef","toString","substr","isObject","isNumberFinite","Number","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","index","source","target","create","klen","isValidKey","key","indexOf","_merger","options","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","_deprecated","scope","previous","current","console","warn","emptyString","dot","indexOfDotOrLength","idx","resolveObjectKey","pos","_capitalize","toUpperCase","defined","isFunction","setsEqual","size","overrides","descriptors","getScope$1","node","split","root","values","Defaults","_descriptors","animation","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","style","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","maintainAspectRatio","onHover","onClick","parsing","plugins","responsive","scale","scales","showLine","describe","override","route","name","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","enumerable","local","defaults","_scriptable","startsWith","_indexable","_fallback","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","niceNum","roundedRange","almostEquals","niceRange","pow","floor","fraction","_factorize","result","sqrt","sort","isNumber","isNaN","y","epsilon","abs","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","toFontString","_measureText","data","gc","longest","string","textWidth","measureText","width","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","splice","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","xOffset","yOffset","cornerRadius","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","arc","closePath","moveTo","sin","cos","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","point","area","margin","top","bottom","clipArea","clip","unclipArea","_steppedLineTo","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","text","opts","lines","strokeWidth","strokeColor","line","setRenderOpts","strokeStyle","lineWidth","strokeText","maxWidth","fillText","decorateText","translation","fillStyle","textAlign","textBaseline","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","_lookup","table","cmp","mid","hi","lo","_lookupByKey","_rlookupByKey","_filterBetween","arrayEvents","listenArrayEvents","listener","_chartjs","defineProperty","configurable","method","base","res","object","unlistenArrayEvents","stub","_arrayUnique","Set","from","_isDomSupported","document","_getParentNode","domNode","parent","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","getStyle","el","getPropertyValue","positions","getPositionedStyle","styles","suffix","useOffsetPos","shadowRoot","getCanvasPosition","evt","native","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition$1","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","addEventListener","removeEventListener","readUsedSize","matches","match","getRelativePosition","evaluateAllVisibleItems","handler","metasets","getSortedVisibleDatasetMetas","skip","binarySearch","metaset","axis","controller","_sorted","iScale","_cachedMeta","lookupMethod","_reversePixels","_sharedOptions","getRange","optimizedEvaluateItems","position","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","chartArea","_minPadding","inRange","getNearestItems","distanceMetric","minDistance","center","getCenterPoint","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","meta","dataset","getDatasetMeta","nearest","LINE_HEIGHT","RegExp","FONT_STYLE","toLineHeight","numberOrZero$1","_readValueToProps","props","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","resolve","inputs","info","cacheable","_addGrace","minmax","grace","STATIC_POSITIONS","filterByPosition","filter","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stack","stackWeight","horizontal","isHorizontal","buildStacks","layouts","stacks","wrap","includes","_stack","count","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","factor","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","concat","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","change","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","changed","update","setBoxDims","placeBoxes","userPadding","padding","addBox","_layers","z","removeBox","layoutItem","configure","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","total","display","freeze","_createResolver","scopes","prefixes","rootScopes","getTarget","_resolve","Symbol","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","Error","join","createSubResolver","arr","resolver","resolveFallback","getScope","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","EPSILON","getPoint","points","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","t","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","delta","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","loop","controlPoints","spanGaps","cubicInterpolationMode","prev","tension","atEdge","elasticIn","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","intlCache","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","Intl","NumberFormat","formatNumber","num","format","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","bounds","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","last","_computeSegments","segmentOptions","_loop","splitByStyles","_fullLoop","doSplitByStyles","baseStyle","readStyle","prevStyle","p0","p0DataIndex","p1DataIndex","_datasetIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","helpers","__proto__","easingEffects","BasePlatform","acquireContext","releaseContext","isAttached","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","passive","addListener","removeListener","fromNativeEvent","createAttachObserver","observer","MutationObserver","entries","entry","addedNodes","added","observe","childList","subtree","createDetachObserver","removedNodes","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","resize","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","platforms","interpolators","boolean","to","c0","valid","number","Animation","cfg","currentValue","_fn","_easing","easing","_start","_target","_prop","_from","_to","_promises","active","elapsed","remain","wait","promises","Promise","rej","resolved","numbers","colors","animationOptions","properties","show","animations","visible","hide","Animations","config","_chart","_properties","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","xScale","yScale","toClip","disabled","getSortedDatasetIndices","filterVisible","_getSortedDatasetMetas","applyStack","dsIndex","singleMode","otherValue","convertObjectDataToArray","adata","isStacked","stacked","getStackKey","indexScale","valueScale","getUserBounds","minDefined","maxDefined","NEGATIVE_INFINITY","getOrCreateStack","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","parsed","_stacks","iAxis","vAxis","_top","_bottom","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","_parsed","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_drawStart","_drawCount","enableOptionSharing","$context","_syncList","initialize","linkScales","_stacked","addElements","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","datasetElementType","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","parse","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","canStack","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","_clip","hidden","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","dataElementType","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","updateElement","updateSharedOptions","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","_onDataUnshift","Element","tooltipPosition","getProps","hasValue","final","defaultRoutes","formatters","numeric","tickValue","ticks","notation","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","Ticks","autoSkip","tickOpts","ticksLimit","maxTicksLimit","determineMaxTicks","majorIndices","major","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","spacing","calculateSpacing","avgMajorSpacing","offset","tickLength","_tickSize","maxScale","_length","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","diff","beginAtZero","grid","drawBorder","drawOnChartArea","drawTicks","tickWidth","tickColor","title","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkipPadding","labelOffset","minor","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","reverseAlign","offsetFromEdge","edge","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","_startPixel","_endPixel","lineValue","getPixelForTick","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","getPixelForValue","Scale","super","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_cache","_dataLimitsCached","init","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","beforeFit","fit","afterFit","afterUpdate","startPixel","endPixel","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","minSize","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","getValueForPixel","getPixelForDecimal","decimal","getDecimalForPixel","getBasePixel","getBaseValue","optionTicks","rot","_computeGridLineItems","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","lineColor","tickBorderDash","tickBorderDashOffset","_computeLabelItems","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","backdrop","labelPadding","_computeLabelArea","drawBackground","fillRect","getLineWidthForValue","findIndex","drawGrid","drawLine","setLineDash","lineDashOffset","lastLineWidth","drawLabels","drawTitle","tz","gz","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","routeDefaults","routes","propertyParts","sourceName","sourceScope","parts","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getElement","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","registry","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","axisFromPosition","determineAxis","scaleOptions","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","firstIDs","scaleConf","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","resolverCache","version","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","Chart","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","error","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","render","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","_dataset","buildOrUpdateControllers","newControllers","order","isDatasetVisible","ControllerClass","_resetElements","animsDisabled","existingEvents","newEvents","unbindEvents","_updateLayout","_updateDatasets","_eventHandler","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","getElementsAtEventForMode","getVisibleDatasetCount","setDatasetVisibility","toggleDataVisibility","getDataVisibility","_updateVisibility","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","_updateHoverStyles","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","lastEvent","invalidatePlugins","abstract","DateAdapter","formats","timestamp","amount","unit","startOf","weekday","endOf","members","_adapters","_date","getAllScaleValues","$bar","computeMinSampleSize","curr","updateMinAndPrev","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","borderProps","setBorderSkipped","borderSkipped","enableBorderRadius","parseEdge","startEnd","swap","orig","v2","BarController","iAxisKey","vAxisKey","bars","_getRuler","firstOpts","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","_getStacks","grouped","_getStackCount","_getStackIndex","baseValue","minBarLength","floating","halfGrid","skipNull","maxBarThickness","Infinity","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","tooltip","DoughnutController","innerRadius","outerRadius","_getRotation","_getCircumference","_getRotationExtents","arcs","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","legendItem","tooltipItem","dataLabel","formattedValue","LineController","animationsDisabled","getStartAndCountOfVisiblePoints","scaleRangesChanged","_decimated","animated","maxGapLength","directUpdate","prevParsed","nullData","border","lastPoint","updateControlPoints","pointCount","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","PolarAreaController","_updateRadius","cutoutPercentage","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","o","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","pCenter","p4","p8","drawArc","fullCircles","drawFullCircleBorders","inner","lineJoin","ArcElement","chartX","chartY","rAdjust","halfAngle","halfRadius","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","interpolate","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","inflateAmount","lttbDecimation","samples","decimated","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","minMaxDecimation","minIndex","maxIndex","startIndex","xMin","dx","lastIndex","intermediateIndex1","intermediateIndex2","cleanDecimatedDataset","cleanDecimatedData","getStartAndCountOfVisiblePointsSimplified","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","threshold","getLineByIndex","parseFillOption","fillOption","decodeFill","computeLinearBoundary","simpleArc","computeCircularBoundary","computeBoundary","findSegmentEnd","pointsFromSegments","boundary","linePoints","buildStackLine","sourcePoints","linesBelow","getLinesBelow","createBoundaryLine","addPointsBelow","isLineAndNotInHideAnimation","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","resolveTarget","propagate","visited","clipY","getBounds","_getEdge","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","clipBounds","interpolatedLineTo","interpolatedPoint","_fill","src","notShape","lineLoop","targetLoop","doFill","above","drawfill","lineOpts","plugin_filler","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","heightLimit","totalWidth","currentColWidth","currentColHeight","col","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","fontColor","halfFontSize","cursor","drawLegendBox","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","plugin_legend","_element","afterEvent","ci","Title","_padding","textSize","_drawArgs","fontOpts","createTitle","titleBlock","plugin_title","WeakMap","plugin_subtitle","positioners","average","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","getTooltipSize","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","radiusAndPadding","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","beforeTitle","afterTitle","getBeforeBody","getBody","bodyItems","scoped","beforeLabel","afterLabel","getAfterBody","getFooter","beforeFooter","afterFooter","_createItems","itemSort","labelColor","labelPointStyle","labelTextColor","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","bodyColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","plugin_tooltip","afterInit","afterDraw","labelCount","Decimation","Filler","SubTitle","addIfString","findOrAddLabel","lastIndexOf","CategoryScale","_startValue","_valueRange","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","getTickLimit","stepSize","computeTickLimit","LinearScale","isMajor","tickVal","generateTicks","endExp","endSignificand","exp","significand","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","furthestLimits","furthestAngles","valueCount","getPointLabelContext","getPointPosition","drawingArea","plFont","_pointLabels","hLimits","vLimits","_setReductions","_pointLabelItems","buildPointLabelItems","tickBackdropHeight","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","numberOrZero","param","createPointLabelContext","RadialLinearScale","setCenterPoint","largestPossibleRadius","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","adapters","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}