/*!
* Chart.js v3.7.1
* https://www.chartjs.org
* (c) 2022 Chart.js Contributors
* Released under the MIT License
*/
!(function (t, e) {
"object" == typeof exports && "undefined" != typeof module
? (module.exports = e())
: "function" == typeof define && define.amd
? define(e)
: ((t = "undefined" != typeof globalThis ? globalThis : t || self).Chart =
e());
})(this, function () {
"use strict";
const t =
"undefined" == typeof window
? function (t) {
return t();
}
: window.requestAnimationFrame;
function e(e, i, s) {
const n = s || ((t) => Array.prototype.slice.call(t));
let o = !1,
a = [];
return function (...s) {
(a = n(s)),
o ||
((o = !0),
t.call(window, () => {
(o = !1), e.apply(i, a);
}));
};
}
function i(t, e) {
let i;
return function (...s) {
return (
e ? (clearTimeout(i), (i = setTimeout(t, e, s))) : t.apply(this, s), e
);
};
}
const s = (t) => ("start" === t ? "left" : "end" === t ? "right" : "center"),
n = (t, e, i) => ("start" === t ? e : "end" === t ? i : (e + i) / 2),
o = (t, e, i, s) =>
t === (s ? "left" : "right") ? i : "center" === t ? (e + i) / 2 : e;
var a = new (class {
constructor() {
(this._request = null),
(this._charts = new Map()),
(this._running = !1),
(this._lastDate = void 0);
}
_notify(t, e, i, s) {
const n = e.listeners[s],
o = e.duration;
n.forEach((s) =>
s({
chart: t,
initial: e.initial,
numSteps: o,
currentStep: Math.min(i - e.start, o),
})
);
}
_refresh() {
this._request ||
((this._running = !0),
(this._request = t.call(window, () => {
this._update(),
(this._request = null),
this._running && this._refresh();
})));
}
_update(t = Date.now()) {
let e = 0;
this._charts.forEach((i, s) => {
if (!i.running || !i.items.length) return;
const n = i.items;
let o,
a = n.length - 1,
r = !1;
for (; a >= 0; --a)
(o = n[a]),
o._active
? (o._total > i.duration && (i.duration = o._total),
o.tick(t),
(r = !0))
: ((n[a] = n[n.length - 1]), n.pop());
r && (s.draw(), this._notify(s, i, t, "progress")),
n.length ||
((i.running = !1),
this._notify(s, i, t, "complete"),
(i.initial = !1)),
(e += n.length);
}),
(this._lastDate = t),
0 === e && (this._running = !1);
}
_getAnims(t) {
const e = this._charts;
let i = e.get(t);
return (
i ||
((i = {
running: !1,
initial: !0,
items: [],
listeners: { complete: [], progress: [] },
}),
e.set(t, i)),
i
);
}
listen(t, e, i) {
this._getAnims(t).listeners[e].push(i);
}
add(t, e) {
e && e.length && this._getAnims(t).items.push(...e);
}
has(t) {
return this._getAnims(t).items.length > 0;
}
start(t) {
const e = this._charts.get(t);
e &&
((e.running = !0),
(e.start = Date.now()),
(e.duration = e.items.reduce((t, e) => Math.max(t, e._duration), 0)),
this._refresh());
}
running(t) {
if (!this._running) return !1;
const e = this._charts.get(t);
return !!(e && e.running && e.items.length);
}
stop(t) {
const e = this._charts.get(t);
if (!e || !e.items.length) return;
const i = e.items;
let s = i.length - 1;
for (; s >= 0; --s) i[s].cancel();
(e.items = []), this._notify(t, e, Date.now(), "complete");
}
remove(t) {
return this._charts.delete(t);
}
})();
/*!
* @kurkle/color v0.1.9
* https://github.com/kurkle/color#readme
* (c) 2020 Jukka Kurkela
* Released under the MIT License
*/ const r = {
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,
},
l = "0123456789ABCDEF",
h = (t) => l[15 & t],
c = (t) => l[(240 & t) >> 4] + l[15 & t],
d = (t) => (240 & t) >> 4 == (15 & t);
function u(t) {
var e = (function (t) {
return d(t.r) && d(t.g) && d(t.b) && d(t.a);
})(t)
? h
: c;
return t ? "#" + e(t.r) + e(t.g) + e(t.b) + (t.a < 255 ? e(t.a) : "") : t;
}
function f(t) {
return (t + 0.5) | 0;
}
const g = (t, e, i) => Math.max(Math.min(t, i), e);
function p(t) {
return g(f(2.55 * t), 0, 255);
}
function m(t) {
return g(f(255 * t), 0, 255);
}
function x(t) {
return g(f(t / 2.55) / 100, 0, 1);
}
function b(t) {
return g(f(100 * t), 0, 100);
}
const _ =
/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;
const y =
/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;
function v(t, e, i) {
const s = e * Math.min(i, 1 - i),
n = (e, n = (e + t / 30) % 12) =>
i - s * Math.max(Math.min(n - 3, 9 - n, 1), -1);
return [n(0), n(8), n(4)];
}
function w(t, e, i) {
const s = (s, n = (s + t / 60) % 6) =>
i - i * e * Math.max(Math.min(n, 4 - n, 1), 0);
return [s(5), s(3), s(1)];
}
function M(t, e, i) {
const s = v(t, 1, 0.5);
let n;
for (
e + i > 1 && ((n = 1 / (e + i)), (e *= n), (i *= n)), n = 0;
n < 3;
n++
)
(s[n] *= 1 - e - i), (s[n] += e);
return s;
}
function k(t) {
const e = t.r / 255,
i = t.g / 255,
s = t.b / 255,
n = Math.max(e, i, s),
o = Math.min(e, i, s),
a = (n + o) / 2;
let r, l, h;
return (
n !== o &&
((h = n - o),
(l = a > 0.5 ? h / (2 - n - o) : h / (n + o)),
(r =
n === e
? (i - s) / h + (i < s ? 6 : 0)
: n === i
? (s - e) / h + 2
: (e - i) / h + 4),
(r = 60 * r + 0.5)),
[0 | r, l || 0, a]
);
}
function S(t, e, i, s) {
return (Array.isArray(e) ? t(e[0], e[1], e[2]) : t(e, i, s)).map(m);
}
function P(t, e, i) {
return S(v, t, e, i);
}
function D(t) {
return ((t % 360) + 360) % 360;
}
function C(t) {
const e = y.exec(t);
let i,
s = 255;
if (!e) return;
e[5] !== i && (s = e[6] ? p(+e[5]) : m(+e[5]));
const n = D(+e[2]),
o = +e[3] / 100,
a = +e[4] / 100;
return (
(i =
"hwb" === e[1]
? (function (t, e, i) {
return S(M, t, e, i);
})(n, o, a)
: "hsv" === e[1]
? (function (t, e, i) {
return S(w, t, e, i);
})(n, o, a)
: P(n, o, a)),
{ r: i[0], g: i[1], b: i[2], a: s }
);
}
const O = {
x: "dark",
Z: "light",
Y: "re",
X: "blu",
W: "gr",
V: "medium",
U: "slate",
A: "ee",
T: "ol",
S: "or",
B: "ra",
C: "lateg",
D: "ights",
R: "in",
Q: "turquois",
E: "hi",
P: "ro",
O: "al",
N: "le",
M: "de",
L: "yello",
F: "en",
K: "ch",
G: "arks",
H: "ea",
I: "ightg",
J: "wh",
},
A = {
OiceXe: "f0f8ff",
antiquewEte: "faebd7",
aqua: "ffff",
aquamarRe: "7fffd4",
azuY: "f0ffff",
beige: "f5f5dc",
bisque: "ffe4c4",
black: "0",
blanKedOmond: "ffebcd",
Xe: "ff",
XeviTet: "8a2be2",
bPwn: "a52a2a",
burlywood: "deb887",
caMtXe: "5f9ea0",
KartYuse: "7fff00",
KocTate: "d2691e",
cSO: "ff7f50",
cSnflowerXe: "6495ed",
cSnsilk: "fff8dc",
crimson: "dc143c",
cyan: "ffff",
xXe: "8b",
xcyan: "8b8b",
xgTMnPd: "b8860b",
xWay: "a9a9a9",
xgYF: "6400",
xgYy: "a9a9a9",
xkhaki: "bdb76b",
xmagFta: "8b008b",
xTivegYF: "556b2f",
xSange: "ff8c00",
xScEd: "9932cc",
xYd: "8b0000",
xsOmon: "e9967a",
xsHgYF: "8fbc8f",
xUXe: "483d8b",
xUWay: "2f4f4f",
xUgYy: "2f4f4f",
xQe: "ced1",
xviTet: "9400d3",
dAppRk: "ff1493",
dApskyXe: "bfff",
dimWay: "696969",
dimgYy: "696969",
dodgerXe: "1e90ff",
fiYbrick: "b22222",
flSOwEte: "fffaf0",
foYstWAn: "228b22",
fuKsia: "ff00ff",
gaRsbSo: "dcdcdc",
ghostwEte: "f8f8ff",
gTd: "ffd700",
gTMnPd: "daa520",
Way: "808080",
gYF: "8000",
gYFLw: "adff2f",
gYy: "808080",
honeyMw: "f0fff0",
hotpRk: "ff69b4",
RdianYd: "cd5c5c",
Rdigo: "4b0082",
ivSy: "fffff0",
khaki: "f0e68c",
lavFMr: "e6e6fa",
lavFMrXsh: "fff0f5",
lawngYF: "7cfc00",
NmoncEffon: "fffacd",
ZXe: "add8e6",
ZcSO: "f08080",
Zcyan: "e0ffff",
ZgTMnPdLw: "fafad2",
ZWay: "d3d3d3",
ZgYF: "90ee90",
ZgYy: "d3d3d3",
ZpRk: "ffb6c1",
ZsOmon: "ffa07a",
ZsHgYF: "20b2aa",
ZskyXe: "87cefa",
ZUWay: "778899",
ZUgYy: "778899",
ZstAlXe: "b0c4de",
ZLw: "ffffe0",
lime: "ff00",
limegYF: "32cd32",
lRF: "faf0e6",
magFta: "ff00ff",
maPon: "800000",
VaquamarRe: "66cdaa",
VXe: "cd",
VScEd: "ba55d3",
VpurpN: "9370db",
VsHgYF: "3cb371",
VUXe: "7b68ee",
VsprRggYF: "fa9a",
VQe: "48d1cc",
VviTetYd: "c71585",
midnightXe: "191970",
mRtcYam: "f5fffa",
mistyPse: "ffe4e1",
moccasR: "ffe4b5",
navajowEte: "ffdead",
navy: "80",
Tdlace: "fdf5e6",
Tive: "808000",
TivedBb: "6b8e23",
Sange: "ffa500",
SangeYd: "ff4500",
ScEd: "da70d6",
pOegTMnPd: "eee8aa",
pOegYF: "98fb98",
pOeQe: "afeeee",
pOeviTetYd: "db7093",
papayawEp: "ffefd5",
pHKpuff: "ffdab9",
peru: "cd853f",
pRk: "ffc0cb",
plum: "dda0dd",
powMrXe: "b0e0e6",
purpN: "800080",
YbeccapurpN: "663399",
Yd: "ff0000",
Psybrown: "bc8f8f",
PyOXe: "4169e1",
saddNbPwn: "8b4513",
sOmon: "fa8072",
sandybPwn: "f4a460",
sHgYF: "2e8b57",
sHshell: "fff5ee",
siFna: "a0522d",
silver: "c0c0c0",
skyXe: "87ceeb",
UXe: "6a5acd",
UWay: "708090",
UgYy: "708090",
snow: "fffafa",
sprRggYF: "ff7f",
stAlXe: "4682b4",
tan: "d2b48c",
teO: "8080",
tEstN: "d8bfd8",
tomato: "ff6347",
Qe: "40e0d0",
viTet: "ee82ee",
JHt: "f5deb3",
wEte: "ffffff",
wEtesmoke: "f5f5f5",
Lw: "ffff00",
LwgYF: "9acd32",
};
let T;
function L(t) {
T ||
((T = (function () {
const t = {},
e = Object.keys(A),
i = Object.keys(O);
let s, n, o, a, r;
for (s = 0; s < e.length; s++) {
for (a = r = e[s], n = 0; n < i.length; n++)
(o = i[n]), (r = r.replace(o, O[o]));
(o = parseInt(A[a], 16)),
(t[r] = [(o >> 16) & 255, (o >> 8) & 255, 255 & o]);
}
return t;
})()),
(T.transparent = [0, 0, 0, 0]));
const e = T[t.toLowerCase()];
return e && { r: e[0], g: e[1], b: e[2], a: 4 === e.length ? e[3] : 255 };
}
function R(t, e, i) {
if (t) {
let s = k(t);
(s[e] = Math.max(0, Math.min(s[e] + s[e] * i, 0 === e ? 360 : 1))),
(s = P(s)),
(t.r = s[0]),
(t.g = s[1]),
(t.b = s[2]);
}
}
function E(t, e) {
return t ? Object.assign(e || {}, t) : t;
}
function I(t) {
var e = { r: 0, g: 0, b: 0, a: 255 };
return (
Array.isArray(t)
? t.length >= 3 &&
((e = { r: t[0], g: t[1], b: t[2], a: 255 }),
t.length > 3 && (e.a = m(t[3])))
: ((e = E(t, { r: 0, g: 0, b: 0, a: 1 })).a = m(e.a)),
e
);
}
function z(t) {
return "r" === t.charAt(0)
? (function (t) {
const e = _.exec(t);
let i,
s,
n,
o = 255;
if (e) {
if (e[7] !== i) {
const t = +e[7];
o = 255 & (e[8] ? p(t) : 255 * t);
}
return (
(i = +e[1]),
(s = +e[3]),
(n = +e[5]),
(i = 255 & (e[2] ? p(i) : i)),
(s = 255 & (e[4] ? p(s) : s)),
(n = 255 & (e[6] ? p(n) : n)),
{ r: i, g: s, b: n, a: o }
);
}
})(t)
: C(t);
}
class F {
constructor(t) {
if (t instanceof F) return t;
const e = typeof t;
let i;
var s, n, o;
"object" === e
? (i = I(t))
: "string" === e &&
((o = (s = t).length),
"#" === s[0] &&
(4 === o || 5 === o
? (n = {
r: 255 & (17 * r[s[1]]),
g: 255 & (17 * r[s[2]]),
b: 255 & (17 * r[s[3]]),
a: 5 === o ? 17 * r[s[4]] : 255,
})
: (7 !== o && 9 !== o) ||
(n = {
r: (r[s[1]] << 4) | r[s[2]],
g: (r[s[3]] << 4) | r[s[4]],
b: (r[s[5]] << 4) | r[s[6]],
a: 9 === o ? (r[s[7]] << 4) | r[s[8]] : 255,
})),
(i = n || L(t) || z(t))),
(this._rgb = i),
(this._valid = !!i);
}
get valid() {
return this._valid;
}
get rgb() {
var t = E(this._rgb);
return t && (t.a = x(t.a)), t;
}
set rgb(t) {
this._rgb = I(t);
}
rgbString() {
return this._valid
? (t = this._rgb) &&
(t.a < 255
? `rgba(${t.r}, ${t.g}, ${t.b}, ${x(t.a)})`
: `rgb(${t.r}, ${t.g}, ${t.b})`)
: this._rgb;
var t;
}
hexString() {
return this._valid ? u(this._rgb) : this._rgb;
}
hslString() {
return this._valid
? (function (t) {
if (!t) return;
const e = k(t),
i = e[0],
s = b(e[1]),
n = b(e[2]);
return t.a < 255
? `hsla(${i}, ${s}%, ${n}%, ${x(t.a)})`
: `hsl(${i}, ${s}%, ${n}%)`;
})(this._rgb)
: this._rgb;
}
mix(t, e) {
const i = this;
if (t) {
const s = i.rgb,
n = t.rgb;
let o;
const a = e === o ? 0.5 : e,
r = 2 * a - 1,
l = s.a - n.a,
h = ((r * l == -1 ? r : (r + l) / (1 + r * l)) + 1) / 2;
(o = 1 - h),
(s.r = 255 & (h * s.r + o * n.r + 0.5)),
(s.g = 255 & (h * s.g + o * n.g + 0.5)),
(s.b = 255 & (h * s.b + o * n.b + 0.5)),
(s.a = a * s.a + (1 - a) * n.a),
(i.rgb = s);
}
return i;
}
clone() {
return new F(this.rgb);
}
alpha(t) {
return (this._rgb.a = m(t)), this;
}
clearer(t) {
return (this._rgb.a *= 1 - t), this;
}
greyscale() {
const t = this._rgb,
e = f(0.3 * t.r + 0.59 * t.g + 0.11 * t.b);
return (t.r = t.g = t.b = e), this;
}
opaquer(t) {
return (this._rgb.a *= 1 + t), this;
}
negate() {
const t = this._rgb;
return (t.r = 255 - t.r), (t.g = 255 - t.g), (t.b = 255 - t.b), this;
}
lighten(t) {
return R(this._rgb, 2, t), this;
}
darken(t) {
return R(this._rgb, 2, -t), this;
}
saturate(t) {
return R(this._rgb, 1, t), this;
}
desaturate(t) {
return R(this._rgb, 1, -t), this;
}
rotate(t) {
return (
(function (t, e) {
var i = k(t);
(i[0] = D(i[0] + e)),
(i = P(i)),
(t.r = i[0]),
(t.g = i[1]),
(t.b = i[2]);
})(this._rgb, t),
this
);
}
}
function B(t) {
return new F(t);
}
const V = (t) => t instanceof CanvasGradient || t instanceof CanvasPattern;
function W(t) {
return V(t) ? t : B(t);
}
function N(t) {
return V(t) ? t : B(t).saturate(0.5).darken(0.1).hexString();
}
function H() {}
const j = (function () {
let t = 0;
return function () {
return t++;
};
})();
function $(t) {
return null == t;
}
function Y(t) {
if (Array.isArray && Array.isArray(t)) return !0;
const e = Object.prototype.toString.call(t);
return "[object" === e.substr(0, 7) && "Array]" === e.substr(-6);
}
function U(t) {
return (
null !== t && "[object Object]" === Object.prototype.toString.call(t)
);
}
const X = (t) =>
("number" == typeof t || t instanceof Number) && isFinite(+t);
function q(t, e) {
return X(t) ? t : e;
}
function K(t, e) {
return void 0 === t ? e : t;
}
const G = (t, e) =>
"string" == typeof t && t.endsWith("%") ? parseFloat(t) / 100 : t / e,
Z = (t, e) =>
"string" == typeof t && t.endsWith("%") ? (parseFloat(t) / 100) * e : +t;
function J(t, e, i) {
if (t && "function" == typeof t.call) return t.apply(i, e);
}
function Q(t, e, i, s) {
let n, o, a;
if (Y(t))
if (((o = t.length), s)) for (n = o - 1; n >= 0; n--) e.call(i, t[n], n);
else for (n = 0; n < o; n++) e.call(i, t[n], n);
else if (U(t))
for (a = Object.keys(t), o = a.length, n = 0; n < o; n++)
e.call(i, t[a[n]], a[n]);
}
function tt(t, e) {
let i, s, n, o;
if (!t || !e || t.length !== e.length) return !1;
for (i = 0, s = t.length; i < s; ++i)
if (
((n = t[i]),
(o = e[i]),
n.datasetIndex !== o.datasetIndex || n.index !== o.index)
)
return !1;
return !0;
}
function et(t) {
if (Y(t)) return t.map(et);
if (U(t)) {
const e = Object.create(null),
i = Object.keys(t),
s = i.length;
let n = 0;
for (; n < s; ++n) e[i[n]] = et(t[i[n]]);
return e;
}
return t;
}
function it(t) {
return -1 === ["__proto__", "prototype", "constructor"].indexOf(t);
}
function st(t, e, i, s) {
if (!it(t)) return;
const n = e[t],
o = i[t];
U(n) && U(o) ? nt(n, o, s) : (e[t] = et(o));
}
function nt(t, e, i) {
const s = Y(e) ? e : [e],
n = s.length;
if (!U(t)) return t;
const o = (i = i || {}).merger || st;
for (let a = 0; a < n; ++a) {
if (!U((e = s[a]))) continue;
const n = Object.keys(e);
for (let s = 0, a = n.length; s < a; ++s) o(n[s], t, e, i);
}
return t;
}
function ot(t, e) {
return nt(t, e, { merger: at });
}
function at(t, e, i) {
if (!it(t)) return;
const s = e[t],
n = i[t];
U(s) && U(n)
? ot(s, n)
: Object.prototype.hasOwnProperty.call(e, t) || (e[t] = et(n));
}
function rt(t, e) {
const i = t.indexOf(".", e);
return -1 === i ? t.length : i;
}
function lt(t, e) {
if ("" === e) return t;
let i = 0,
s = rt(e, i);
for (; t && s > i; )
(t = t[e.substr(i, s - i)]), (i = s + 1), (s = rt(e, i));
return t;
}
function ht(t) {
return t.charAt(0).toUpperCase() + t.slice(1);
}
const ct = (t) => void 0 !== t,
dt = (t) => "function" == typeof t,
ut = (t, e) => {
if (t.size !== e.size) return !1;
for (const i of t) if (!e.has(i)) return !1;
return !0;
};
function ft(t) {
return (
"mouseup" === t.type || "click" === t.type || "contextmenu" === t.type
);
}
const gt = Object.create(null),
pt = Object.create(null);
function mt(t, e) {
if (!e) return t;
const i = e.split(".");
for (let e = 0, s = i.length; e < s; ++e) {
const s = i[e];
t = t[s] || (t[s] = Object.create(null));
}
return t;
}
function xt(t, e, i) {
return "string" == typeof e ? nt(mt(t, e), i) : nt(mt(t, ""), e);
}
var bt = new (class {
constructor(t) {
(this.animation = void 0),
(this.backgroundColor = "rgba(0,0,0,0.1)"),
(this.borderColor = "rgba(0,0,0,0.1)"),
(this.color = "#666"),
(this.datasets = {}),
(this.devicePixelRatio = (t) => t.chart.platform.getDevicePixelRatio()),
(this.elements = {}),
(this.events = [
"mousemove",
"mouseout",
"click",
"touchstart",
"touchmove",
]),
(this.font = {
family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
size: 12,
style: "normal",
lineHeight: 1.2,
weight: null,
}),
(this.hover = {}),
(this.hoverBackgroundColor = (t, e) => N(e.backgroundColor)),
(this.hoverBorderColor = (t, e) => N(e.borderColor)),
(this.hoverColor = (t, e) => N(e.color)),
(this.indexAxis = "x"),
(this.interaction = { mode: "nearest", intersect: !0 }),
(this.maintainAspectRatio = !0),
(this.onHover = null),
(this.onClick = null),
(this.parsing = !0),
(this.plugins = {}),
(this.responsive = !0),
(this.scale = void 0),
(this.scales = {}),
(this.showLine = !0),
(this.drawActiveElementsOnTop = !0),
this.describe(t);
}
set(t, e) {
return xt(this, t, e);
}
get(t) {
return mt(this, t);
}
describe(t, e) {
return xt(pt, t, e);
}
override(t, e) {
return xt(gt, t, e);
}
route(t, e, i, s) {
const n = mt(this, t),
o = mt(this, i),
a = "_" + e;
Object.defineProperties(n, {
[a]: { value: n[e], writable: !0 },
[e]: {
enumerable: !0,
get() {
const t = this[a],
e = o[s];
return U(t) ? Object.assign({}, e, t) : K(t, e);
},
set(t) {
this[a] = t;
},
},
});
}
})({
_scriptable: (t) => !t.startsWith("on"),
_indexable: (t) => "events" !== t,
hover: { _fallback: "interaction" },
interaction: { _scriptable: !1, _indexable: !1 },
});
const _t = Math.PI,
yt = 2 * _t,
vt = yt + _t,
wt = Number.POSITIVE_INFINITY,
Mt = _t / 180,
kt = _t / 2,
St = _t / 4,
Pt = (2 * _t) / 3,
Dt = Math.log10,
Ct = Math.sign;
function Ot(t) {
const e = Math.round(t);
t = Lt(t, e, t / 1e3) ? e : t;
const i = Math.pow(10, Math.floor(Dt(t))),
s = t / i;
return (s <= 1 ? 1 : s <= 2 ? 2 : s <= 5 ? 5 : 10) * i;
}
function At(t) {
const e = [],
i = Math.sqrt(t);
let s;
for (s = 1; s < i; s++) t % s == 0 && (e.push(s), e.push(t / s));
return i === (0 | i) && e.push(i), e.sort((t, e) => t - e).pop(), e;
}
function Tt(t) {
return !isNaN(parseFloat(t)) && isFinite(t);
}
function Lt(t, e, i) {
return Math.abs(t - e) < i;
}
function Rt(t, e) {
const i = Math.round(t);
return i - e <= t && i + e >= t;
}
function Et(t, e, i) {
let s, n, o;
for (s = 0, n = t.length; s < n; s++)
(o = t[s][i]),
isNaN(o) ||
((e.min = Math.min(e.min, o)), (e.max = Math.max(e.max, o)));
}
function It(t) {
return t * (_t / 180);
}
function zt(t) {
return t * (180 / _t);
}
function Ft(t) {
if (!X(t)) return;
let e = 1,
i = 0;
for (; Math.round(t * e) / e !== t; ) (e *= 10), i++;
return i;
}
function Bt(t, e) {
const i = e.x - t.x,
s = e.y - t.y,
n = Math.sqrt(i * i + s * s);
let o = Math.atan2(s, i);
return o < -0.5 * _t && (o += yt), { angle: o, distance: n };
}
function Vt(t, e) {
return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2));
}
function Wt(t, e) {
return ((t - e + vt) % yt) - _t;
}
function Nt(t) {
return ((t % yt) + yt) % yt;
}
function Ht(t, e, i, s) {
const n = Nt(t),
o = Nt(e),
a = Nt(i),
r = Nt(o - n),
l = Nt(a - n),
h = Nt(n - o),
c = Nt(n - a);
return n === o || n === a || (s && o === a) || (r > l && h < c);
}
function jt(t, e, i) {
return Math.max(e, Math.min(i, t));
}
function $t(t) {
return jt(t, -32768, 32767);
}
function Yt(t, e, i, s = 1e-6) {
return t >= Math.min(e, i) - s && t <= Math.max(e, i) + s;
}
function Ut(t) {
return !t || $(t.size) || $(t.family)
? null
: (t.style ? t.style + " " : "") +
(t.weight ? t.weight + " " : "") +
t.size +
"px " +
t.family;
}
function Xt(t, e, i, s, n) {
let o = e[n];
return (
o || ((o = e[n] = t.measureText(n).width), i.push(n)), o > s && (s = o), s
);
}
function qt(t, e, i, s) {
let n = ((s = s || {}).data = s.data || {}),
o = (s.garbageCollect = s.garbageCollect || []);
s.font !== e &&
((n = s.data = {}), (o = s.garbageCollect = []), (s.font = e)),
t.save(),
(t.font = e);
let a = 0;
const r = i.length;
let l, h, c, d, u;
for (l = 0; l < r; l++)
if (((d = i[l]), null != d && !0 !== Y(d))) a = Xt(t, n, o, a, d);
else if (Y(d))
for (h = 0, c = d.length; h < c; h++)
(u = d[h]), null == u || Y(u) || (a = Xt(t, n, o, a, u));
t.restore();
const f = o.length / 2;
if (f > i.length) {
for (l = 0; l < f; l++) delete n[o[l]];
o.splice(0, f);
}
return a;
}
function Kt(t, e, i) {
const s = t.currentDevicePixelRatio,
n = 0 !== i ? Math.max(i / 2, 0.5) : 0;
return Math.round((e - n) * s) / s + n;
}
function Gt(t, e) {
(e = e || t.getContext("2d")).save(),
e.resetTransform(),
e.clearRect(0, 0, t.width, t.height),
e.restore();
}
function Zt(t, e, i, s) {
let n, o, a, r, l;
const h = e.pointStyle,
c = e.rotation,
d = e.radius;
let u = (c || 0) * Mt;
if (
h &&
"object" == typeof h &&
((n = h.toString()),
"[object HTMLImageElement]" === n || "[object HTMLCanvasElement]" === n)
)
return (
t.save(),
t.translate(i, s),
t.rotate(u),
t.drawImage(h, -h.width / 2, -h.height / 2, h.width, h.height),
void t.restore()
);
if (!(isNaN(d) || d <= 0)) {
switch ((t.beginPath(), h)) {
default:
t.arc(i, s, d, 0, yt), t.closePath();
break;
case "triangle":
t.moveTo(i + Math.sin(u) * d, s - Math.cos(u) * d),
(u += Pt),
t.lineTo(i + Math.sin(u) * d, s - Math.cos(u) * d),
(u += Pt),
t.lineTo(i + Math.sin(u) * d, s - Math.cos(u) * d),
t.closePath();
break;
case "rectRounded":
(l = 0.516 * d),
(r = d - l),
(o = Math.cos(u + St) * r),
(a = Math.sin(u + St) * r),
t.arc(i - o, s - a, l, u - _t, u - kt),
t.arc(i + a, s - o, l, u - kt, u),
t.arc(i + o, s + a, l, u, u + kt),
t.arc(i - a, s + o, l, u + kt, u + _t),
t.closePath();
break;
case "rect":
if (!c) {
(r = Math.SQRT1_2 * d), t.rect(i - r, s - r, 2 * r, 2 * r);
break;
}
u += St;
case "rectRot":
(o = Math.cos(u) * d),
(a = Math.sin(u) * d),
t.moveTo(i - o, s - a),
t.lineTo(i + a, s - o),
t.lineTo(i + o, s + a),
t.lineTo(i - a, s + o),
t.closePath();
break;
case "crossRot":
u += St;
case "cross":
(o = Math.cos(u) * d),
(a = Math.sin(u) * d),
t.moveTo(i - o, s - a),
t.lineTo(i + o, s + a),
t.moveTo(i + a, s - o),
t.lineTo(i - a, s + o);
break;
case "star":
(o = Math.cos(u) * d),
(a = Math.sin(u) * d),
t.moveTo(i - o, s - a),
t.lineTo(i + o, s + a),
t.moveTo(i + a, s - o),
t.lineTo(i - a, s + o),
(u += St),
(o = Math.cos(u) * d),
(a = Math.sin(u) * d),
t.moveTo(i - o, s - a),
t.lineTo(i + o, s + a),
t.moveTo(i + a, s - o),
t.lineTo(i - a, s + o);
break;
case "line":
(o = Math.cos(u) * d),
(a = Math.sin(u) * d),
t.moveTo(i - o, s - a),
t.lineTo(i + o, s + a);
break;
case "dash":
t.moveTo(i, s), t.lineTo(i + Math.cos(u) * d, s + Math.sin(u) * d);
}
t.fill(), e.borderWidth > 0 && t.stroke();
}
}
function Jt(t, e, i) {
return (
(i = i || 0.5),
!e ||
(t &&
t.x > e.left - i &&
t.x < e.right + i &&
t.y > e.top - i &&
t.y < e.bottom + i)
);
}
function Qt(t, e) {
t.save(),
t.beginPath(),
t.rect(e.left, e.top, e.right - e.left, e.bottom - e.top),
t.clip();
}
function te(t) {
t.restore();
}
function ee(t, e, i, s, n) {
if (!e) return t.lineTo(i.x, i.y);
if ("middle" === n) {
const s = (e.x + i.x) / 2;
t.lineTo(s, e.y), t.lineTo(s, i.y);
} else ("after" === n) != !!s ? t.lineTo(e.x, i.y) : t.lineTo(i.x, e.y);
t.lineTo(i.x, i.y);
}
function ie(t, e, i, s) {
if (!e) return t.lineTo(i.x, i.y);
t.bezierCurveTo(
s ? e.cp1x : e.cp2x,
s ? e.cp1y : e.cp2y,
s ? i.cp2x : i.cp1x,
s ? i.cp2y : i.cp1y,
i.x,
i.y
);
}
function se(t, e, i, s, n, o = {}) {
const a = Y(e) ? e : [e],
r = o.strokeWidth > 0 && "" !== o.strokeColor;
let l, h;
for (
t.save(),
t.font = n.string,
(function (t, e) {
e.translation && t.translate(e.translation[0], e.translation[1]);
$(e.rotation) || t.rotate(e.rotation);
e.color && (t.fillStyle = e.color);
e.textAlign && (t.textAlign = e.textAlign);
e.textBaseline && (t.textBaseline = e.textBaseline);
})(t, o),
l = 0;
l < a.length;
++l
)
(h = a[l]),
r &&
(o.strokeColor && (t.strokeStyle = o.strokeColor),
$(o.strokeWidth) || (t.lineWidth = o.strokeWidth),
t.strokeText(h, i, s, o.maxWidth)),
t.fillText(h, i, s, o.maxWidth),
ne(t, i, s, h, o),
(s += n.lineHeight);
t.restore();
}
function ne(t, e, i, s, n) {
if (n.strikethrough || n.underline) {
const o = t.measureText(s),
a = e - o.actualBoundingBoxLeft,
r = e + o.actualBoundingBoxRight,
l = i - o.actualBoundingBoxAscent,
h = i + o.actualBoundingBoxDescent,
c = n.strikethrough ? (l + h) / 2 : h;
(t.strokeStyle = t.fillStyle),
t.beginPath(),
(t.lineWidth = n.decorationWidth || 2),
t.moveTo(a, c),
t.lineTo(r, c),
t.stroke();
}
}
function oe(t, e) {
const { x: i, y: s, w: n, h: o, radius: a } = e;
t.arc(i + a.topLeft, s + a.topLeft, a.topLeft, -kt, _t, !0),
t.lineTo(i, s + o - a.bottomLeft),
t.arc(i + a.bottomLeft, s + o - a.bottomLeft, a.bottomLeft, _t, kt, !0),
t.lineTo(i + n - a.bottomRight, s + o),
t.arc(
i + n - a.bottomRight,
s + o - a.bottomRight,
a.bottomRight,
kt,
0,
!0
),
t.lineTo(i + n, s + a.topRight),
t.arc(i + n - a.topRight, s + a.topRight, a.topRight, 0, -kt, !0),
t.lineTo(i + a.topLeft, s);
}
function ae(t, e, i) {
i = i || ((i) => t[i] < e);
let s,
n = t.length - 1,
o = 0;
for (; n - o > 1; ) (s = (o + n) >> 1), i(s) ? (o = s) : (n = s);
return { lo: o, hi: n };
}
const re = (t, e, i) => ae(t, i, (s) => t[s][e] < i),
le = (t, e, i) => ae(t, i, (s) => t[s][e] >= i);
function he(t, e, i) {
let s = 0,
n = t.length;
for (; s < n && t[s] < e; ) s++;
for (; n > s && t[n - 1] > i; ) n--;
return s > 0 || n < t.length ? t.slice(s, n) : t;
}
const ce = ["push", "pop", "shift", "splice", "unshift"];
function de(t, e) {
t._chartjs
? t._chartjs.listeners.push(e)
: (Object.defineProperty(t, "_chartjs", {
configurable: !0,
enumerable: !1,
value: { listeners: [e] },
}),
ce.forEach((e) => {
const i = "_onData" + ht(e),
s = t[e];
Object.defineProperty(t, e, {
configurable: !0,
enumerable: !1,
value(...e) {
const n = s.apply(this, e);
return (
t._chartjs.listeners.forEach((t) => {
"function" == typeof t[i] && t[i](...e);
}),
n
);
},
});
}));
}
function ue(t, e) {
const i = t._chartjs;
if (!i) return;
const s = i.listeners,
n = s.indexOf(e);
-1 !== n && s.splice(n, 1),
s.length > 0 ||
(ce.forEach((e) => {
delete t[e];
}),
delete t._chartjs);
}
function fe(t) {
const e = new Set();
let i, s;
for (i = 0, s = t.length; i < s; ++i) e.add(t[i]);
return e.size === s ? t : Array.from(e);
}
function ge() {
return "undefined" != typeof window && "undefined" != typeof document;
}
function pe(t) {
let e = t.parentNode;
return e && "[object ShadowRoot]" === e.toString() && (e = e.host), e;
}
function me(t, e, i) {
let s;
return (
"string" == typeof t
? ((s = parseInt(t, 10)),
-1 !== t.indexOf("%") && (s = (s / 100) * e.parentNode[i]))
: (s = t),
s
);
}
const xe = (t) => window.getComputedStyle(t, null);
function be(t, e) {
return xe(t).getPropertyValue(e);
}
const _e = ["top", "right", "bottom", "left"];
function ye(t, e, i) {
const s = {};
i = i ? "-" + i : "";
for (let n = 0; n < 4; n++) {
const o = _e[n];
s[o] = parseFloat(t[e + "-" + o + i]) || 0;
}
return (s.width = s.left + s.right), (s.height = s.top + s.bottom), s;
}
function ve(t, e) {
const { canvas: i, currentDevicePixelRatio: s } = e,
n = xe(i),
o = "border-box" === n.boxSizing,
a = ye(n, "padding"),
r = ye(n, "border", "width"),
{
x: l,
y: h,
box: c,
} = (function (t, e) {
const i = t.native || t,
s = i.touches,
n = s && s.length ? s[0] : i,
{ offsetX: o, offsetY: a } = n;
let r,
l,
h = !1;
if (
((t, e, i) => (t > 0 || e > 0) && (!i || !i.shadowRoot))(
o,
a,
i.target
)
)
(r = o), (l = a);
else {
const t = e.getBoundingClientRect();
(r = n.clientX - t.left), (l = n.clientY - t.top), (h = !0);
}
return { x: r, y: l, box: h };
})(t, i),
d = a.left + (c && r.left),
u = a.top + (c && r.top);
let { width: f, height: g } = e;
return (
o && ((f -= a.width + r.width), (g -= a.height + r.height)),
{
x: Math.round((((l - d) / f) * i.width) / s),
y: Math.round((((h - u) / g) * i.height) / s),
}
);
}
const we = (t) => Math.round(10 * t) / 10;
function Me(t, e, i, s) {
const n = xe(t),
o = ye(n, "margin"),
a = me(n.maxWidth, t, "clientWidth") || wt,
r = me(n.maxHeight, t, "clientHeight") || wt,
l = (function (t, e, i) {
let s, n;
if (void 0 === e || void 0 === i) {
const o = pe(t);
if (o) {
const t = o.getBoundingClientRect(),
a = xe(o),
r = ye(a, "border", "width"),
l = ye(a, "padding");
(e = t.width - l.width - r.width),
(i = t.height - l.height - r.height),
(s = me(a.maxWidth, o, "clientWidth")),
(n = me(a.maxHeight, o, "clientHeight"));
} else (e = t.clientWidth), (i = t.clientHeight);
}
return { width: e, height: i, maxWidth: s || wt, maxHeight: n || wt };
})(t, e, i);
let { width: h, height: c } = l;
if ("content-box" === n.boxSizing) {
const t = ye(n, "border", "width"),
e = ye(n, "padding");
(h -= e.width + t.width), (c -= e.height + t.height);
}
return (
(h = Math.max(0, h - o.width)),
(c = Math.max(0, s ? Math.floor(h / s) : c - o.height)),
(h = we(Math.min(h, a, l.maxWidth))),
(c = we(Math.min(c, r, l.maxHeight))),
h && !c && (c = we(h / 2)),
{ width: h, height: c }
);
}
function ke(t, e, i) {
const s = e || 1,
n = Math.floor(t.height * s),
o = Math.floor(t.width * s);
(t.height = n / s), (t.width = o / s);
const a = t.canvas;
return (
a.style &&
(i || (!a.style.height && !a.style.width)) &&
((a.style.height = `${t.height}px`), (a.style.width = `${t.width}px`)),
(t.currentDevicePixelRatio !== s || a.height !== n || a.width !== o) &&
((t.currentDevicePixelRatio = s),
(a.height = n),
(a.width = o),
t.ctx.setTransform(s, 0, 0, s, 0, 0),
!0)
);
}
const Se = (function () {
let t = !1;
try {
const e = {
get passive() {
return (t = !0), !1;
},
};
window.addEventListener("test", null, e),
window.removeEventListener("test", null, e);
} catch (t) {}
return t;
})();
function Pe(t, e) {
const i = be(t, e),
s = i && i.match(/^(\d+)(\.\d+)?px$/);
return s ? +s[1] : void 0;
}
function De(t, e) {
return "native" in t ? { x: t.x, y: t.y } : ve(t, e);
}
function Ce(t, e, i, s) {
const { controller: n, data: o, _sorted: a } = t,
r = n._cachedMeta.iScale;
if (r && e === r.axis && "r" !== e && a && o.length) {
const t = r._reversePixels ? le : re;
if (!s) return t(o, e, i);
if (n._sharedOptions) {
const s = o[0],
n = "function" == typeof s.getRange && s.getRange(e);
if (n) {
const s = t(o, e, i - n),
a = t(o, e, i + n);
return { lo: s.lo, hi: a.hi };
}
}
}
return { lo: 0, hi: o.length - 1 };
}
function Oe(t, e, i, s, n) {
const o = t.getSortedVisibleDatasetMetas(),
a = i[e];
for (let t = 0, i = o.length; t < i; ++t) {
const { index: i, data: r } = o[t],
{ lo: l, hi: h } = Ce(o[t], e, a, n);
for (let t = l; t <= h; ++t) {
const e = r[t];
e.skip || s(e, i, t);
}
}
}
function Ae(t, e, i, s) {
const n = [];
if (!Jt(e, t.chartArea, t._minPadding)) return n;
return (
Oe(
t,
i,
e,
function (t, i, o) {
t.inRange(e.x, e.y, s) &&
n.push({ element: t, datasetIndex: i, index: o });
},
!0
),
n
);
}
function Te(t, e, i, s, n) {
let o = [];
const a = (function (t) {
const e = -1 !== t.indexOf("x"),
i = -1 !== t.indexOf("y");
return function (t, s) {
const n = e ? Math.abs(t.x - s.x) : 0,
o = i ? Math.abs(t.y - s.y) : 0;
return Math.sqrt(Math.pow(n, 2) + Math.pow(o, 2));
};
})(i);
let r = Number.POSITIVE_INFINITY;
return (
Oe(t, i, e, function (i, l, h) {
const c = i.inRange(e.x, e.y, n);
if (s && !c) return;
const d = i.getCenterPoint(n);
if (!Jt(d, t.chartArea, t._minPadding) && !c) return;
const u = a(e, d);
u < r
? ((o = [{ element: i, datasetIndex: l, index: h }]), (r = u))
: u === r && o.push({ element: i, datasetIndex: l, index: h });
}),
o
);
}
function Le(t, e, i, s, n) {
return Jt(e, t.chartArea, t._minPadding)
? "r" !== i || s
? Te(t, e, i, s, n)
: (function (t, e, i, s) {
let n = [];
return (
Oe(t, i, e, function (t, i, o) {
const { startAngle: a, endAngle: r } = t.getProps(
["startAngle", "endAngle"],
s
),
{ angle: l } = Bt(t, { x: e.x, y: e.y });
Ht(l, a, r) &&
n.push({ element: t, datasetIndex: i, index: o });
}),
n
);
})(t, e, i, n)
: [];
}
function Re(t, e, i, s) {
const n = De(e, t),
o = [],
a = i.axis,
r = "x" === a ? "inXRange" : "inYRange";
let l = !1;
return (
(function (t, e) {
const i = t.getSortedVisibleDatasetMetas();
let s, n, o;
for (let t = 0, a = i.length; t < a; ++t) {
({ index: s, data: n } = i[t]);
for (let t = 0, i = n.length; t < i; ++t)
(o = n[t]), o.skip || e(o, s, t);
}
})(t, (t, e, i) => {
t[r](n[a], s) && o.push({ element: t, datasetIndex: e, index: i }),
t.inRange(n.x, n.y, s) && (l = !0);
}),
i.intersect && !l ? [] : o
);
}
var Ee = {
modes: {
index(t, e, i, s) {
const n = De(e, t),
o = i.axis || "x",
a = i.intersect ? Ae(t, n, o, s) : Le(t, n, o, !1, s),
r = [];
return a.length
? (t.getSortedVisibleDatasetMetas().forEach((t) => {
const e = a[0].index,
i = t.data[e];
i &&
!i.skip &&
r.push({ element: i, datasetIndex: t.index, index: e });
}),
r)
: [];
},
dataset(t, e, i, s) {
const n = De(e, t),
o = i.axis || "xy";
let a = i.intersect ? Ae(t, n, o, s) : Le(t, n, o, !1, s);
if (a.length > 0) {
const e = a[0].datasetIndex,
i = t.getDatasetMeta(e).data;
a = [];
for (let t = 0; t < i.length; ++t)
a.push({ element: i[t], datasetIndex: e, index: t });
}
return a;
},
point: (t, e, i, s) => Ae(t, De(e, t), i.axis || "xy", s),
nearest: (t, e, i, s) => Le(t, De(e, t), i.axis || "xy", i.intersect, s),
x: (t, e, i, s) => Re(t, e, { axis: "x", intersect: i.intersect }, s),
y: (t, e, i, s) => Re(t, e, { axis: "y", intersect: i.intersect }, s),
},
};
const Ie = new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),
ze = new RegExp(
/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/
);
function Fe(t, e) {
const i = ("" + t).match(Ie);
if (!i || "normal" === i[1]) return 1.2 * e;
switch (((t = +i[2]), i[3])) {
case "px":
return t;
case "%":
t /= 100;
}
return e * t;
}
function Be(t, e) {
const i = {},
s = U(e),
n = s ? Object.keys(e) : e,
o = U(t) ? (s ? (i) => K(t[i], t[e[i]]) : (e) => t[e]) : () => t;
for (const t of n) i[t] = +o(t) || 0;
return i;
}
function Ve(t) {
return Be(t, { top: "y", right: "x", bottom: "y", left: "x" });
}
function We(t) {
return Be(t, ["topLeft", "topRight", "bottomLeft", "bottomRight"]);
}
function Ne(t) {
const e = Ve(t);
return (e.width = e.left + e.right), (e.height = e.top + e.bottom), e;
}
function He(t, e) {
(t = t || {}), (e = e || bt.font);
let i = K(t.size, e.size);
"string" == typeof i && (i = parseInt(i, 10));
let s = K(t.style, e.style);
s &&
!("" + s).match(ze) &&
(console.warn('Invalid font style specified: "' + s + '"'), (s = ""));
const n = {
family: K(t.family, e.family),
lineHeight: Fe(K(t.lineHeight, e.lineHeight), i),
size: i,
style: s,
weight: K(t.weight, e.weight),
string: "",
};
return (n.string = Ut(n)), n;
}
function je(t, e, i, s) {
let n,
o,
a,
r = !0;
for (n = 0, o = t.length; n < o; ++n)
if (
((a = t[n]),
void 0 !== a &&
(void 0 !== e && "function" == typeof a && ((a = a(e)), (r = !1)),
void 0 !== i && Y(a) && ((a = a[i % a.length]), (r = !1)),
void 0 !== a))
)
return s && !r && (s.cacheable = !1), a;
}
function $e(t, e, i) {
const { min: s, max: n } = t,
o = Z(e, (n - s) / 2),
a = (t, e) => (i && 0 === t ? 0 : t + e);
return { min: a(s, -Math.abs(o)), max: a(n, o) };
}
function Ye(t, e) {
return Object.assign(Object.create(t), e);
}
const Ue = ["left", "top", "right", "bottom"];
function Xe(t, e) {
return t.filter((t) => t.pos === e);
}
function qe(t, e) {
return t.filter((t) => -1 === Ue.indexOf(t.pos) && t.box.axis === e);
}
function Ke(t, e) {
return t.sort((t, i) => {
const s = e ? i : t,
n = e ? t : i;
return s.weight === n.weight ? s.index - n.index : s.weight - n.weight;
});
}
function Ge(t, e) {
const i = (function (t) {
const e = {};
for (const i of t) {
const { stack: t, pos: s, stackWeight: n } = i;
if (!t || !Ue.includes(s)) continue;
const o =
e[t] || (e[t] = { count: 0, placed: 0, weight: 0, size: 0 });
o.count++, (o.weight += n);
}
return e;
})(t),
{ vBoxMaxWidth: s, hBoxMaxHeight: n } = e;
let o, a, r;
for (o = 0, a = t.length; o < a; ++o) {
r = t[o];
const { fullSize: a } = r.box,
l = i[r.stack],
h = l && r.stackWeight / l.weight;
r.horizontal
? ((r.width = h ? h * s : a && e.availableWidth), (r.height = n))
: ((r.width = s), (r.height = h ? h * n : a && e.availableHeight));
}
return i;
}
function Ze(t, e, i, s) {
return Math.max(t[i], e[i]) + Math.max(t[s], e[s]);
}
function Je(t, e) {
(t.top = Math.max(t.top, e.top)),
(t.left = Math.max(t.left, e.left)),
(t.bottom = Math.max(t.bottom, e.bottom)),
(t.right = Math.max(t.right, e.right));
}
function Qe(t, e, i, s) {
const { pos: n, box: o } = i,
a = t.maxPadding;
if (!U(n)) {
i.size && (t[n] -= i.size);
const e = s[i.stack] || { size: 0, count: 1 };
(e.size = Math.max(e.size, i.horizontal ? o.height : o.width)),
(i.size = e.size / e.count),
(t[n] += i.size);
}
o.getPadding && Je(a, o.getPadding());
const r = Math.max(0, e.outerWidth - Ze(a, t, "left", "right")),
l = Math.max(0, e.outerHeight - Ze(a, t, "top", "bottom")),
h = r !== t.w,
c = l !== t.h;
return (
(t.w = r),
(t.h = l),
i.horizontal ? { same: h, other: c } : { same: c, other: h }
);
}
function ti(t, e) {
const i = e.maxPadding;
function s(t) {
const s = { left: 0, top: 0, right: 0, bottom: 0 };
return (
t.forEach((t) => {
s[t] = Math.max(e[t], i[t]);
}),
s
);
}
return s(t ? ["left", "right"] : ["top", "bottom"]);
}
function ei(t, e, i, s) {
const n = [];
let o, a, r, l, h, c;
for (o = 0, a = t.length, h = 0; o < a; ++o) {
(r = t[o]),
(l = r.box),
l.update(r.width || e.w, r.height || e.h, ti(r.horizontal, e));
const { same: a, other: d } = Qe(e, i, r, s);
(h |= a && n.length), (c = c || d), l.fullSize || n.push(r);
}
return (h && ei(n, e, i, s)) || c;
}
function ii(t, e, i, s, n) {
(t.top = i),
(t.left = e),
(t.right = e + s),
(t.bottom = i + n),
(t.width = s),
(t.height = n);
}
function si(t, e, i, s) {
const n = i.padding;
let { x: o, y: a } = e;
for (const r of t) {
const t = r.box,
l = s[r.stack] || { count: 1, placed: 0, weight: 1 },
h = r.stackWeight / l.weight || 1;
if (r.horizontal) {
const s = e.w * h,
o = l.size || t.height;
ct(l.start) && (a = l.start),
t.fullSize
? ii(t, n.left, a, i.outerWidth - n.right - n.left, o)
: ii(t, e.left + l.placed, a, s, o),
(l.start = a),
(l.placed += s),
(a = t.bottom);
} else {
const s = e.h * h,
a = l.size || t.width;
ct(l.start) && (o = l.start),
t.fullSize
? ii(t, o, n.top, a, i.outerHeight - n.bottom - n.top)
: ii(t, o, e.top + l.placed, a, s),
(l.start = o),
(l.placed += s),
(o = t.right);
}
}
(e.x = o), (e.y = a);
}
bt.set("layout", {
autoPadding: !0,
padding: { top: 0, right: 0, bottom: 0, left: 0 },
});
var ni = {
addBox(t, e) {
t.boxes || (t.boxes = []),
(e.fullSize = e.fullSize || !1),
(e.position = e.position || "top"),
(e.weight = e.weight || 0),
(e._layers =
e._layers ||
function () {
return [
{
z: 0,
draw(t) {
e.draw(t);
},
},
];
}),
t.boxes.push(e);
},
removeBox(t, e) {
const i = t.boxes ? t.boxes.indexOf(e) : -1;
-1 !== i && t.boxes.splice(i, 1);
},
configure(t, e, i) {
(e.fullSize = i.fullSize),
(e.position = i.position),
(e.weight = i.weight);
},
update(t, e, i, s) {
if (!t) return;
const n = Ne(t.options.layout.padding),
o = Math.max(e - n.width, 0),
a = Math.max(i - n.height, 0),
r = (function (t) {
const e = (function (t) {
const e = [];
let i, s, n, o, a, r;
for (i = 0, s = (t || []).length; i < s; ++i)
(n = t[i]),
({
position: o,
options: { stack: a, stackWeight: r = 1 },
} = n),
e.push({
index: i,
box: n,
pos: o,
horizontal: n.isHorizontal(),
weight: n.weight,
stack: a && o + a,
stackWeight: r,
});
return e;
})(t),
i = Ke(
e.filter((t) => t.box.fullSize),
!0
),
s = Ke(Xe(e, "left"), !0),
n = Ke(Xe(e, "right")),
o = Ke(Xe(e, "top"), !0),
a = Ke(Xe(e, "bottom")),
r = qe(e, "x"),
l = qe(e, "y");
return {
fullSize: i,
leftAndTop: s.concat(o),
rightAndBottom: n.concat(l).concat(a).concat(r),
chartArea: Xe(e, "chartArea"),
vertical: s.concat(n).concat(l),
horizontal: o.concat(a).concat(r),
};
})(t.boxes),
l = r.vertical,
h = r.horizontal;
Q(t.boxes, (t) => {
"function" == typeof t.beforeLayout && t.beforeLayout();
});
const c =
l.reduce(
(t, e) =>
e.box.options && !1 === e.box.options.display ? t : t + 1,
0
) || 1,
d = Object.freeze({
outerWidth: e,
outerHeight: i,
padding: n,
availableWidth: o,
availableHeight: a,
vBoxMaxWidth: o / 2 / c,
hBoxMaxHeight: a / 2,
}),
u = Object.assign({}, n);
Je(u, Ne(s));
const f = Object.assign(
{ maxPadding: u, w: o, h: a, x: n.left, y: n.top },
n
),
g = Ge(l.concat(h), d);
ei(r.fullSize, f, d, g),
ei(l, f, d, g),
ei(h, f, d, g) && ei(l, f, d, g),
(function (t) {
const e = t.maxPadding;
function i(i) {
const s = Math.max(e[i] - t[i], 0);
return (t[i] += s), s;
}
(t.y += i("top")), (t.x += i("left")), i("right"), i("bottom");
})(f),
si(r.leftAndTop, f, d, g),
(f.x += f.w),
(f.y += f.h),
si(r.rightAndBottom, f, d, g),
(t.chartArea = {
left: f.left,
top: f.top,
right: f.left + f.w,
bottom: f.top + f.h,
height: f.h,
width: f.w,
}),
Q(r.chartArea, (e) => {
const i = e.box;
Object.assign(i, t.chartArea),
i.update(f.w, f.h, { left: 0, top: 0, right: 0, bottom: 0 });
});
},
};
function oi(t, e = [""], i = t, s, n = () => t[0]) {
ct(s) || (s = mi("_fallback", t));
const o = {
[Symbol.toStringTag]: "Object",
_cacheable: !0,
_scopes: t,
_rootScopes: i,
_fallback: s,
_getTarget: n,
override: (n) => oi([n, ...t], e, i, s),
};
return new Proxy(o, {
deleteProperty: (e, i) => (
delete e[i], delete e._keys, delete t[0][i], !0
),
get: (i, s) =>
ci(i, s, () =>
(function (t, e, i, s) {
let n;
for (const o of e)
if (((n = mi(li(o, t), i)), ct(n)))
return hi(t, n) ? gi(i, s, t, n) : n;
})(s, e, t, i)
),
getOwnPropertyDescriptor: (t, e) =>
Reflect.getOwnPropertyDescriptor(t._scopes[0], e),
getPrototypeOf: () => Reflect.getPrototypeOf(t[0]),
has: (t, e) => xi(t).includes(e),
ownKeys: (t) => xi(t),
set(t, e, i) {
const s = t._storage || (t._storage = n());
return (t[e] = s[e] = i), delete t._keys, !0;
},
});
}
function ai(t, e, i, s) {
const n = {
_cacheable: !1,
_proxy: t,
_context: e,
_subProxy: i,
_stack: new Set(),
_descriptors: ri(t, s),
setContext: (e) => ai(t, e, i, s),
override: (n) => ai(t.override(n), e, i, s),
};
return new Proxy(n, {
deleteProperty: (e, i) => (delete e[i], delete t[i], !0),
get: (t, e, i) =>
ci(t, e, () =>
(function (t, e, i) {
const { _proxy: s, _context: n, _subProxy: o, _descriptors: a } = t;
let r = s[e];
dt(r) &&
a.isScriptable(e) &&
(r = (function (t, e, i, s) {
const { _proxy: n, _context: o, _subProxy: a, _stack: r } = i;
if (r.has(t))
throw new Error(
"Recursion detected: " + Array.from(r).join("->") + "->" + t
);
r.add(t),
(e = e(o, a || s)),
r.delete(t),
hi(t, e) && (e = gi(n._scopes, n, t, e));
return e;
})(e, r, t, i));
Y(r) &&
r.length &&
(r = (function (t, e, i, s) {
const {
_proxy: n,
_context: o,
_subProxy: a,
_descriptors: r,
} = i;
if (ct(o.index) && s(t)) e = e[o.index % e.length];
else if (U(e[0])) {
const i = e,
s = n._scopes.filter((t) => t !== i);
e = [];
for (const l of i) {
const i = gi(s, n, t, l);
e.push(ai(i, o, a && a[t], r));
}
}
return e;
})(e, r, t, a.isIndexable));
hi(e, r) && (r = ai(r, n, o && o[e], a));
return r;
})(t, e, i)
),
getOwnPropertyDescriptor: (e, i) =>
e._descriptors.allKeys
? Reflect.has(t, i)
? { enumerable: !0, configurable: !0 }
: void 0
: Reflect.getOwnPropertyDescriptor(t, i),
getPrototypeOf: () => Reflect.getPrototypeOf(t),
has: (e, i) => Reflect.has(t, i),
ownKeys: () => Reflect.ownKeys(t),
set: (e, i, s) => ((t[i] = s), delete e[i], !0),
});
}
function ri(t, e = { scriptable: !0, indexable: !0 }) {
const {
_scriptable: i = e.scriptable,
_indexable: s = e.indexable,
_allKeys: n = e.allKeys,
} = t;
return {
allKeys: n,
scriptable: i,
indexable: s,
isScriptable: dt(i) ? i : () => i,
isIndexable: dt(s) ? s : () => s,
};
}
const li = (t, e) => (t ? t + ht(e) : e),
hi = (t, e) =>
U(e) &&
"adapters" !== t &&
(null === Object.getPrototypeOf(e) || e.constructor === Object);
function ci(t, e, i) {
if (Object.prototype.hasOwnProperty.call(t, e)) return t[e];
const s = i();
return (t[e] = s), s;
}
function di(t, e, i) {
return dt(t) ? t(e, i) : t;
}
const ui = (t, e) =>
!0 === t ? e : "string" == typeof t ? lt(e, t) : void 0;
function fi(t, e, i, s, n) {
for (const o of e) {
const e = ui(i, o);
if (e) {
t.add(e);
const o = di(e._fallback, i, n);
if (ct(o) && o !== i && o !== s) return o;
} else if (!1 === e && ct(s) && i !== s) return null;
}
return !1;
}
function gi(t, e, i, s) {
const n = e._rootScopes,
o = di(e._fallback, i, s),
a = [...t, ...n],
r = new Set();
r.add(s);
let l = pi(r, a, i, o || i, s);
return (
null !== l &&
(!ct(o) || o === i || ((l = pi(r, a, o, l, s)), null !== l)) &&
oi(Array.from(r), [""], n, o, () =>
(function (t, e, i) {
const s = t._getTarget();
e in s || (s[e] = {});
const n = s[e];
if (Y(n) && U(i)) return i;
return n;
})(e, i, s)
)
);
}
function pi(t, e, i, s, n) {
for (; i; ) i = fi(t, e, i, s, n);
return i;
}
function mi(t, e) {
for (const i of e) {
if (!i) continue;
const e = i[t];
if (ct(e)) return e;
}
}
function xi(t) {
let e = t._keys;
return (
e ||
(e = t._keys =
(function (t) {
const e = new Set();
for (const i of t)
for (const t of Object.keys(i).filter((t) => !t.startsWith("_")))
e.add(t);
return Array.from(e);
})(t._scopes)),
e
);
}
const bi = Number.EPSILON || 1e-14,
_i = (t, e) => e < t.length && !t[e].skip && t[e],
yi = (t) => ("x" === t ? "y" : "x");
function vi(t, e, i, s) {
const n = t.skip ? e : t,
o = e,
a = i.skip ? e : i,
r = Vt(o, n),
l = Vt(a, o);
let h = r / (r + l),
c = l / (r + l);
(h = isNaN(h) ? 0 : h), (c = isNaN(c) ? 0 : c);
const d = s * h,
u = s * c;
return {
previous: { x: o.x - d * (a.x - n.x), y: o.y - d * (a.y - n.y) },
next: { x: o.x + u * (a.x - n.x), y: o.y + u * (a.y - n.y) },
};
}
function wi(t, e = "x") {
const i = yi(e),
s = t.length,
n = Array(s).fill(0),
o = Array(s);
let a,
r,
l,
h = _i(t, 0);
for (a = 0; a < s; ++a)
if (((r = l), (l = h), (h = _i(t, a + 1)), l)) {
if (h) {
const t = h[e] - l[e];
n[a] = 0 !== t ? (h[i] - l[i]) / t : 0;
}
o[a] = r
? h
? Ct(n[a - 1]) !== Ct(n[a])
? 0
: (n[a - 1] + n[a]) / 2
: n[a - 1]
: n[a];
}
!(function (t, e, i) {
const s = t.length;
let n,
o,
a,
r,
l,
h = _i(t, 0);
for (let c = 0; c < s - 1; ++c)
(l = h),
(h = _i(t, c + 1)),
l &&
h &&
(Lt(e[c], 0, bi)
? (i[c] = i[c + 1] = 0)
: ((n = i[c] / e[c]),
(o = i[c + 1] / e[c]),
(r = Math.pow(n, 2) + Math.pow(o, 2)),
r <= 9 ||
((a = 3 / Math.sqrt(r)),
(i[c] = n * a * e[c]),
(i[c + 1] = o * a * e[c]))));
})(t, n, o),
(function (t, e, i = "x") {
const s = yi(i),
n = t.length;
let o,
a,
r,
l = _i(t, 0);
for (let h = 0; h < n; ++h) {
if (((a = r), (r = l), (l = _i(t, h + 1)), !r)) continue;
const n = r[i],
c = r[s];
a &&
((o = (n - a[i]) / 3),
(r[`cp1${i}`] = n - o),
(r[`cp1${s}`] = c - o * e[h])),
l &&
((o = (l[i] - n) / 3),
(r[`cp2${i}`] = n + o),
(r[`cp2${s}`] = c + o * e[h]));
}
})(t, o, e);
}
function Mi(t, e, i) {
return Math.max(Math.min(t, i), e);
}
function ki(t, e, i, s, n) {
let o, a, r, l;
if (
(e.spanGaps && (t = t.filter((t) => !t.skip)),
"monotone" === e.cubicInterpolationMode)
)
wi(t, n);
else {
let i = s ? t[t.length - 1] : t[0];
for (o = 0, a = t.length; o < a; ++o)
(r = t[o]),
(l = vi(i, r, t[Math.min(o + 1, a - (s ? 0 : 1)) % a], e.tension)),
(r.cp1x = l.previous.x),
(r.cp1y = l.previous.y),
(r.cp2x = l.next.x),
(r.cp2y = l.next.y),
(i = r);
}
e.capBezierPoints &&
(function (t, e) {
let i,
s,
n,
o,
a,
r = Jt(t[0], e);
for (i = 0, s = t.length; i < s; ++i)
(a = o),
(o = r),
(r = i < s - 1 && Jt(t[i + 1], e)),
o &&
((n = t[i]),
a &&
((n.cp1x = Mi(n.cp1x, e.left, e.right)),
(n.cp1y = Mi(n.cp1y, e.top, e.bottom))),
r &&
((n.cp2x = Mi(n.cp2x, e.left, e.right)),
(n.cp2y = Mi(n.cp2y, e.top, e.bottom))));
})(t, i);
}
const Si = (t) => 0 === t || 1 === t,
Pi = (t, e, i) =>
-Math.pow(2, 10 * (t -= 1)) * Math.sin(((t - e) * yt) / i),
Di = (t, e, i) => Math.pow(2, -10 * t) * Math.sin(((t - e) * yt) / i) + 1,
Ci = {
linear: (t) => t,
easeInQuad: (t) => t * t,
easeOutQuad: (t) => -t * (t - 2),
easeInOutQuad: (t) =>
(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),
easeInCubic: (t) => t * t * t,
easeOutCubic: (t) => (t -= 1) * t * t + 1,
easeInOutCubic: (t) =>
(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),
easeInQuart: (t) => t * t * t * t,
easeOutQuart: (t) => -((t -= 1) * t * t * t - 1),
easeInOutQuart: (t) =>
(t /= 0.5) < 1
? 0.5 * t * t * t * t
: -0.5 * ((t -= 2) * t * t * t - 2),
easeInQuint: (t) => t * t * t * t * t,
easeOutQuint: (t) => (t -= 1) * t * t * t * t + 1,
easeInOutQuint: (t) =>
(t /= 0.5) < 1
? 0.5 * t * t * t * t * t
: 0.5 * ((t -= 2) * t * t * t * t + 2),
easeInSine: (t) => 1 - Math.cos(t * kt),
easeOutSine: (t) => Math.sin(t * kt),
easeInOutSine: (t) => -0.5 * (Math.cos(_t * t) - 1),
easeInExpo: (t) => (0 === t ? 0 : Math.pow(2, 10 * (t - 1))),
easeOutExpo: (t) => (1 === t ? 1 : 1 - Math.pow(2, -10 * t)),
easeInOutExpo: (t) =>
Si(t)
? t
: t < 0.5
? 0.5 * Math.pow(2, 10 * (2 * t - 1))
: 0.5 * (2 - Math.pow(2, -10 * (2 * t - 1))),
easeInCirc: (t) => (t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1)),
easeOutCirc: (t) => Math.sqrt(1 - (t -= 1) * t),
easeInOutCirc: (t) =>
(t /= 0.5) < 1
? -0.5 * (Math.sqrt(1 - t * t) - 1)
: 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),
easeInElastic: (t) => (Si(t) ? t : Pi(t, 0.075, 0.3)),
easeOutElastic: (t) => (Si(t) ? t : Di(t, 0.075, 0.3)),
easeInOutElastic(t) {
const e = 0.1125;
return Si(t)
? t
: t < 0.5
? 0.5 * Pi(2 * t, e, 0.45)
: 0.5 + 0.5 * Di(2 * t - 1, e, 0.45);
},
easeInBack(t) {
const e = 1.70158;
return t * t * ((e + 1) * t - e);
},
easeOutBack(t) {
const e = 1.70158;
return (t -= 1) * t * ((e + 1) * t + e) + 1;
},
easeInOutBack(t) {
let e = 1.70158;
return (t /= 0.5) < 1
? t * t * ((1 + (e *= 1.525)) * t - e) * 0.5
: 0.5 * ((t -= 2) * t * ((1 + (e *= 1.525)) * t + e) + 2);
},
easeInBounce: (t) => 1 - Ci.easeOutBounce(1 - t),
easeOutBounce(t) {
const e = 7.5625,
i = 2.75;
return t < 1 / i
? e * t * t
: t < 2 / i
? e * (t -= 1.5 / i) * t + 0.75
: t < 2.5 / i
? e * (t -= 2.25 / i) * t + 0.9375
: e * (t -= 2.625 / i) * t + 0.984375;
},
easeInOutBounce: (t) =>
t < 0.5
? 0.5 * Ci.easeInBounce(2 * t)
: 0.5 * Ci.easeOutBounce(2 * t - 1) + 0.5,
};
function Oi(t, e, i, s) {
return { x: t.x + i * (e.x - t.x), y: t.y + i * (e.y - t.y) };
}
function Ai(t, e, i, s) {
return {
x: t.x + i * (e.x - t.x),
y:
"middle" === s
? i < 0.5
? t.y
: e.y
: "after" === s
? i < 1
? t.y
: e.y
: i > 0
? e.y
: t.y,
};
}
function Ti(t, e, i, s) {
const n = { x: t.cp2x, y: t.cp2y },
o = { x: e.cp1x, y: e.cp1y },
a = Oi(t, n, i),
r = Oi(n, o, i),
l = Oi(o, e, i),
h = Oi(a, r, i),
c = Oi(r, l, i);
return Oi(h, c, i);
}
const Li = new Map();
function Ri(t, e, i) {
return (function (t, e) {
e = e || {};
const i = t + JSON.stringify(e);
let s = Li.get(i);
return s || ((s = new Intl.NumberFormat(t, e)), Li.set(i, s)), s;
})(e, i).format(t);
}
function Ei(t, e, i) {
return t
? (function (t, e) {
return {
x: (i) => t + t + e - i,
setWidth(t) {
e = t;
},
textAlign: (t) =>
"center" === t ? t : "right" === t ? "left" : "right",
xPlus: (t, e) => t - e,
leftForLtr: (t, e) => t - e,
};
})(e, i)
: {
x: (t) => t,
setWidth(t) {},
textAlign: (t) => t,
xPlus: (t, e) => t + e,
leftForLtr: (t, e) => t,
};
}
function Ii(t, e) {
let i, s;
("ltr" !== e && "rtl" !== e) ||
((i = t.canvas.style),
(s = [
i.getPropertyValue("direction"),
i.getPropertyPriority("direction"),
]),
i.setProperty("direction", e, "important"),
(t.prevTextDirection = s));
}
function zi(t, e) {
void 0 !== e &&
(delete t.prevTextDirection,
t.canvas.style.setProperty("direction", e[0], e[1]));
}
function Fi(t) {
return "angle" === t
? { between: Ht, compare: Wt, normalize: Nt }
: { between: Yt, compare: (t, e) => t - e, normalize: (t) => t };
}
function Bi({ start: t, end: e, count: i, loop: s, style: n }) {
return {
start: t % i,
end: e % i,
loop: s && (e - t + 1) % i == 0,
style: n,
};
}
function Vi(t, e, i) {
if (!i) return [t];
const { property: s, start: n, end: o } = i,
a = e.length,
{ compare: r, between: l, normalize: h } = Fi(s),
{
start: c,
end: d,
loop: u,
style: f,
} = (function (t, e, i) {
const { property: s, start: n, end: o } = i,
{ between: a, normalize: r } = Fi(s),
l = e.length;
let h,
c,
{ start: d, end: u, loop: f } = t;
if (f) {
for (
d += l, u += l, h = 0, c = l;
h < c && a(r(e[d % l][s]), n, o);
++h
)
d--, u--;
(d %= l), (u %= l);
}
return u < d && (u += l), { start: d, end: u, loop: f, style: t.style };
})(t, e, i),
g = [];
let p,
m,
x,
b = !1,
_ = null;
const y = () => b || (l(n, x, p) && 0 !== r(n, x)),
v = () => !b || 0 === r(o, p) || l(o, x, p);
for (let t = c, i = c; t <= d; ++t)
(m = e[t % a]),
m.skip ||
((p = h(m[s])),
p !== x &&
((b = l(p, n, o)),
null === _ && y() && (_ = 0 === r(p, n) ? t : i),
null !== _ &&
v() &&
(g.push(Bi({ start: _, end: t, loop: u, count: a, style: f })),
(_ = null)),
(i = t),
(x = p)));
return (
null !== _ &&
g.push(Bi({ start: _, end: d, loop: u, count: a, style: f })),
g
);
}
function Wi(t, e) {
const i = [],
s = t.segments;
for (let n = 0; n < s.length; n++) {
const o = Vi(s[n], t.points, e);
o.length && i.push(...o);
}
return i;
}
function Ni(t, e) {
const i = t.points,
s = t.options.spanGaps,
n = i.length;
if (!n) return [];
const o = !!t._loop,
{ start: a, end: r } = (function (t, e, i, s) {
let n = 0,
o = e - 1;
if (i && !s) for (; n < e && !t[n].skip; ) n++;
for (; n < e && t[n].skip; ) n++;
for (n %= e, i && (o += n); o > n && t[o % e].skip; ) o--;
return (o %= e), { start: n, end: o };
})(i, n, o, s);
if (!0 === s) return Hi(t, [{ start: a, end: r, loop: o }], i, e);
return Hi(
t,
(function (t, e, i, s) {
const n = t.length,
o = [];
let a,
r = e,
l = t[e];
for (a = e + 1; a <= i; ++a) {
const i = t[a % n];
i.skip || i.stop
? l.skip ||
((s = !1),
o.push({ start: e % n, end: (a - 1) % n, loop: s }),
(e = r = i.stop ? a : null))
: ((r = a), l.skip && (e = a)),
(l = i);
}
return null !== r && o.push({ start: e % n, end: r % n, loop: s }), o;
})(i, a, r < a ? r + n : r, !!t._fullLoop && 0 === a && r === n - 1),
i,
e
);
}
function Hi(t, e, i, s) {
return s && s.setContext && i
? (function (t, e, i, s) {
const n = t._chart.getContext(),
o = ji(t.options),
{
_datasetIndex: a,
options: { spanGaps: r },
} = t,
l = i.length,
h = [];
let c = o,
d = e[0].start,
u = d;
function f(t, e, s, n) {
const o = r ? -1 : 1;
if (t !== e) {
for (t += l; i[t % l].skip; ) t -= o;
for (; i[e % l].skip; ) e += o;
t % l != e % l &&
(h.push({ start: t % l, end: e % l, loop: s, style: n }),
(c = n),
(d = e % l));
}
}
for (const t of e) {
d = r ? d : t.start;
let e,
o = i[d % l];
for (u = d + 1; u <= t.end; u++) {
const r = i[u % l];
(e = ji(
s.setContext(
Ye(n, {
type: "segment",
p0: o,
p1: r,
p0DataIndex: (u - 1) % l,
p1DataIndex: u % l,
datasetIndex: a,
})
)
)),
$i(e, c) && f(d, u - 1, t.loop, c),
(o = r),
(c = e);
}
d < u - 1 && f(d, u - 1, t.loop, c);
}
return h;
})(t, e, i, s)
: e;
}
function ji(t) {
return {
backgroundColor: t.backgroundColor,
borderCapStyle: t.borderCapStyle,
borderDash: t.borderDash,
borderDashOffset: t.borderDashOffset,
borderJoinStyle: t.borderJoinStyle,
borderWidth: t.borderWidth,
borderColor: t.borderColor,
};
}
function $i(t, e) {
return e && JSON.stringify(t) !== JSON.stringify(e);
}
var Yi = Object.freeze({
__proto__: null,
easingEffects: Ci,
color: W,
getHoverColor: N,
noop: H,
uid: j,
isNullOrUndef: $,
isArray: Y,
isObject: U,
isFinite: X,
finiteOrDefault: q,
valueOrDefault: K,
toPercentage: G,
toDimension: Z,
callback: J,
each: Q,
_elementsEqual: tt,
clone: et,
_merger: st,
merge: nt,
mergeIf: ot,
_mergerIf: at,
_deprecated: function (t, e, i, s) {
void 0 !== e &&
console.warn(
t + ': "' + i + '" is deprecated. Please use "' + s + '" instead'
);
},
resolveObjectKey: lt,
_capitalize: ht,
defined: ct,
isFunction: dt,
setsEqual: ut,
_isClickEvent: ft,
toFontString: Ut,
_measureText: Xt,
_longestText: qt,
_alignPixel: Kt,
clearCanvas: Gt,
drawPoint: Zt,
_isPointInArea: Jt,
clipArea: Qt,
unclipArea: te,
_steppedLineTo: ee,
_bezierCurveTo: ie,
renderText: se,
addRoundedRectPath: oe,
_lookup: ae,
_lookupByKey: re,
_rlookupByKey: le,
_filterBetween: he,
listenArrayEvents: de,
unlistenArrayEvents: ue,
_arrayUnique: fe,
_createResolver: oi,
_attachContext: ai,
_descriptors: ri,
splineCurve: vi,
splineCurveMonotone: wi,
_updateBezierControlPoints: ki,
_isDomSupported: ge,
_getParentNode: pe,
getStyle: be,
getRelativePosition: ve,
getMaximumSize: Me,
retinaScale: ke,
supportsEventListenerOptions: Se,
readUsedSize: Pe,
fontString: function (t, e, i) {
return e + " " + t + "px " + i;
},
requestAnimFrame: t,
throttled: e,
debounce: i,
_toLeftRightCenter: s,
_alignStartEnd: n,
_textX: o,
_pointInLine: Oi,
_steppedInterpolation: Ai,
_bezierInterpolation: Ti,
formatNumber: Ri,
toLineHeight: Fe,
_readValueToProps: Be,
toTRBL: Ve,
toTRBLCorners: We,
toPadding: Ne,
toFont: He,
resolve: je,
_addGrace: $e,
createContext: Ye,
PI: _t,
TAU: yt,
PITAU: vt,
INFINITY: wt,
RAD_PER_DEG: Mt,
HALF_PI: kt,
QUARTER_PI: St,
TWO_THIRDS_PI: Pt,
log10: Dt,
sign: Ct,
niceNum: Ot,
_factorize: At,
isNumber: Tt,
almostEquals: Lt,
almostWhole: Rt,
_setMinAndMaxByKey: Et,
toRadians: It,
toDegrees: zt,
_decimalPlaces: Ft,
getAngleFromPoint: Bt,
distanceBetweenPoints: Vt,
_angleDiff: Wt,
_normalizeAngle: Nt,
_angleBetween: Ht,
_limitValue: jt,
_int16Range: $t,
_isBetween: Yt,
getRtlAdapter: Ei,
overrideTextDirection: Ii,
restoreTextDirection: zi,
_boundSegment: Vi,
_boundSegments: Wi,
_computeSegments: Ni,
});
class Ui {
acquireContext(t, e) {}
releaseContext(t) {
return !1;
}
addEventListener(t, e, i) {}
removeEventListener(t, e, i) {}
getDevicePixelRatio() {
return 1;
}
getMaximumSize(t, e, i, s) {
return (
(e = Math.max(0, e || t.width)),
(i = i || t.height),
{ width: e, height: Math.max(0, s ? Math.floor(e / s) : i) }
);
}
isAttached(t) {
return !0;
}
updateConfig(t) {}
}
class Xi extends Ui {
acquireContext(t) {
return (t && t.getContext && t.getContext("2d")) || null;
}
updateConfig(t) {
t.options.animation = !1;
}
}
const qi = {
touchstart: "mousedown",
touchmove: "mousemove",
touchend: "mouseup",
pointerenter: "mouseenter",
pointerdown: "mousedown",
pointermove: "mousemove",
pointerup: "mouseup",
pointerleave: "mouseout",
pointerout: "mouseout",
},
Ki = (t) => null === t || "" === t;
const Gi = !!Se && { passive: !0 };
function Zi(t, e, i) {
t.canvas.removeEventListener(e, i, Gi);
}
function Ji(t, e) {
for (const i of t) if (i === e || i.contains(e)) return !0;
}
function Qi(t, e, i) {
const s = t.canvas,
n = new MutationObserver((t) => {
let e = !1;
for (const i of t)
(e = e || Ji(i.addedNodes, s)), (e = e && !Ji(i.removedNodes, s));
e && i();
});
return n.observe(document, { childList: !0, subtree: !0 }), n;
}
function ts(t, e, i) {
const s = t.canvas,
n = new MutationObserver((t) => {
let e = !1;
for (const i of t)
(e = e || Ji(i.removedNodes, s)), (e = e && !Ji(i.addedNodes, s));
e && i();
});
return n.observe(document, { childList: !0, subtree: !0 }), n;
}
const es = new Map();
let is = 0;
function ss() {
const t = window.devicePixelRatio;
t !== is &&
((is = t),
es.forEach((e, i) => {
i.currentDevicePixelRatio !== t && e();
}));
}
function ns(t, i, s) {
const n = t.canvas,
o = n && pe(n);
if (!o) return;
const a = e((t, e) => {
const i = o.clientWidth;
s(t, e), i < o.clientWidth && s();
}, window),
r = new ResizeObserver((t) => {
const e = t[0],
i = e.contentRect.width,
s = e.contentRect.height;
(0 === i && 0 === s) || a(i, s);
});
return (
r.observe(o),
(function (t, e) {
es.size || window.addEventListener("resize", ss), es.set(t, e);
})(t, a),
r
);
}
function os(t, e, i) {
i && i.disconnect(),
"resize" === e &&
(function (t) {
es.delete(t), es.size || window.removeEventListener("resize", ss);
})(t);
}
function as(t, i, s) {
const n = t.canvas,
o = e(
(e) => {
null !== t.ctx &&
s(
(function (t, e) {
const i = qi[t.type] || t.type,
{ x: s, y: n } = ve(t, e);
return {
type: i,
chart: e,
native: t,
x: void 0 !== s ? s : null,
y: void 0 !== n ? n : null,
};
})(e, t)
);
},
t,
(t) => {
const e = t[0];
return [e, e.offsetX, e.offsetY];
}
);
return (
(function (t, e, i) {
t.addEventListener(e, i, Gi);
})(n, i, o),
o
);
}
class rs extends Ui {
acquireContext(t, e) {
const i = t && t.getContext && t.getContext("2d");
return i && i.canvas === t
? ((function (t, e) {
const i = t.style,
s = t.getAttribute("height"),
n = t.getAttribute("width");
if (
((t.$chartjs = {
initial: {
height: s,
width: n,
style: {
display: i.display,
height: i.height,
width: i.width,
},
},
}),
(i.display = i.display || "block"),
(i.boxSizing = i.boxSizing || "border-box"),
Ki(n))
) {
const e = Pe(t, "width");
void 0 !== e && (t.width = e);
}
if (Ki(s))
if ("" === t.style.height) t.height = t.width / (e || 2);
else {
const e = Pe(t, "height");
void 0 !== e && (t.height = e);
}
})(t, e),
i)
: null;
}
releaseContext(t) {
const e = t.canvas;
if (!e.$chartjs) return !1;
const i = e.$chartjs.initial;
["height", "width"].forEach((t) => {
const s = i[t];
$(s) ? e.removeAttribute(t) : e.setAttribute(t, s);
});
const s = i.style || {};
return (
Object.keys(s).forEach((t) => {
e.style[t] = s[t];
}),
(e.width = e.width),
delete e.$chartjs,
!0
);
}
addEventListener(t, e, i) {
this.removeEventListener(t, e);
const s = t.$proxies || (t.$proxies = {}),
n = { attach: Qi, detach: ts, resize: ns }[e] || as;
s[e] = n(t, e, i);
}
removeEventListener(t, e) {
const i = t.$proxies || (t.$proxies = {}),
s = i[e];
if (!s) return;
(({ attach: os, detach: os, resize: os }[e] || Zi)(t, e, s),
(i[e] = void 0));
}
getDevicePixelRatio() {
return window.devicePixelRatio;
}
getMaximumSize(t, e, i, s) {
return Me(t, e, i, s);
}
isAttached(t) {
const e = pe(t);
return !(!e || !e.isConnected);
}
}
function ls(t) {
return !ge() ||
("undefined" != typeof OffscreenCanvas && t instanceof OffscreenCanvas)
? Xi
: rs;
}
var hs = Object.freeze({
__proto__: null,
_detectPlatform: ls,
BasePlatform: Ui,
BasicPlatform: Xi,
DomPlatform: rs,
});
const cs = "transparent",
ds = {
boolean: (t, e, i) => (i > 0.5 ? e : t),
color(t, e, i) {
const s = W(t || cs),
n = s.valid && W(e || cs);
return n && n.valid ? n.mix(s, i).hexString() : e;
},
number: (t, e, i) => t + (e - t) * i,
};
class us {
constructor(t, e, i, s) {
const n = e[i];
s = je([t.to, s, n, t.from]);
const o = je([t.from, n, s]);
(this._active = !0),
(this._fn = t.fn || ds[t.type || typeof o]),
(this._easing = Ci[t.easing] || Ci.linear),
(this._start = Math.floor(Date.now() + (t.delay || 0))),
(this._duration = this._total = Math.floor(t.duration)),
(this._loop = !!t.loop),
(this._target = e),
(this._prop = i),
(this._from = o),
(this._to = s),
(this._promises = void 0);
}
active() {
return this._active;
}
update(t, e, i) {
if (this._active) {
this._notify(!1);
const s = this._target[this._prop],
n = i - this._start,
o = this._duration - n;
(this._start = i),
(this._duration = Math.floor(Math.max(o, t.duration))),
(this._total += n),
(this._loop = !!t.loop),
(this._to = je([t.to, e, s, t.from])),
(this._from = je([t.from, s, e]));
}
}
cancel() {
this._active &&
(this.tick(Date.now()), (this._active = !1), this._notify(!1));
}
tick(t) {
const e = t - this._start,
i = this._duration,
s = this._prop,
n = this._from,
o = this._loop,
a = this._to;
let r;
if (((this._active = n !== a && (o || e < i)), !this._active))
return (this._target[s] = a), void this._notify(!0);
e < 0
? (this._target[s] = n)
: ((r = (e / i) % 2),
(r = o && r > 1 ? 2 - r : r),
(r = this._easing(Math.min(1, Math.max(0, r)))),
(this._target[s] = this._fn(n, a, r)));
}
wait() {
const t = this._promises || (this._promises = []);
return new Promise((e, i) => {
t.push({ res: e, rej: i });
});
}
_notify(t) {
const e = t ? "res" : "rej",
i = this._promises || [];
for (let t = 0; t < i.length; t++) i[t][e]();
}
}
bt.set("animation", {
delay: void 0,
duration: 1e3,
easing: "easeOutQuart",
fn: void 0,
from: void 0,
loop: void 0,
to: void 0,
type: void 0,
});
const fs = Object.keys(bt.animation);
bt.describe("animation", {
_fallback: !1,
_indexable: !1,
_scriptable: (t) => "onProgress" !== t && "onComplete" !== t && "fn" !== t,
}),
bt.set("animations", {
colors: {
type: "color",
properties: ["color", "borderColor", "backgroundColor"],
},
numbers: {
type: "number",
properties: ["x", "y", "borderWidth", "radius", "tension"],
},
}),
bt.describe("animations", { _fallback: "animation" }),
bt.set("transitions", {
active: { animation: { duration: 400 } },
resize: { animation: { duration: 0 } },
show: {
animations: {
colors: { from: "transparent" },
visible: { type: "boolean", duration: 0 },
},
},
hide: {
animations: {
colors: { to: "transparent" },
visible: { type: "boolean", easing: "linear", fn: (t) => 0 | t },
},
},
});
class gs {
constructor(t, e) {
(this._chart = t), (this._properties = new Map()), this.configure(e);
}
configure(t) {
if (!U(t)) return;
const e = this._properties;
Object.getOwnPropertyNames(t).forEach((i) => {
const s = t[i];
if (!U(s)) return;
const n = {};
for (const t of fs) n[t] = s[t];
((Y(s.properties) && s.properties) || [i]).forEach((t) => {
(t !== i && e.has(t)) || e.set(t, n);
});
});
}
_animateOptions(t, e) {
const i = e.options,
s = (function (t, e) {
if (!e) return;
let i = t.options;
if (!i) return void (t.options = e);
i.$shared &&
(t.options = i =
Object.assign({}, i, { $shared: !1, $animations: {} }));
return i;
})(t, i);
if (!s) return [];
const n = this._createAnimations(s, i);
return (
i.$shared &&
(function (t, e) {
const i = [],
s = Object.keys(e);
for (let e = 0; e < s.length; e++) {
const n = t[s[e]];
n && n.active() && i.push(n.wait());
}
return Promise.all(i);
})(t.options.$animations, i).then(
() => {
t.options = i;
},
() => {}
),
n
);
}
_createAnimations(t, e) {
const i = this._properties,
s = [],
n = t.$animations || (t.$animations = {}),
o = Object.keys(e),
a = Date.now();
let r;
for (r = o.length - 1; r >= 0; --r) {
const l = o[r];
if ("$" === l.charAt(0)) continue;
if ("options" === l) {
s.push(...this._animateOptions(t, e));
continue;
}
const h = e[l];
let c = n[l];
const d = i.get(l);
if (c) {
if (d && c.active()) {
c.update(d, h, a);
continue;
}
c.cancel();
}
d && d.duration
? ((n[l] = c = new us(d, t, l, h)), s.push(c))
: (t[l] = h);
}
return s;
}
update(t, e) {
if (0 === this._properties.size) return void Object.assign(t, e);
const i = this._createAnimations(t, e);
return i.length ? (a.add(this._chart, i), !0) : void 0;
}
}
function ps(t, e) {
const i = (t && t.options) || {},
s = i.reverse,
n = void 0 === i.min ? e : 0,
o = void 0 === i.max ? e : 0;
return { start: s ? o : n, end: s ? n : o };
}
function ms(t, e) {
const i = [],
s = t._getSortedDatasetMetas(e);
let n, o;
for (n = 0, o = s.length; n < o; ++n) i.push(s[n].index);
return i;
}
function xs(t, e, i, s = {}) {
const n = t.keys,
o = "single" === s.mode;
let a, r, l, h;
if (null !== e) {
for (a = 0, r = n.length; a < r; ++a) {
if (((l = +n[a]), l === i)) {
if (s.all) continue;
break;
}
(h = t.values[l]),
X(h) && (o || 0 === e || Ct(e) === Ct(h)) && (e += h);
}
return e;
}
}
function bs(t, e) {
const i = t && t.options.stacked;
return i || (void 0 === i && void 0 !== e.stack);
}
function _s(t, e, i) {
const s = t[e] || (t[e] = {});
return s[i] || (s[i] = {});
}
function ys(t, e, i, s) {
for (const n of e.getMatchingVisibleMetas(s).reverse()) {
const e = t[n.index];
if ((i && e > 0) || (!i && e < 0)) return n.index;
}
return null;
}
function vs(t, e) {
const { chart: i, _cachedMeta: s } = t,
n = i._stacks || (i._stacks = {}),
{ iScale: o, vScale: a, index: r } = s,
l = o.axis,
h = a.axis,
c = (function (t, e, i) {
return `${t.id}.${e.id}.${i.stack || i.type}`;
})(o, a, s),
d = e.length;
let u;
for (let t = 0; t < d; ++t) {
const i = e[t],
{ [l]: o, [h]: d } = i;
(u = (i._stacks || (i._stacks = {}))[h] = _s(n, c, o)),
(u[r] = d),
(u._top = ys(u, a, !0, s.type)),
(u._bottom = ys(u, a, !1, s.type));
}
}
function ws(t, e) {
const i = t.scales;
return Object.keys(i)
.filter((t) => i[t].axis === e)
.shift();
}
function Ms(t, e) {
const i = t.controller.index,
s = t.vScale && t.vScale.axis;
if (s) {
e = e || t._parsed;
for (const t of e) {
const e = t._stacks;
if (!e || void 0 === e[s] || void 0 === e[s][i]) return;
delete e[s][i];
}
}
}
const ks = (t) => "reset" === t || "none" === t,
Ss = (t, e) => (e ? t : Object.assign({}, t));
class Ps {
constructor(t, e) {
(this.chart = t),
(this._ctx = t.ctx),
(this.index = e),
(this._cachedDataOpts = {}),
(this._cachedMeta = this.getMeta()),
(this._type = this._cachedMeta.type),
(this.options = void 0),
(this._parsing = !1),
(this._data = void 0),
(this._objectData = void 0),
(this._sharedOptions = void 0),
(this._drawStart = void 0),
(this._drawCount = void 0),
(this.enableOptionSharing = !1),
(this.$context = void 0),
(this._syncList = []),
this.initialize();
}
initialize() {
const t = this._cachedMeta;
this.configure(),
this.linkScales(),
(t._stacked = bs(t.vScale, t)),
this.addElements();
}
updateIndex(t) {
this.index !== t && Ms(this._cachedMeta), (this.index = t);
}
linkScales() {
const t = this.chart,
e = this._cachedMeta,
i = this.getDataset(),
s = (t, e, i, s) => ("x" === t ? e : "r" === t ? s : i),
n = (e.xAxisID = K(i.xAxisID, ws(t, "x"))),
o = (e.yAxisID = K(i.yAxisID, ws(t, "y"))),
a = (e.rAxisID = K(i.rAxisID, ws(t, "r"))),
r = e.indexAxis,
l = (e.iAxisID = s(r, n, o, a)),
h = (e.vAxisID = s(r, o, n, a));
(e.xScale = this.getScaleForId(n)),
(e.yScale = this.getScaleForId(o)),
(e.rScale = this.getScaleForId(a)),
(e.iScale = this.getScaleForId(l)),
(e.vScale = this.getScaleForId(h));
}
getDataset() {
return this.chart.data.datasets[this.index];
}
getMeta() {
return this.chart.getDatasetMeta(this.index);
}
getScaleForId(t) {
return this.chart.scales[t];
}
_getOtherScale(t) {
const e = this._cachedMeta;
return t === e.iScale ? e.vScale : e.iScale;
}
reset() {
this._update("reset");
}
_destroy() {
const t = this._cachedMeta;
this._data && ue(this._data, this), t._stacked && Ms(t);
}
_dataCheck() {
const t = this.getDataset(),
e = t.data || (t.data = []),
i = this._data;
if (U(e))
this._data = (function (t) {
const e = Object.keys(t),
i = new Array(e.length);
let s, n, o;
for (s = 0, n = e.length; s < n; ++s)
(o = e[s]), (i[s] = { x: o, y: t[o] });
return i;
})(e);
else if (i !== e) {
if (i) {
ue(i, this);
const t = this._cachedMeta;
Ms(t), (t._parsed = []);
}
e && Object.isExtensible(e) && de(e, this),
(this._syncList = []),
(this._data = e);
}
}
addElements() {
const t = this._cachedMeta;
this._dataCheck(),
this.datasetElementType && (t.dataset = new this.datasetElementType());
}
buildOrUpdateElements(t) {
const e = this._cachedMeta,
i = this.getDataset();
let s = !1;
this._dataCheck();
const n = e._stacked;
(e._stacked = bs(e.vScale, e)),
e.stack !== i.stack && ((s = !0), Ms(e), (e.stack = i.stack)),
this._resyncElements(t),
(s || n !== e._stacked) && vs(this, e._parsed);
}
configure() {
const t = this.chart.config,
e = t.datasetScopeKeys(this._type),
i = t.getOptionScopes(this.getDataset(), e, !0);
(this.options = t.createResolver(i, this.getContext())),
(this._parsing = this.options.parsing),
(this._cachedDataOpts = {});
}
parse(t, e) {
const { _cachedMeta: i, _data: s } = this,
{ iScale: n, _stacked: o } = i,
a = n.axis;
let r,
l,
h,
c = (0 === t && e === s.length) || i._sorted,
d = t > 0 && i._parsed[t - 1];
if (!1 === this._parsing) (i._parsed = s), (i._sorted = !0), (h = s);
else {
h = Y(s[t])
? this.parseArrayData(i, s, t, e)
: U(s[t])
? this.parseObjectData(i, s, t, e)
: this.parsePrimitiveData(i, s, t, e);
const n = () => null === l[a] || (d && l[a] < d[a]);
for (r = 0; r < e; ++r)
(i._parsed[r + t] = l = h[r]), c && (n() && (c = !1), (d = l));
i._sorted = c;
}
o && vs(this, h);
}
parsePrimitiveData(t, e, i, s) {
const { iScale: n, vScale: o } = t,
a = n.axis,
r = o.axis,
l = n.getLabels(),
h = n === o,
c = new Array(s);
let d, u, f;
for (d = 0, u = s; d < u; ++d)
(f = d + i),
(c[d] = { [a]: h || n.parse(l[f], f), [r]: o.parse(e[f], f) });
return c;
}
parseArrayData(t, e, i, s) {
const { xScale: n, yScale: o } = t,
a = new Array(s);
let r, l, h, c;
for (r = 0, l = s; r < l; ++r)
(h = r + i),
(c = e[h]),
(a[r] = { x: n.parse(c[0], h), y: o.parse(c[1], h) });
return a;
}
parseObjectData(t, e, i, s) {
const { xScale: n, yScale: o } = t,
{ xAxisKey: a = "x", yAxisKey: r = "y" } = this._parsing,
l = new Array(s);
let h, c, d, u;
for (h = 0, c = s; h < c; ++h)
(d = h + i),
(u = e[d]),
(l[h] = { x: n.parse(lt(u, a), d), y: o.parse(lt(u, r), d) });
return l;
}
getParsed(t) {
return this._cachedMeta._parsed[t];
}
getDataElement(t) {
return this._cachedMeta.data[t];
}
applyStack(t, e, i) {
const s = this.chart,
n = this._cachedMeta,
o = e[t.axis];
return xs({ keys: ms(s, !0), values: e._stacks[t.axis] }, o, n.index, {
mode: i,
});
}
updateRangeFromParsed(t, e, i, s) {
const n = i[e.axis];
let o = null === n ? NaN : n;
const a = s && i._stacks[e.axis];
s && a && ((s.values = a), (o = xs(s, n, this._cachedMeta.index))),
(t.min = Math.min(t.min, o)),
(t.max = Math.max(t.max, o));
}
getMinMax(t, e) {
const i = this._cachedMeta,
s = i._parsed,
n = i._sorted && t === i.iScale,
o = s.length,
a = this._getOtherScale(t),
r = ((t, e, i) =>
t && !e.hidden && e._stacked && { keys: ms(i, !0), values: null })(
e,
i,
this.chart
),
l = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY },
{ min: h, max: c } = (function (t) {
const {
min: e,
max: i,
minDefined: s,
maxDefined: n,
} = t.getUserBounds();
return {
min: s ? e : Number.NEGATIVE_INFINITY,
max: n ? i : Number.POSITIVE_INFINITY,
};
})(a);
let d, u;
function f() {
u = s[d];
const e = u[a.axis];
return !X(u[t.axis]) || h > e || c < e;
}
for (
d = 0;
d < o && (f() || (this.updateRangeFromParsed(l, t, u, r), !n));
++d
);
if (n)
for (d = o - 1; d >= 0; --d)
if (!f()) {
this.updateRangeFromParsed(l, t, u, r);
break;
}
return l;
}
getAllParsedValues(t) {
const e = this._cachedMeta._parsed,
i = [];
let s, n, o;
for (s = 0, n = e.length; s < n; ++s)
(o = e[s][t.axis]), X(o) && i.push(o);
return i;
}
getMaxOverflow() {
return !1;
}
getLabelAndValue(t) {
const e = this._cachedMeta,
i = e.iScale,
s = e.vScale,
n = this.getParsed(t);
return {
label: i ? "" + i.getLabelForValue(n[i.axis]) : "",
value: s ? "" + s.getLabelForValue(n[s.axis]) : "",
};
}
_update(t) {
const e = this._cachedMeta;
this.update(t || "default"),
(e._clip = (function (t) {
let e, i, s, n;
return (
U(t)
? ((e = t.top), (i = t.right), (s = t.bottom), (n = t.left))
: (e = i = s = n = t),
{ top: e, right: i, bottom: s, left: n, disabled: !1 === t }
);
})(
K(
this.options.clip,
(function (t, e, i) {
if (!1 === i) return !1;
const s = ps(t, i),
n = ps(e, i);
return {
top: n.end,
right: s.end,
bottom: n.start,
left: s.start,
};
})(e.xScale, e.yScale, this.getMaxOverflow())
)
));
}
update(t) {}
draw() {
const t = this._ctx,
e = this.chart,
i = this._cachedMeta,
s = i.data || [],
n = e.chartArea,
o = [],
a = this._drawStart || 0,
r = this._drawCount || s.length - a,
l = this.options.drawActiveElementsOnTop;
let h;
for (i.dataset && i.dataset.draw(t, n, a, r), h = a; h < a + r; ++h) {
const e = s[h];
e.hidden || (e.active && l ? o.push(e) : e.draw(t, n));
}
for (h = 0; h < o.length; ++h) o[h].draw(t, n);
}
getStyle(t, e) {
const i = e ? "active" : "default";
return void 0 === t && this._cachedMeta.dataset
? this.resolveDatasetElementOptions(i)
: this.resolveDataElementOptions(t || 0, i);
}
getContext(t, e, i) {
const s = this.getDataset();
let n;
if (t >= 0 && t < this._cachedMeta.data.length) {
const e = this._cachedMeta.data[t];
(n =
e.$context ||
(e.$context = (function (t, e, i) {
return Ye(t, {
active: !1,
dataIndex: e,
parsed: void 0,
raw: void 0,
element: i,
index: e,
mode: "default",
type: "data",
});
})(this.getContext(), t, e))),
(n.parsed = this.getParsed(t)),
(n.raw = s.data[t]),
(n.index = n.dataIndex = t);
} else
(n =
this.$context ||
(this.$context = (function (t, e) {
return Ye(t, {
active: !1,
dataset: void 0,
datasetIndex: e,
index: e,
mode: "default",
type: "dataset",
});
})(this.chart.getContext(), this.index))),
(n.dataset = s),
(n.index = n.datasetIndex = this.index);
return (n.active = !!e), (n.mode = i), n;
}
resolveDatasetElementOptions(t) {
return this._resolveElementOptions(this.datasetElementType.id, t);
}
resolveDataElementOptions(t, e) {
return this._resolveElementOptions(this.dataElementType.id, e, t);
}
_resolveElementOptions(t, e = "default", i) {
const s = "active" === e,
n = this._cachedDataOpts,
o = t + "-" + e,
a = n[o],
r = this.enableOptionSharing && ct(i);
if (a) return Ss(a, r);
const l = this.chart.config,
h = l.datasetElementScopeKeys(this._type, t),
c = s ? [`${t}Hover`, "hover", t, ""] : [t, ""],
d = l.getOptionScopes(this.getDataset(), h),
u = Object.keys(bt.elements[t]),
f = l.resolveNamedOptions(d, u, () => this.getContext(i, s), c);
return (
f.$shared && ((f.$shared = r), (n[o] = Object.freeze(Ss(f, r)))), f
);
}
_resolveAnimations(t, e, i) {
const s = this.chart,
n = this._cachedDataOpts,
o = `animation-${e}`,
a = n[o];
if (a) return a;
let r;
if (!1 !== s.options.animation) {
const s = this.chart.config,
n = s.datasetAnimationScopeKeys(this._type, e),
o = s.getOptionScopes(this.getDataset(), n);
r = s.createResolver(o, this.getContext(t, i, e));
}
const l = new gs(s, r && r.animations);
return r && r._cacheable && (n[o] = Object.freeze(l)), l;
}
getSharedOptions(t) {
if (t.$shared)
return (
this._sharedOptions || (this._sharedOptions = Object.assign({}, t))
);
}
includeOptions(t, e) {
return !e || ks(t) || this.chart._animationsDisabled;
}
updateElement(t, e, i, s) {
ks(s) ? Object.assign(t, i) : this._resolveAnimations(e, s).update(t, i);
}
updateSharedOptions(t, e, i) {
t && !ks(e) && this._resolveAnimations(void 0, e).update(t, i);
}
_setStyle(t, e, i, s) {
t.active = s;
const n = this.getStyle(e, s);
this._resolveAnimations(e, i, s).update(t, {
options: (!s && this.getSharedOptions(n)) || n,
});
}
removeHoverStyle(t, e, i) {
this._setStyle(t, i, "active", !1);
}
setHoverStyle(t, e, i) {
this._setStyle(t, i, "active", !0);
}
_removeDatasetHoverStyle() {
const t = this._cachedMeta.dataset;
t && this._setStyle(t, void 0, "active", !1);
}
_setDatasetHoverStyle() {
const t = this._cachedMeta.dataset;
t && this._setStyle(t, void 0, "active", !0);
}
_resyncElements(t) {
const e = this._data,
i = this._cachedMeta.data;
for (const [t, e, i] of this._syncList) this[t](e, i);
this._syncList = [];
const s = i.length,
n = e.length,
o = Math.min(n, s);
o && this.parse(0, o),
n > s
? this._insertElements(s, n - s, t)
: n < s && this._removeElements(n, s - n);
}
_insertElements(t, e, i = !0) {
const s = this._cachedMeta,
n = s.data,
o = t + e;
let a;
const r = (t) => {
for (t.length += e, a = t.length - 1; a >= o; a--) t[a] = t[a - e];
};
for (r(n), a = t; a < o; ++a) n[a] = new this.dataElementType();
this._parsing && r(s._parsed),
this.parse(t, e),
i && this.updateElements(n, t, e, "reset");
}
updateElements(t, e, i, s) {}
_removeElements(t, e) {
const i = this._cachedMeta;
if (this._parsing) {
const s = i._parsed.splice(t, e);
i._stacked && Ms(i, s);
}
i.data.splice(t, e);
}
_sync(t) {
if (this._parsing) this._syncList.push(t);
else {
const [e, i, s] = t;
this[e](i, s);
}
this.chart._dataChanges.push([this.index, ...t]);
}
_onDataPush() {
const t = arguments.length;
this._sync(["_insertElements", this.getDataset().data.length - t, t]);
}
_onDataPop() {
this._sync(["_removeElements", this._cachedMeta.data.length - 1, 1]);
}
_onDataShift() {
this._sync(["_removeElements", 0, 1]);
}
_onDataSplice(t, e) {
e && this._sync(["_removeElements", t, e]);
const i = arguments.length - 2;
i && this._sync(["_insertElements", t, i]);
}
_onDataUnshift() {
this._sync(["_insertElements", 0, arguments.length]);
}
}
(Ps.defaults = {}),
(Ps.prototype.datasetElementType = null),
(Ps.prototype.dataElementType = null);
class Ds {
constructor() {
(this.x = void 0),
(this.y = void 0),
(this.active = !1),
(this.options = void 0),
(this.$animations = void 0);
}
tooltipPosition(t) {
const { x: e, y: i } = this.getProps(["x", "y"], t);
return { x: e, y: i };
}
hasValue() {
return Tt(this.x) && Tt(this.y);
}
getProps(t, e) {
const i = this.$animations;
if (!e || !i) return this;
const s = {};
return (
t.forEach((t) => {
s[t] = i[t] && i[t].active() ? i[t]._to : this[t];
}),
s
);
}
}
(Ds.defaults = {}), (Ds.defaultRoutes = void 0);
const Cs = {
values: (t) => (Y(t) ? t : "" + t),
numeric(t, e, i) {
if (0 === t) return "0";
const s = this.chart.options.locale;
let n,
o = t;
if (i.length > 1) {
const e = Math.max(
Math.abs(i[0].value),
Math.abs(i[i.length - 1].value)
);
(e < 1e-4 || e > 1e15) && (n = "scientific"),
(o = (function (t, e) {
let i =
e.length > 3 ? e[2].value - e[1].value : e[1].value - e[0].value;
Math.abs(i) >= 1 && t !== Math.floor(t) && (i = t - Math.floor(t));
return i;
})(t, i));
}
const a = Dt(Math.abs(o)),
r = Math.max(Math.min(-1 * Math.floor(a), 20), 0),
l = { notation: n, minimumFractionDigits: r, maximumFractionDigits: r };
return Object.assign(l, this.options.ticks.format), Ri(t, s, l);
},
logarithmic(t, e, i) {
if (0 === t) return "0";
const s = t / Math.pow(10, Math.floor(Dt(t)));
return 1 === s || 2 === s || 5 === s
? Cs.numeric.call(this, t, e, i)
: "";
},
};
var Os = { formatters: Cs };
function As(t, e) {
const i = t.options.ticks,
s =
i.maxTicksLimit ||
(function (t) {
const e = t.options.offset,
i = t._tickSize(),
s = t._length / i + (e ? 0 : 1),
n = t._maxLength / i;
return Math.floor(Math.min(s, n));
})(t),
n = i.major.enabled
? (function (t) {
const e = [];
let i, s;
for (i = 0, s = t.length; i < s; i++) t[i].major && e.push(i);
return e;
})(e)
: [],
o = n.length,
a = n[0],
r = n[o - 1],
l = [];
if (o > s)
return (
(function (t, e, i, s) {
let n,
o = 0,
a = i[0];
for (s = Math.ceil(s), n = 0; n < t.length; n++)
n === a && (e.push(t[n]), o++, (a = i[o * s]));
})(e, l, n, o / s),
l
);
const h = (function (t, e, i) {
const s = (function (t) {
const e = t.length;
let i, s;
if (e < 2) return !1;
for (s = t[0], i = 1; i < e; ++i)
if (t[i] - t[i - 1] !== s) return !1;
return s;
})(t),
n = e.length / i;
if (!s) return Math.max(n, 1);
const o = At(s);
for (let t = 0, e = o.length - 1; t < e; t++) {
const e = o[t];
if (e > n) return e;
}
return Math.max(n, 1);
})(n, e, s);
if (o > 0) {
let t, i;
const s = o > 1 ? Math.round((r - a) / (o - 1)) : null;
for (Ts(e, l, h, $(s) ? 0 : a - s, a), t = 0, i = o - 1; t < i; t++)
Ts(e, l, h, n[t], n[t + 1]);
return Ts(e, l, h, r, $(s) ? e.length : r + s), l;
}
return Ts(e, l, h), l;
}
function Ts(t, e, i, s, n) {
const o = K(s, 0),
a = Math.min(K(n, t.length), t.length);
let r,
l,
h,
c = 0;
for (
i = Math.ceil(i), n && ((r = n - s), (i = r / Math.floor(r / i))), h = o;
h < 0;
)
c++, (h = Math.round(o + c * i));
for (l = Math.max(o, 0); l < a; l++)
l === h && (e.push(t[l]), c++, (h = Math.round(o + c * i)));
}
bt.set("scale", {
display: !0,
offset: !1,
reverse: !1,
beginAtZero: !1,
bounds: "ticks",
grace: 0,
grid: {
display: !0,
lineWidth: 1,
drawBorder: !0,
drawOnChartArea: !0,
drawTicks: !0,
tickLength: 8,
tickWidth: (t, e) => e.lineWidth,
tickColor: (t, e) => e.color,
offset: !1,
borderDash: [],
borderDashOffset: 0,
borderWidth: 1,
},
title: { display: !1, text: "", padding: { top: 4, bottom: 4 } },
ticks: {
minRotation: 0,
maxRotation: 50,
mirror: !1,
textStrokeWidth: 0,
textStrokeColor: "",
padding: 3,
display: !0,
autoSkip: !0,
autoSkipPadding: 3,
labelOffset: 0,
callback: Os.formatters.values,
minor: {},
major: {},
align: "center",
crossAlign: "near",
showLabelBackdrop: !1,
backdropColor: "rgba(255, 255, 255, 0.75)",
backdropPadding: 2,
},
}),
bt.route("scale.ticks", "color", "", "color"),
bt.route("scale.grid", "color", "", "borderColor"),
bt.route("scale.grid", "borderColor", "", "borderColor"),
bt.route("scale.title", "color", "", "color"),
bt.describe("scale", {
_fallback: !1,
_scriptable: (t) =>
!t.startsWith("before") &&
!t.startsWith("after") &&
"callback" !== t &&
"parser" !== t,
_indexable: (t) => "borderDash" !== t && "tickBorderDash" !== t,
}),
bt.describe("scales", { _fallback: "scale" }),
bt.describe("scale.ticks", {
_scriptable: (t) => "backdropPadding" !== t && "callback" !== t,
_indexable: (t) => "backdropPadding" !== t,
});
const Ls = (t, e, i) => ("top" === e || "left" === e ? t[e] + i : t[e] - i);
function Rs(t, e) {
const i = [],
s = t.length / e,
n = t.length;
let o = 0;
for (; o < n; o += s) i.push(t[Math.floor(o)]);
return i;
}
function Es(t, e, i) {
const s = t.ticks.length,
n = Math.min(e, s - 1),
o = t._startPixel,
a = t._endPixel,
r = 1e-6;
let l,
h = t.getPixelForTick(n);
if (
!(
i &&
((l =
1 === s
? Math.max(h - o, a - h)
: 0 === e
? (t.getPixelForTick(1) - h) / 2
: (h - t.getPixelForTick(n - 1)) / 2),
(h += n < e ? l : -l),
h < o - r || h > a + r)
)
)
return h;
}
function Is(t) {
return t.drawTicks ? t.tickLength : 0;
}
function zs(t, e) {
if (!t.display) return 0;
const i = He(t.font, e),
s = Ne(t.padding);
return (Y(t.text) ? t.text.length : 1) * i.lineHeight + s.height;
}
function Fs(t, e, i) {
let n = s(t);
return (
((i && "right" !== e) || (!i && "right" === e)) &&
(n = ((t) => ("left" === t ? "right" : "right" === t ? "left" : t))(n)),
n
);
}
class Bs extends Ds {
constructor(t) {
super(),
(this.id = t.id),
(this.type = t.type),
(this.options = void 0),
(this.ctx = t.ctx),
(this.chart = t.chart),
(this.top = void 0),
(this.bottom = void 0),
(this.left = void 0),
(this.right = void 0),
(this.width = void 0),
(this.height = void 0),
(this._margins = { left: 0, right: 0, top: 0, bottom: 0 }),
(this.maxWidth = void 0),
(this.maxHeight = void 0),
(this.paddingTop = void 0),
(this.paddingBottom = void 0),
(this.paddingLeft = void 0),
(this.paddingRight = void 0),
(this.axis = void 0),
(this.labelRotation = void 0),
(this.min = void 0),
(this.max = void 0),
(this._range = void 0),
(this.ticks = []),
(this._gridLineItems = null),
(this._labelItems = null),
(this._labelSizes = null),
(this._length = 0),
(this._maxLength = 0),
(this._longestTextCache = {}),
(this._startPixel = void 0),
(this._endPixel = void 0),
(this._reversePixels = !1),
(this._userMax = void 0),
(this._userMin = void 0),
(this._suggestedMax = void 0),
(this._suggestedMin = void 0),
(this._ticksLength = 0),
(this._borderValue = 0),
(this._cache = {}),
(this._dataLimitsCached = !1),
(this.$context = void 0);
}
init(t) {
(this.options = t.setContext(this.getContext())),
(this.axis = t.axis),
(this._userMin = this.parse(t.min)),
(this._userMax = this.parse(t.max)),
(this._suggestedMin = this.parse(t.suggestedMin)),
(this._suggestedMax = this.parse(t.suggestedMax));
}
parse(t, e) {
return t;
}
getUserBounds() {
let {
_userMin: t,
_userMax: e,
_suggestedMin: i,
_suggestedMax: s,
} = this;
return (
(t = q(t, Number.POSITIVE_INFINITY)),
(e = q(e, Number.NEGATIVE_INFINITY)),
(i = q(i, Number.POSITIVE_INFINITY)),
(s = q(s, Number.NEGATIVE_INFINITY)),
{ min: q(t, i), max: q(e, s), minDefined: X(t), maxDefined: X(e) }
);
}
getMinMax(t) {
let e,
{ min: i, max: s, minDefined: n, maxDefined: o } = this.getUserBounds();
if (n && o) return { min: i, max: s };
const a = this.getMatchingVisibleMetas();
for (let r = 0, l = a.length; r < l; ++r)
(e = a[r].controller.getMinMax(this, t)),
n || (i = Math.min(i, e.min)),
o || (s = Math.max(s, e.max));
return (
(i = o && i > s ? s : i),
(s = n && i > s ? i : s),
{ min: q(i, q(s, i)), max: q(s, q(i, s)) }
);
}
getPadding() {
return {
left: this.paddingLeft || 0,
top: this.paddingTop || 0,
right: this.paddingRight || 0,
bottom: this.paddingBottom || 0,
};
}
getTicks() {
return this.ticks;
}
getLabels() {
const t = this.chart.data;
return (
this.options.labels ||
(this.isHorizontal() ? t.xLabels : t.yLabels) ||
t.labels ||
[]
);
}
beforeLayout() {
(this._cache = {}), (this._dataLimitsCached = !1);
}
beforeUpdate() {
J(this.options.beforeUpdate, [this]);
}
update(t, e, i) {
const { beginAtZero: s, grace: n, ticks: o } = this.options,
a = o.sampleSize;
this.beforeUpdate(),
(this.maxWidth = t),
(this.maxHeight = e),
(this._margins = i =
Object.assign({ left: 0, right: 0, top: 0, bottom: 0 }, i)),
(this.ticks = null),
(this._labelSizes = null),
(this._gridLineItems = null),
(this._labelItems = null),
this.beforeSetDimensions(),
this.setDimensions(),
this.afterSetDimensions(),
(this._maxLength = this.isHorizontal()
? this.width + i.left + i.right
: this.height + i.top + i.bottom),
this._dataLimitsCached ||
(this.beforeDataLimits(),
this.determineDataLimits(),
this.afterDataLimits(),
(this._range = $e(this, n, s)),
(this._dataLimitsCached = !0)),
this.beforeBuildTicks(),
(this.ticks = this.buildTicks() || []),
this.afterBuildTicks();
const r = a < this.ticks.length;
this._convertTicksToLabels(r ? Rs(this.ticks, a) : this.ticks),
this.configure(),
this.beforeCalculateLabelRotation(),
this.calculateLabelRotation(),
this.afterCalculateLabelRotation(),
o.display &&
(o.autoSkip || "auto" === o.source) &&
((this.ticks = As(this, this.ticks)), (this._labelSizes = null)),
r && this._convertTicksToLabels(this.ticks),
this.beforeFit(),
this.fit(),
this.afterFit(),
this.afterUpdate();
}
configure() {
let t,
e,
i = this.options.reverse;
this.isHorizontal()
? ((t = this.left), (e = this.right))
: ((t = this.top), (e = this.bottom), (i = !i)),
(this._startPixel = t),
(this._endPixel = e),
(this._reversePixels = i),
(this._length = e - t),
(this._alignToPixels = this.options.alignToPixels);
}
afterUpdate() {
J(this.options.afterUpdate, [this]);
}
beforeSetDimensions() {
J(this.options.beforeSetDimensions, [this]);
}
setDimensions() {
this.isHorizontal()
? ((this.width = this.maxWidth),
(this.left = 0),
(this.right = this.width))
: ((this.height = this.maxHeight),
(this.top = 0),
(this.bottom = this.height)),
(this.paddingLeft = 0),
(this.paddingTop = 0),
(this.paddingRight = 0),
(this.paddingBottom = 0);
}
afterSetDimensions() {
J(this.options.afterSetDimensions, [this]);
}
_callHooks(t) {
this.chart.notifyPlugins(t, this.getContext()),
J(this.options[t], [this]);
}
beforeDataLimits() {
this._callHooks("beforeDataLimits");
}
determineDataLimits() {}
afterDataLimits() {
this._callHooks("afterDataLimits");
}
beforeBuildTicks() {
this._callHooks("beforeBuildTicks");
}
buildTicks() {
return [];
}
afterBuildTicks() {
this._callHooks("afterBuildTicks");
}
beforeTickToLabelConversion() {
J(this.options.beforeTickToLabelConversion, [this]);
}
generateTickLabels(t) {
const e = this.options.ticks;
let i, s, n;
for (i = 0, s = t.length; i < s; i++)
(n = t[i]), (n.label = J(e.callback, [n.value, i, t], this));
}
afterTickToLabelConversion() {
J(this.options.afterTickToLabelConversion, [this]);
}
beforeCalculateLabelRotation() {
J(this.options.beforeCalculateLabelRotation, [this]);
}
calculateLabelRotation() {
const t = this.options,
e = t.ticks,
i = this.ticks.length,
s = e.minRotation || 0,
n = e.maxRotation;
let o,
a,
r,
l = s;
if (
!this._isVisible() ||
!e.display ||
s >= n ||
i <= 1 ||
!this.isHorizontal()
)
return void (this.labelRotation = s);
const h = this._getLabelSizes(),
c = h.widest.width,
d = h.highest.height,
u = jt(this.chart.width - c, 0, this.maxWidth);
(o = t.offset ? this.maxWidth / i : u / (i - 1)),
c + 6 > o &&
((o = u / (i - (t.offset ? 0.5 : 1))),
(a =
this.maxHeight -
Is(t.grid) -
e.padding -
zs(t.title, this.chart.options.font)),
(r = Math.sqrt(c * c + d * d)),
(l = zt(
Math.min(
Math.asin(jt((h.highest.height + 6) / o, -1, 1)),
Math.asin(jt(a / r, -1, 1)) - Math.asin(jt(d / r, -1, 1))
)
)),
(l = Math.max(s, Math.min(n, l)))),
(this.labelRotation = l);
}
afterCalculateLabelRotation() {
J(this.options.afterCalculateLabelRotation, [this]);
}
beforeFit() {
J(this.options.beforeFit, [this]);
}
fit() {
const t = { width: 0, height: 0 },
{
chart: e,
options: { ticks: i, title: s, grid: n },
} = this,
o = this._isVisible(),
a = this.isHorizontal();
if (o) {
const o = zs(s, e.options.font);
if (
(a
? ((t.width = this.maxWidth), (t.height = Is(n) + o))
: ((t.height = this.maxHeight), (t.width = Is(n) + o)),
i.display && this.ticks.length)
) {
const {
first: e,
last: s,
widest: n,
highest: o,
} = this._getLabelSizes(),
r = 2 * i.padding,
l = It(this.labelRotation),
h = Math.cos(l),
c = Math.sin(l);
if (a) {
const e = i.mirror ? 0 : c * n.width + h * o.height;
t.height = Math.min(this.maxHeight, t.height + e + r);
} else {
const e = i.mirror ? 0 : h * n.width + c * o.height;
t.width = Math.min(this.maxWidth, t.width + e + r);
}
this._calculatePadding(e, s, c, h);
}
}
this._handleMargins(),
a
? ((this.width = this._length =
e.width - this._margins.left - this._margins.right),
(this.height = t.height))
: ((this.width = t.width),
(this.height = this._length =
e.height - this._margins.top - this._margins.bottom));
}
_calculatePadding(t, e, i, s) {
const {
ticks: { align: n, padding: o },
position: a,
} = this.options,
r = 0 !== this.labelRotation,
l = "top" !== a && "x" === this.axis;
if (this.isHorizontal()) {
const a = this.getPixelForTick(0) - this.left,
h = this.right - this.getPixelForTick(this.ticks.length - 1);
let c = 0,
d = 0;
r
? l
? ((c = s * t.width), (d = i * e.height))
: ((c = i * t.height), (d = s * e.width))
: "start" === n
? (d = e.width)
: "end" === n
? (c = t.width)
: ((c = t.width / 2), (d = e.width / 2)),
(this.paddingLeft = Math.max(
((c - a + o) * this.width) / (this.width - a),
0
)),
(this.paddingRight = Math.max(
((d - h + o) * this.width) / (this.width - h),
0
));
} else {
let i = e.height / 2,
s = t.height / 2;
"start" === n
? ((i = 0), (s = t.height))
: "end" === n && ((i = e.height), (s = 0)),
(this.paddingTop = i + o),
(this.paddingBottom = s + o);
}
}
_handleMargins() {
this._margins &&
((this._margins.left = Math.max(this.paddingLeft, this._margins.left)),
(this._margins.top = Math.max(this.paddingTop, this._margins.top)),
(this._margins.right = Math.max(
this.paddingRight,
this._margins.right
)),
(this._margins.bottom = Math.max(
this.paddingBottom,
this._margins.bottom
)));
}
afterFit() {
J(this.options.afterFit, [this]);
}
isHorizontal() {
const { axis: t, position: e } = this.options;
return "top" === e || "bottom" === e || "x" === t;
}
isFullSize() {
return this.options.fullSize;
}
_convertTicksToLabels(t) {
let e, i;
for (
this.beforeTickToLabelConversion(),
this.generateTickLabels(t),
e = 0,
i = t.length;
e < i;
e++
)
$(t[e].label) && (t.splice(e, 1), i--, e--);
this.afterTickToLabelConversion();
}
_getLabelSizes() {
let t = this._labelSizes;
if (!t) {
const e = this.options.ticks.sampleSize;
let i = this.ticks;
e < i.length && (i = Rs(i, e)),
(this._labelSizes = t = this._computeLabelSizes(i, i.length));
}
return t;
}
_computeLabelSizes(t, e) {
const { ctx: i, _longestTextCache: s } = this,
n = [],
o = [];
let a,
r,
l,
h,
c,
d,
u,
f,
g,
p,
m,
x = 0,
b = 0;
for (a = 0; a < e; ++a) {
if (
((h = t[a].label),
(c = this._resolveTickFontOptions(a)),
(i.font = d = c.string),
(u = s[d] = s[d] || { data: {}, gc: [] }),
(f = c.lineHeight),
(g = p = 0),
$(h) || Y(h))
) {
if (Y(h))
for (r = 0, l = h.length; r < l; ++r)
(m = h[r]),
$(m) || Y(m) || ((g = Xt(i, u.data, u.gc, g, m)), (p += f));
} else (g = Xt(i, u.data, u.gc, g, h)), (p = f);
n.push(g), o.push(p), (x = Math.max(g, x)), (b = Math.max(p, b));
}
!(function (t, e) {
Q(t, (t) => {
const i = t.gc,
s = i.length / 2;
let n;
if (s > e) {
for (n = 0; n < s; ++n) delete t.data[i[n]];
i.splice(0, s);
}
});
})(s, e);
const _ = n.indexOf(x),
y = o.indexOf(b),
v = (t) => ({ width: n[t] || 0, height: o[t] || 0 });
return {
first: v(0),
last: v(e - 1),
widest: v(_),
highest: v(y),
widths: n,
heights: o,
};
}
getLabelForValue(t) {
return t;
}
getPixelForValue(t, e) {
return NaN;
}
getValueForPixel(t) {}
getPixelForTick(t) {
const e = this.ticks;
return t < 0 || t > e.length - 1
? null
: this.getPixelForValue(e[t].value);
}
getPixelForDecimal(t) {
this._reversePixels && (t = 1 - t);
const e = this._startPixel + t * this._length;
return $t(this._alignToPixels ? Kt(this.chart, e, 0) : e);
}
getDecimalForPixel(t) {
const e = (t - this._startPixel) / this._length;
return this._reversePixels ? 1 - e : e;
}
getBasePixel() {
return this.getPixelForValue(this.getBaseValue());
}
getBaseValue() {
const { min: t, max: e } = this;
return t < 0 && e < 0 ? e : t > 0 && e > 0 ? t : 0;
}
getContext(t) {
const e = this.ticks || [];
if (t >= 0 && t < e.length) {
const i = e[t];
return (
i.$context ||
(i.$context = (function (t, e, i) {
return Ye(t, { tick: i, index: e, type: "tick" });
})(this.getContext(), t, i))
);
}
return (
this.$context ||
(this.$context = Ye(this.chart.getContext(), {
scale: this,
type: "scale",
}))
);
}
_tickSize() {
const t = this.options.ticks,
e = It(this.labelRotation),
i = Math.abs(Math.cos(e)),
s = Math.abs(Math.sin(e)),
n = this._getLabelSizes(),
o = t.autoSkipPadding || 0,
a = n ? n.widest.width + o : 0,
r = n ? n.highest.height + o : 0;
return this.isHorizontal()
? r * i > a * s
? a / i
: r / s
: r * s < a * i
? r / i
: a / s;
}
_isVisible() {
const t = this.options.display;
return "auto" !== t ? !!t : this.getMatchingVisibleMetas().length > 0;
}
_computeGridLineItems(t) {
const e = this.axis,
i = this.chart,
s = this.options,
{ grid: n, position: o } = s,
a = n.offset,
r = this.isHorizontal(),
l = this.ticks.length + (a ? 1 : 0),
h = Is(n),
c = [],
d = n.setContext(this.getContext()),
u = d.drawBorder ? d.borderWidth : 0,
f = u / 2,
g = function (t) {
return Kt(i, t, u);
};
let p, m, x, b, _, y, v, w, M, k, S, P;
if ("top" === o)
(p = g(this.bottom)),
(y = this.bottom - h),
(w = p - f),
(k = g(t.top) + f),
(P = t.bottom);
else if ("bottom" === o)
(p = g(this.top)),
(k = t.top),
(P = g(t.bottom) - f),
(y = p + f),
(w = this.top + h);
else if ("left" === o)
(p = g(this.right)),
(_ = this.right - h),
(v = p - f),
(M = g(t.left) + f),
(S = t.right);
else if ("right" === o)
(p = g(this.left)),
(M = t.left),
(S = g(t.right) - f),
(_ = p + f),
(v = this.left + h);
else if ("x" === e) {
if ("center" === o) p = g((t.top + t.bottom) / 2 + 0.5);
else if (U(o)) {
const t = Object.keys(o)[0],
e = o[t];
p = g(this.chart.scales[t].getPixelForValue(e));
}
(k = t.top), (P = t.bottom), (y = p + f), (w = y + h);
} else if ("y" === e) {
if ("center" === o) p = g((t.left + t.right) / 2);
else if (U(o)) {
const t = Object.keys(o)[0],
e = o[t];
p = g(this.chart.scales[t].getPixelForValue(e));
}
(_ = p - f), (v = _ - h), (M = t.left), (S = t.right);
}
const D = K(s.ticks.maxTicksLimit, l),
C = Math.max(1, Math.ceil(l / D));
for (m = 0; m < l; m += C) {
const t = n.setContext(this.getContext(m)),
e = t.lineWidth,
s = t.color,
o = n.borderDash || [],
l = t.borderDashOffset,
h = t.tickWidth,
d = t.tickColor,
u = t.tickBorderDash || [],
f = t.tickBorderDashOffset;
(x = Es(this, m, a)),
void 0 !== x &&
((b = Kt(i, x, e)),
r ? (_ = v = M = S = b) : (y = w = k = P = b),
c.push({
tx1: _,
ty1: y,
tx2: v,
ty2: w,
x1: M,
y1: k,
x2: S,
y2: P,
width: e,
color: s,
borderDash: o,
borderDashOffset: l,
tickWidth: h,
tickColor: d,
tickBorderDash: u,
tickBorderDashOffset: f,
}));
}
return (this._ticksLength = l), (this._borderValue = p), c;
}
_computeLabelItems(t) {
const e = this.axis,
i = this.options,
{ position: s, ticks: n } = i,
o = this.isHorizontal(),
a = this.ticks,
{ align: r, crossAlign: l, padding: h, mirror: c } = n,
d = Is(i.grid),
u = d + h,
f = c ? -h : u,
g = -It(this.labelRotation),
p = [];
let m,
x,
b,
_,
y,
v,
w,
M,
k,
S,
P,
D,
C = "middle";
if ("top" === s)
(v = this.bottom - f), (w = this._getXAxisLabelAlignment());
else if ("bottom" === s)
(v = this.top + f), (w = this._getXAxisLabelAlignment());
else if ("left" === s) {
const t = this._getYAxisLabelAlignment(d);
(w = t.textAlign), (y = t.x);
} else if ("right" === s) {
const t = this._getYAxisLabelAlignment(d);
(w = t.textAlign), (y = t.x);
} else if ("x" === e) {
if ("center" === s) v = (t.top + t.bottom) / 2 + u;
else if (U(s)) {
const t = Object.keys(s)[0],
e = s[t];
v = this.chart.scales[t].getPixelForValue(e) + u;
}
w = this._getXAxisLabelAlignment();
} else if ("y" === e) {
if ("center" === s) y = (t.left + t.right) / 2 - u;
else if (U(s)) {
const t = Object.keys(s)[0],
e = s[t];
y = this.chart.scales[t].getPixelForValue(e);
}
w = this._getYAxisLabelAlignment(d).textAlign;
}
"y" === e &&
("start" === r ? (C = "top") : "end" === r && (C = "bottom"));
const O = this._getLabelSizes();
for (m = 0, x = a.length; m < x; ++m) {
(b = a[m]), (_ = b.label);
const t = n.setContext(this.getContext(m));
(M = this.getPixelForTick(m) + n.labelOffset),
(k = this._resolveTickFontOptions(m)),
(S = k.lineHeight),
(P = Y(_) ? _.length : 1);
const e = P / 2,
i = t.color,
r = t.textStrokeColor,
h = t.textStrokeWidth;
let d;
if (
(o
? ((y = M),
(D =
"top" === s
? "near" === l || 0 !== g
? -P * S + S / 2
: "center" === l
? -O.highest.height / 2 - e * S + S
: -O.highest.height + S / 2
: "near" === l || 0 !== g
? S / 2
: "center" === l
? O.highest.height / 2 - e * S
: O.highest.height - P * S),
c && (D *= -1))
: ((v = M), (D = ((1 - P) * S) / 2)),
t.showLabelBackdrop)
) {
const e = Ne(t.backdropPadding),
i = O.heights[m],
s = O.widths[m];
let n = v + D - e.top,
o = y - e.left;
switch (C) {
case "middle":
n -= i / 2;
break;
case "bottom":
n -= i;
}
switch (w) {
case "center":
o -= s / 2;
break;
case "right":
o -= s;
}
d = {
left: o,
top: n,
width: s + e.width,
height: i + e.height,
color: t.backdropColor,
};
}
p.push({
rotation: g,
label: _,
font: k,
color: i,
strokeColor: r,
strokeWidth: h,
textOffset: D,
textAlign: w,
textBaseline: C,
translation: [y, v],
backdrop: d,
});
}
return p;
}
_getXAxisLabelAlignment() {
const { position: t, ticks: e } = this.options;
if (-It(this.labelRotation)) return "top" === t ? "left" : "right";
let i = "center";
return (
"start" === e.align ? (i = "left") : "end" === e.align && (i = "right"),
i
);
}
_getYAxisLabelAlignment(t) {
const {
position: e,
ticks: { crossAlign: i, mirror: s, padding: n },
} = this.options,
o = t + n,
a = this._getLabelSizes().widest.width;
let r, l;
return (
"left" === e
? s
? ((l = this.right + n),
"near" === i
? (r = "left")
: "center" === i
? ((r = "center"), (l += a / 2))
: ((r = "right"), (l += a)))
: ((l = this.right - o),
"near" === i
? (r = "right")
: "center" === i
? ((r = "center"), (l -= a / 2))
: ((r = "left"), (l = this.left)))
: "right" === e
? s
? ((l = this.left + n),
"near" === i
? (r = "right")
: "center" === i
? ((r = "center"), (l -= a / 2))
: ((r = "left"), (l -= a)))
: ((l = this.left + o),
"near" === i
? (r = "left")
: "center" === i
? ((r = "center"), (l += a / 2))
: ((r = "right"), (l = this.right)))
: (r = "right"),
{ textAlign: r, x: l }
);
}
_computeLabelArea() {
if (this.options.ticks.mirror) return;
const t = this.chart,
e = this.options.position;
return "left" === e || "right" === e
? { top: 0, left: this.left, bottom: t.height, right: this.right }
: "top" === e || "bottom" === e
? { top: this.top, left: 0, bottom: this.bottom, right: t.width }
: void 0;
}
drawBackground() {
const {
ctx: t,
options: { backgroundColor: e },
left: i,
top: s,
width: n,
height: o,
} = this;
e && (t.save(), (t.fillStyle = e), t.fillRect(i, s, n, o), t.restore());
}
getLineWidthForValue(t) {
const e = this.options.grid;
if (!this._isVisible() || !e.display) return 0;
const i = this.ticks.findIndex((e) => e.value === t);
if (i >= 0) {
return e.setContext(this.getContext(i)).lineWidth;
}
return 0;
}
drawGrid(t) {
const e = this.options.grid,
i = this.ctx,
s =
this._gridLineItems ||
(this._gridLineItems = this._computeGridLineItems(t));
let n, o;
const a = (t, e, s) => {
s.width &&
s.color &&
(i.save(),
(i.lineWidth = s.width),
(i.strokeStyle = s.color),
i.setLineDash(s.borderDash || []),
(i.lineDashOffset = s.borderDashOffset),
i.beginPath(),
i.moveTo(t.x, t.y),
i.lineTo(e.x, e.y),
i.stroke(),
i.restore());
};
if (e.display)
for (n = 0, o = s.length; n < o; ++n) {
const t = s[n];
e.drawOnChartArea && a({ x: t.x1, y: t.y1 }, { x: t.x2, y: t.y2 }, t),
e.drawTicks &&
a(
{ x: t.tx1, y: t.ty1 },
{ x: t.tx2, y: t.ty2 },
{
color: t.tickColor,
width: t.tickWidth,
borderDash: t.tickBorderDash,
borderDashOffset: t.tickBorderDashOffset,
}
);
}
}
drawBorder() {
const {
chart: t,
ctx: e,
options: { grid: i },
} = this,
s = i.setContext(this.getContext()),
n = i.drawBorder ? s.borderWidth : 0;
if (!n) return;
const o = i.setContext(this.getContext(0)).lineWidth,
a = this._borderValue;
let r, l, h, c;
this.isHorizontal()
? ((r = Kt(t, this.left, n) - n / 2),
(l = Kt(t, this.right, o) + o / 2),
(h = c = a))
: ((h = Kt(t, this.top, n) - n / 2),
(c = Kt(t, this.bottom, o) + o / 2),
(r = l = a)),
e.save(),
(e.lineWidth = s.borderWidth),
(e.strokeStyle = s.borderColor),
e.beginPath(),
e.moveTo(r, h),
e.lineTo(l, c),
e.stroke(),
e.restore();
}
drawLabels(t) {
if (!this.options.ticks.display) return;
const e = this.ctx,
i = this._computeLabelArea();
i && Qt(e, i);
const s =
this._labelItems || (this._labelItems = this._computeLabelItems(t));
let n, o;
for (n = 0, o = s.length; n < o; ++n) {
const t = s[n],
i = t.font,
o = t.label;
t.backdrop &&
((e.fillStyle = t.backdrop.color),
e.fillRect(
t.backdrop.left,
t.backdrop.top,
t.backdrop.width,
t.backdrop.height
)),
se(e, o, 0, t.textOffset, i, t);
}
i && te(e);
}
drawTitle() {
const {
ctx: t,
options: { position: e, title: i, reverse: s },
} = this;
if (!i.display) return;
const o = He(i.font),
a = Ne(i.padding),
r = i.align;
let l = o.lineHeight / 2;
"bottom" === e || "center" === e || U(e)
? ((l += a.bottom),
Y(i.text) && (l += o.lineHeight * (i.text.length - 1)))
: (l += a.top);
const {
titleX: h,
titleY: c,
maxWidth: d,
rotation: u,
} = (function (t, e, i, s) {
const { top: o, left: a, bottom: r, right: l, chart: h } = t,
{ chartArea: c, scales: d } = h;
let u,
f,
g,
p = 0;
const m = r - o,
x = l - a;
if (t.isHorizontal()) {
if (((f = n(s, a, l)), U(i))) {
const t = Object.keys(i)[0],
s = i[t];
g = d[t].getPixelForValue(s) + m - e;
} else
g = "center" === i ? (c.bottom + c.top) / 2 + m - e : Ls(t, i, e);
u = l - a;
} else {
if (U(i)) {
const t = Object.keys(i)[0],
s = i[t];
f = d[t].getPixelForValue(s) - x + e;
} else
f = "center" === i ? (c.left + c.right) / 2 - x + e : Ls(t, i, e);
(g = n(s, r, o)), (p = "left" === i ? -kt : kt);
}
return { titleX: f, titleY: g, maxWidth: u, rotation: p };
})(this, l, e, r);
se(t, i.text, 0, 0, o, {
color: i.color,
maxWidth: d,
rotation: u,
textAlign: Fs(r, e, s),
textBaseline: "middle",
translation: [h, c],
});
}
draw(t) {
this._isVisible() &&
(this.drawBackground(),
this.drawGrid(t),
this.drawBorder(),
this.drawTitle(),
this.drawLabels(t));
}
_layers() {
const t = this.options,
e = (t.ticks && t.ticks.z) || 0,
i = K(t.grid && t.grid.z, -1);
return this._isVisible() && this.draw === Bs.prototype.draw
? [
{
z: i,
draw: (t) => {
this.drawBackground(), this.drawGrid(t), this.drawTitle();
},
},
{
z: i + 1,
draw: () => {
this.drawBorder();
},
},
{
z: e,
draw: (t) => {
this.drawLabels(t);
},
},
]
: [
{
z: e,
draw: (t) => {
this.draw(t);
},
},
];
}
getMatchingVisibleMetas(t) {
const e = this.chart.getSortedVisibleDatasetMetas(),
i = this.axis + "AxisID",
s = [];
let n, o;
for (n = 0, o = e.length; n < o; ++n) {
const o = e[n];
o[i] !== this.id || (t && o.type !== t) || s.push(o);
}
return s;
}
_resolveTickFontOptions(t) {
return He(this.options.ticks.setContext(this.getContext(t)).font);
}
_maxDigits() {
const t = this._resolveTickFontOptions(0).lineHeight;
return (this.isHorizontal() ? this.width : this.height) / t;
}
}
class Vs {
constructor(t, e, i) {
(this.type = t),
(this.scope = e),
(this.override = i),
(this.items = Object.create(null));
}
isForType(t) {
return Object.prototype.isPrototypeOf.call(
this.type.prototype,
t.prototype
);
}
register(t) {
const e = Object.getPrototypeOf(t);
let i;
(function (t) {
return "id" in t && "defaults" in t;
})(e) && (i = this.register(e));
const s = this.items,
n = t.id,
o = this.scope + "." + n;
if (!n) throw new Error("class does not have id: " + t);
return (
n in s ||
((s[n] = t),
(function (t, e, i) {
const s = nt(Object.create(null), [
i ? bt.get(i) : {},
bt.get(e),
t.defaults,
]);
bt.set(e, s),
t.defaultRoutes &&
(function (t, e) {
Object.keys(e).forEach((i) => {
const s = i.split("."),
n = s.pop(),
o = [t].concat(s).join("."),
a = e[i].split("."),
r = a.pop(),
l = a.join(".");
bt.route(o, n, l, r);
});
})(e, t.defaultRoutes);
t.descriptors && bt.describe(e, t.descriptors);
})(t, o, i),
this.override && bt.override(t.id, t.overrides)),
o
);
}
get(t) {
return this.items[t];
}
unregister(t) {
const e = this.items,
i = t.id,
s = this.scope;
i in e && delete e[i],
s && i in bt[s] && (delete bt[s][i], this.override && delete gt[i]);
}
}
var Ws = new (class {
constructor() {
(this.controllers = new Vs(Ps, "datasets", !0)),
(this.elements = new Vs(Ds, "elements")),
(this.plugins = new Vs(Object, "plugins")),
(this.scales = new Vs(Bs, "scales")),
(this._typedRegistries = [
this.controllers,
this.scales,
this.elements,
]);
}
add(...t) {
this._each("register", t);
}
remove(...t) {
this._each("unregister", t);
}
addControllers(...t) {
this._each("register", t, this.controllers);
}
addElements(...t) {
this._each("register", t, this.elements);
}
addPlugins(...t) {
this._each("register", t, this.plugins);
}
addScales(...t) {
this._each("register", t, this.scales);
}
getController(t) {
return this._get(t, this.controllers, "controller");
}
getElement(t) {
return this._get(t, this.elements, "element");
}
getPlugin(t) {
return this._get(t, this.plugins, "plugin");
}
getScale(t) {
return this._get(t, this.scales, "scale");
}
removeControllers(...t) {
this._each("unregister", t, this.controllers);
}
removeElements(...t) {
this._each("unregister", t, this.elements);
}
removePlugins(...t) {
this._each("unregister", t, this.plugins);
}
removeScales(...t) {
this._each("unregister", t, this.scales);
}
_each(t, e, i) {
[...e].forEach((e) => {
const s = i || this._getRegistryForType(e);
i || s.isForType(e) || (s === this.plugins && e.id)
? this._exec(t, s, e)
: Q(e, (e) => {
const s = i || this._getRegistryForType(e);
this._exec(t, s, e);
});
});
}
_exec(t, e, i) {
const s = ht(t);
J(i["before" + s], [], i), e[t](i), J(i["after" + s], [], i);
}
_getRegistryForType(t) {
for (let e = 0; e < this._typedRegistries.length; e++) {
const i = this._typedRegistries[e];
if (i.isForType(t)) return i;
}
return this.plugins;
}
_get(t, e, i) {
const s = e.get(t);
if (void 0 === s)
throw new Error('"' + t + '" is not a registered ' + i + ".");
return s;
}
})();
class Ns {
constructor() {
this._init = [];
}
notify(t, e, i, s) {
"beforeInit" === e &&
((this._init = this._createDescriptors(t, !0)),
this._notify(this._init, t, "install"));
const n = s ? this._descriptors(t).filter(s) : this._descriptors(t),
o = this._notify(n, t, e, i);
return (
"afterDestroy" === e &&
(this._notify(n, t, "stop"),
this._notify(this._init, t, "uninstall")),
o
);
}
_notify(t, e, i, s) {
s = s || {};
for (const n of t) {
const t = n.plugin;
if (!1 === J(t[i], [e, s, n.options], t) && s.cancelable) return !1;
}
return !0;
}
invalidate() {
$(this._cache) ||
((this._oldCache = this._cache), (this._cache = void 0));
}
_descriptors(t) {
if (this._cache) return this._cache;
const e = (this._cache = this._createDescriptors(t));
return this._notifyStateChanges(t), e;
}
_createDescriptors(t, e) {
const i = t && t.config,
s = K(i.options && i.options.plugins, {}),
n = (function (t) {
const e = [],
i = Object.keys(Ws.plugins.items);
for (let t = 0; t < i.length; t++) e.push(Ws.getPlugin(i[t]));
const s = t.plugins || [];
for (let t = 0; t < s.length; t++) {
const i = s[t];
-1 === e.indexOf(i) && e.push(i);
}
return e;
})(i);
return !1 !== s || e
? (function (t, e, i, s) {
const n = [],
o = t.getContext();
for (let a = 0; a < e.length; a++) {
const r = e[a],
l = Hs(i[r.id], s);
null !== l &&
n.push({ plugin: r, options: js(t.config, r, l, o) });
}
return n;
})(t, n, s, e)
: [];
}
_notifyStateChanges(t) {
const e = this._oldCache || [],
i = this._cache,
s = (t, e) =>
t.filter((t) => !e.some((e) => t.plugin.id === e.plugin.id));
this._notify(s(e, i), t, "stop"), this._notify(s(i, e), t, "start");
}
}
function Hs(t, e) {
return e || !1 !== t ? (!0 === t ? {} : t) : null;
}
function js(t, e, i, s) {
const n = t.pluginScopeKeys(e),
o = t.getOptionScopes(i, n);
return t.createResolver(o, s, [""], {
scriptable: !1,
indexable: !1,
allKeys: !0,
});
}
function $s(t, e) {
const i = bt.datasets[t] || {};
return (
((e.datasets || {})[t] || {}).indexAxis ||
e.indexAxis ||
i.indexAxis ||
"x"
);
}
function Ys(t, e) {
return "x" === t || "y" === t
? t
: e.axis ||
("top" === (i = e.position) || "bottom" === i
? "x"
: "left" === i || "right" === i
? "y"
: void 0) ||
t.charAt(0).toLowerCase();
var i;
}
function Us(t) {
const e = t.options || (t.options = {});
(e.plugins = K(e.plugins, {})),
(e.scales = (function (t, e) {
const i = gt[t.type] || { scales: {} },
s = e.scales || {},
n = $s(t.type, e),
o = Object.create(null),
a = Object.create(null);
return (
Object.keys(s).forEach((t) => {
const e = s[t];
if (!U(e))
return console.error(
`Invalid scale configuration for scale: ${t}`
);
if (e._proxy)
return console.warn(
`Ignoring resolver passed as options for scale: ${t}`
);
const r = Ys(t, e),
l = (function (t, e) {
return t === e ? "_index_" : "_value_";
})(r, n),
h = i.scales || {};
(o[r] = o[r] || t),
(a[t] = ot(Object.create(null), [{ axis: r }, e, h[r], h[l]]));
}),
t.data.datasets.forEach((i) => {
const n = i.type || t.type,
r = i.indexAxis || $s(n, e),
l = (gt[n] || {}).scales || {};
Object.keys(l).forEach((t) => {
const e = (function (t, e) {
let i = t;
return (
"_index_" === t
? (i = e)
: "_value_" === t && (i = "x" === e ? "y" : "x"),
i
);
})(t, r),
n = i[e + "AxisID"] || o[e] || e;
(a[n] = a[n] || Object.create(null)),
ot(a[n], [{ axis: e }, s[n], l[t]]);
});
}),
Object.keys(a).forEach((t) => {
const e = a[t];
ot(e, [bt.scales[e.type], bt.scale]);
}),
a
);
})(t, e));
}
function Xs(t) {
return (
((t = t || {}).datasets = t.datasets || []),
(t.labels = t.labels || []),
t
);
}
const qs = new Map(),
Ks = new Set();
function Gs(t, e) {
let i = qs.get(t);
return i || ((i = e()), qs.set(t, i), Ks.add(i)), i;
}
const Zs = (t, e, i) => {
const s = lt(e, i);
void 0 !== s && t.add(s);
};
class Js {
constructor(t) {
(this._config = (function (t) {
return ((t = t || {}).data = Xs(t.data)), Us(t), t;
})(t)),
(this._scopeCache = new Map()),
(this._resolverCache = new Map());
}
get platform() {
return this._config.platform;
}
get type() {
return this._config.type;
}
set type(t) {
this._config.type = t;
}
get data() {
return this._config.data;
}
set data(t) {
this._config.data = Xs(t);
}
get options() {
return this._config.options;
}
set options(t) {
this._config.options = t;
}
get plugins() {
return this._config.plugins;
}
update() {
const t = this._config;
this.clearCache(), Us(t);
}
clearCache() {
this._scopeCache.clear(), this._resolverCache.clear();
}
datasetScopeKeys(t) {
return Gs(t, () => [[`datasets.${t}`, ""]]);
}
datasetAnimationScopeKeys(t, e) {
return Gs(`${t}.transition.${e}`, () => [
[`datasets.${t}.transitions.${e}`, `transitions.${e}`],
[`datasets.${t}`, ""],
]);
}
datasetElementScopeKeys(t, e) {
return Gs(`${t}-${e}`, () => [
[`datasets.${t}.elements.${e}`, `datasets.${t}`, `elements.${e}`, ""],
]);
}
pluginScopeKeys(t) {
const e = t.id;
return Gs(`${this.type}-plugin-${e}`, () => [
[`plugins.${e}`, ...(t.additionalOptionScopes || [])],
]);
}
_cachedScopes(t, e) {
const i = this._scopeCache;
let s = i.get(t);
return (s && !e) || ((s = new Map()), i.set(t, s)), s;
}
getOptionScopes(t, e, i) {
const { options: s, type: n } = this,
o = this._cachedScopes(t, i),
a = o.get(e);
if (a) return a;
const r = new Set();
e.forEach((e) => {
t && (r.add(t), e.forEach((e) => Zs(r, t, e))),
e.forEach((t) => Zs(r, s, t)),
e.forEach((t) => Zs(r, gt[n] || {}, t)),
e.forEach((t) => Zs(r, bt, t)),
e.forEach((t) => Zs(r, pt, t));
});
const l = Array.from(r);
return (
0 === l.length && l.push(Object.create(null)),
Ks.has(e) && o.set(e, l),
l
);
}
chartOptionScopes() {
const { options: t, type: e } = this;
return [t, gt[e] || {}, bt.datasets[e] || {}, { type: e }, bt, pt];
}
resolveNamedOptions(t, e, i, s = [""]) {
const n = { $shared: !0 },
{ resolver: o, subPrefixes: a } = Qs(this._resolverCache, t, s);
let r = o;
if (
(function (t, e) {
const { isScriptable: i, isIndexable: s } = ri(t);
for (const n of e) {
const e = i(n),
o = s(n),
a = (o || e) && t[n];
if ((e && (dt(a) || tn(a))) || (o && Y(a))) return !0;
}
return !1;
})(o, e)
) {
n.$shared = !1;
r = ai(o, (i = dt(i) ? i() : i), this.createResolver(t, i, a));
}
for (const t of e) n[t] = r[t];
return n;
}
createResolver(t, e, i = [""], s) {
const { resolver: n } = Qs(this._resolverCache, t, i);
return U(e) ? ai(n, e, void 0, s) : n;
}
}
function Qs(t, e, i) {
let s = t.get(e);
s || ((s = new Map()), t.set(e, s));
const n = i.join();
let o = s.get(n);
if (!o) {
(o = {
resolver: oi(e, i),
subPrefixes: i.filter((t) => !t.toLowerCase().includes("hover")),
}),
s.set(n, o);
}
return o;
}
const tn = (t) =>
U(t) && Object.getOwnPropertyNames(t).reduce((e, i) => e || dt(t[i]), !1);
const en = ["top", "bottom", "left", "right", "chartArea"];
function sn(t, e) {
return "top" === t || "bottom" === t || (-1 === en.indexOf(t) && "x" === e);
}
function nn(t, e) {
return function (i, s) {
return i[t] === s[t] ? i[e] - s[e] : i[t] - s[t];
};
}
function on(t) {
const e = t.chart,
i = e.options.animation;
e.notifyPlugins("afterRender"), J(i && i.onComplete, [t], e);
}
function an(t) {
const e = t.chart,
i = e.options.animation;
J(i && i.onProgress, [t], e);
}
function rn(t) {
return (
ge() && "string" == typeof t
? (t = document.getElementById(t))
: t && t.length && (t = t[0]),
t && t.canvas && (t = t.canvas),
t
);
}
const ln = {},
hn = (t) => {
const e = rn(t);
return Object.values(ln)
.filter((t) => t.canvas === e)
.pop();
};
function cn(t, e, i) {
const s = Object.keys(t);
for (const n of s) {
const s = +n;
if (s >= e) {
const o = t[n];
delete t[n], (i > 0 || s > e) && (t[s + i] = o);
}
}
}
class dn {
constructor(t, e) {
const s = (this.config = new Js(e)),
n = rn(t),
o = hn(n);
if (o)
throw new Error(
"Canvas is already in use. Chart with ID '" +
o.id +
"' must be destroyed before the canvas can be reused."
);
const r = s.createResolver(s.chartOptionScopes(), this.getContext());
(this.platform = new (s.platform || ls(n))()),
this.platform.updateConfig(s);
const l = this.platform.acquireContext(n, r.aspectRatio),
h = l && l.canvas,
c = h && h.height,
d = h && h.width;
(this.id = j()),
(this.ctx = l),
(this.canvas = h),
(this.width = d),
(this.height = c),
(this._options = r),
(this._aspectRatio = this.aspectRatio),
(this._layers = []),
(this._metasets = []),
(this._stacks = void 0),
(this.boxes = []),
(this.currentDevicePixelRatio = void 0),
(this.chartArea = void 0),
(this._active = []),
(this._lastEvent = void 0),
(this._listeners = {}),
(this._responsiveListeners = void 0),
(this._sortedMetasets = []),
(this.scales = {}),
(this._plugins = new Ns()),
(this.$proxies = {}),
(this._hiddenIndices = {}),
(this.attached = !1),
(this._animationsDisabled = void 0),
(this.$context = void 0),
(this._doResize = i((t) => this.update(t), r.resizeDelay || 0)),
(this._dataChanges = []),
(ln[this.id] = this),
l && h
? (a.listen(this, "complete", on),
a.listen(this, "progress", an),
this._initialize(),
this.attached && this.update())
: console.error(
"Failed to create chart: can't acquire context from the given item"
);
}
get aspectRatio() {
const {
options: { aspectRatio: t, maintainAspectRatio: e },
width: i,
height: s,
_aspectRatio: n,
} = this;
return $(t) ? (e && n ? n : s ? i / s : null) : t;
}
get data() {
return this.config.data;
}
set data(t) {
this.config.data = t;
}
get options() {
return this._options;
}
set options(t) {
this.config.options = t;
}
_initialize() {
return (
this.notifyPlugins("beforeInit"),
this.options.responsive
? this.resize()
: ke(this, this.options.devicePixelRatio),
this.bindEvents(),
this.notifyPlugins("afterInit"),
this
);
}
clear() {
return Gt(this.canvas, this.ctx), this;
}
stop() {
return a.stop(this), this;
}
resize(t, e) {
a.running(this)
? (this._resizeBeforeDraw = { width: t, height: e })
: this._resize(t, e);
}
_resize(t, e) {
const i = this.options,
s = this.canvas,
n = i.maintainAspectRatio && this.aspectRatio,
o = this.platform.getMaximumSize(s, t, e, n),
a = i.devicePixelRatio || this.platform.getDevicePixelRatio(),
r = this.width ? "resize" : "attach";
(this.width = o.width),
(this.height = o.height),
(this._aspectRatio = this.aspectRatio),
ke(this, a, !0) &&
(this.notifyPlugins("resize", { size: o }),
J(i.onResize, [this, o], this),
this.attached && this._doResize(r) && this.render());
}
ensureScalesHaveIDs() {
Q(this.options.scales || {}, (t, e) => {
t.id = e;
});
}
buildOrUpdateScales() {
const t = this.options,
e = t.scales,
i = this.scales,
s = Object.keys(i).reduce((t, e) => ((t[e] = !1), t), {});
let n = [];
e &&
(n = n.concat(
Object.keys(e).map((t) => {
const i = e[t],
s = Ys(t, i),
n = "r" === s,
o = "x" === s;
return {
options: i,
dposition: n ? "chartArea" : o ? "bottom" : "left",
dtype: n ? "radialLinear" : o ? "category" : "linear",
};
})
)),
Q(n, (e) => {
const n = e.options,
o = n.id,
a = Ys(o, n),
r = K(n.type, e.dtype);
(void 0 !== n.position && sn(n.position, a) === sn(e.dposition)) ||
(n.position = e.dposition),
(s[o] = !0);
let l = null;
if (o in i && i[o].type === r) l = i[o];
else {
(l = new (Ws.getScale(r))({
id: o,
type: r,
ctx: this.ctx,
chart: this,
})),
(i[l.id] = l);
}
l.init(n, t);
}),
Q(s, (t, e) => {
t || delete i[e];
}),
Q(i, (t) => {
ni.configure(this, t, t.options), ni.addBox(this, t);
});
}
_updateMetasets() {
const t = this._metasets,
e = this.data.datasets.length,
i = t.length;
if ((t.sort((t, e) => t.index - e.index), i > e)) {
for (let t = e; t < i; ++t) this._destroyDatasetMeta(t);
t.splice(e, i - e);
}
this._sortedMetasets = t.slice(0).sort(nn("order", "index"));
}
_removeUnreferencedMetasets() {
const {
_metasets: t,
data: { datasets: e },
} = this;
t.length > e.length && delete this._stacks,
t.forEach((t, i) => {
0 === e.filter((e) => e === t._dataset).length &&
this._destroyDatasetMeta(i);
});
}
buildOrUpdateControllers() {
const t = [],
e = this.data.datasets;
let i, s;
for (
this._removeUnreferencedMetasets(), i = 0, s = e.length;
i < s;
i++
) {
const s = e[i];
let n = this.getDatasetMeta(i);
const o = s.type || this.config.type;
if (
(n.type &&
n.type !== o &&
(this._destroyDatasetMeta(i), (n = this.getDatasetMeta(i))),
(n.type = o),
(n.indexAxis = s.indexAxis || $s(o, this.options)),
(n.order = s.order || 0),
(n.index = i),
(n.label = "" + s.label),
(n.visible = this.isDatasetVisible(i)),
n.controller)
)
n.controller.updateIndex(i), n.controller.linkScales();
else {
const e = Ws.getController(o),
{ datasetElementType: s, dataElementType: a } = bt.datasets[o];
Object.assign(e.prototype, {
dataElementType: Ws.getElement(a),
datasetElementType: s && Ws.getElement(s),
}),
(n.controller = new e(this, i)),
t.push(n.controller);
}
}
return this._updateMetasets(), t;
}
_resetElements() {
Q(
this.data.datasets,
(t, e) => {
this.getDatasetMeta(e).controller.reset();
},
this
);
}
reset() {
this._resetElements(), this.notifyPlugins("reset");
}
update(t) {
const e = this.config;
e.update();
const i = (this._options = e.createResolver(
e.chartOptionScopes(),
this.getContext()
)),
s = (this._animationsDisabled = !i.animation);
if (
(this._updateScales(),
this._checkEventBindings(),
this._updateHiddenIndices(),
this._plugins.invalidate(),
!1 === this.notifyPlugins("beforeUpdate", { mode: t, cancelable: !0 }))
)
return;
const n = this.buildOrUpdateControllers();
this.notifyPlugins("beforeElementsUpdate");
let o = 0;
for (let t = 0, e = this.data.datasets.length; t < e; t++) {
const { controller: e } = this.getDatasetMeta(t),
i = !s && -1 === n.indexOf(e);
e.buildOrUpdateElements(i), (o = Math.max(+e.getMaxOverflow(), o));
}
(o = this._minPadding = i.layout.autoPadding ? o : 0),
this._updateLayout(o),
s ||
Q(n, (t) => {
t.reset();
}),
this._updateDatasets(t),
this.notifyPlugins("afterUpdate", { mode: t }),
this._layers.sort(nn("z", "_idx"));
const { _active: a, _lastEvent: r } = this;
r
? this._eventHandler(r, !0)
: a.length && this._updateHoverStyles(a, a, !0),
this.render();
}
_updateScales() {
Q(this.scales, (t) => {
ni.removeBox(this, t);
}),
this.ensureScalesHaveIDs(),
this.buildOrUpdateScales();
}
_checkEventBindings() {
const t = this.options,
e = new Set(Object.keys(this._listeners)),
i = new Set(t.events);
(ut(e, i) && !!this._responsiveListeners === t.responsive) ||
(this.unbindEvents(), this.bindEvents());
}
_updateHiddenIndices() {
const { _hiddenIndices: t } = this,
e = this._getUniformDataChanges() || [];
for (const { method: i, start: s, count: n } of e) {
cn(t, s, "_removeElements" === i ? -n : n);
}
}
_getUniformDataChanges() {
const t = this._dataChanges;
if (!t || !t.length) return;
this._dataChanges = [];
const e = this.data.datasets.length,
i = (e) =>
new Set(
t
.filter((t) => t[0] === e)
.map((t, e) => e + "," + t.splice(1).join(","))
),
s = i(0);
for (let t = 1; t < e; t++) if (!ut(s, i(t))) return;
return Array.from(s)
.map((t) => t.split(","))
.map((t) => ({ method: t[1], start: +t[2], count: +t[3] }));
}
_updateLayout(t) {
if (!1 === this.notifyPlugins("beforeLayout", { cancelable: !0 })) return;
ni.update(this, this.width, this.height, t);
const e = this.chartArea,
i = e.width <= 0 || e.height <= 0;
(this._layers = []),
Q(
this.boxes,
(t) => {
(i && "chartArea" === t.position) ||
(t.configure && t.configure(), this._layers.push(...t._layers()));
},
this
),
this._layers.forEach((t, e) => {
t._idx = e;
}),
this.notifyPlugins("afterLayout");
}
_updateDatasets(t) {
if (
!1 !==
this.notifyPlugins("beforeDatasetsUpdate", { mode: t, cancelable: !0 })
) {
for (let t = 0, e = this.data.datasets.length; t < e; ++t)
this.getDatasetMeta(t).controller.configure();
for (let e = 0, i = this.data.datasets.length; e < i; ++e)
this._updateDataset(e, dt(t) ? t({ datasetIndex: e }) : t);
this.notifyPlugins("afterDatasetsUpdate", { mode: t });
}
}
_updateDataset(t, e) {
const i = this.getDatasetMeta(t),
s = { meta: i, index: t, mode: e, cancelable: !0 };
!1 !== this.notifyPlugins("beforeDatasetUpdate", s) &&
(i.controller._update(e),
(s.cancelable = !1),
this.notifyPlugins("afterDatasetUpdate", s));
}
render() {
!1 !== this.notifyPlugins("beforeRender", { cancelable: !0 }) &&
(a.has(this)
? this.attached && !a.running(this) && a.start(this)
: (this.draw(), on({ chart: this })));
}
draw() {
let t;
if (this._resizeBeforeDraw) {
const { width: t, height: e } = this._resizeBeforeDraw;
this._resize(t, e), (this._resizeBeforeDraw = null);
}
if ((this.clear(), this.width <= 0 || this.height <= 0)) return;
if (!1 === this.notifyPlugins("beforeDraw", { cancelable: !0 })) return;
const e = this._layers;
for (t = 0; t < e.length && e[t].z <= 0; ++t) e[t].draw(this.chartArea);
for (this._drawDatasets(); t < e.length; ++t) e[t].draw(this.chartArea);
this.notifyPlugins("afterDraw");
}
_getSortedDatasetMetas(t) {
const e = this._sortedMetasets,
i = [];
let s, n;
for (s = 0, n = e.length; s < n; ++s) {
const n = e[s];
(t && !n.visible) || i.push(n);
}
return i;
}
getSortedVisibleDatasetMetas() {
return this._getSortedDatasetMetas(!0);
}
_drawDatasets() {
if (!1 === this.notifyPlugins("beforeDatasetsDraw", { cancelable: !0 }))
return;
const t = this.getSortedVisibleDatasetMetas();
for (let e = t.length - 1; e >= 0; --e) this._drawDataset(t[e]);
this.notifyPlugins("afterDatasetsDraw");
}
_drawDataset(t) {
const e = this.ctx,
i = t._clip,
s = !i.disabled,
n = this.chartArea,
o = { meta: t, index: t.index, cancelable: !0 };
!1 !== this.notifyPlugins("beforeDatasetDraw", o) &&
(s &&
Qt(e, {
left: !1 === i.left ? 0 : n.left - i.left,
right: !1 === i.right ? this.width : n.right + i.right,
top: !1 === i.top ? 0 : n.top - i.top,
bottom: !1 === i.bottom ? this.height : n.bottom + i.bottom,
}),
t.controller.draw(),
s && te(e),
(o.cancelable = !1),
this.notifyPlugins("afterDatasetDraw", o));
}
getElementsAtEventForMode(t, e, i, s) {
const n = Ee.modes[e];
return "function" == typeof n ? n(this, t, i, s) : [];
}
getDatasetMeta(t) {
const e = this.data.datasets[t],
i = this._metasets;
let s = i.filter((t) => t && t._dataset === e).pop();
return (
s ||
((s = {
type: null,
data: [],
dataset: null,
controller: null,
hidden: null,
xAxisID: null,
yAxisID: null,
order: (e && e.order) || 0,
index: t,
_dataset: e,
_parsed: [],
_sorted: !1,
}),
i.push(s)),
s
);
}
getContext() {
return (
this.$context ||
(this.$context = Ye(null, { chart: this, type: "chart" }))
);
}
getVisibleDatasetCount() {
return this.getSortedVisibleDatasetMetas().length;
}
isDatasetVisible(t) {
const e = this.data.datasets[t];
if (!e) return !1;
const i = this.getDatasetMeta(t);
return "boolean" == typeof i.hidden ? !i.hidden : !e.hidden;
}
setDatasetVisibility(t, e) {
this.getDatasetMeta(t).hidden = !e;
}
toggleDataVisibility(t) {
this._hiddenIndices[t] = !this._hiddenIndices[t];
}
getDataVisibility(t) {
return !this._hiddenIndices[t];
}
_updateVisibility(t, e, i) {
const s = i ? "show" : "hide",
n = this.getDatasetMeta(t),
o = n.controller._resolveAnimations(void 0, s);
ct(e)
? ((n.data[e].hidden = !i), this.update())
: (this.setDatasetVisibility(t, i),
o.update(n, { visible: i }),
this.update((e) => (e.datasetIndex === t ? s : void 0)));
}
hide(t, e) {
this._updateVisibility(t, e, !1);
}
show(t, e) {
this._updateVisibility(t, e, !0);
}
_destroyDatasetMeta(t) {
const e = this._metasets[t];
e && e.controller && e.controller._destroy(), delete this._metasets[t];
}
_stop() {
let t, e;
for (
this.stop(), a.remove(this), t = 0, e = this.data.datasets.length;
t < e;
++t
)
this._destroyDatasetMeta(t);
}
destroy() {
this.notifyPlugins("beforeDestroy");
const { canvas: t, ctx: e } = this;
this._stop(),
this.config.clearCache(),
t &&
(this.unbindEvents(),
Gt(t, e),
this.platform.releaseContext(e),
(this.canvas = null),
(this.ctx = null)),
this.notifyPlugins("destroy"),
delete ln[this.id],
this.notifyPlugins("afterDestroy");
}
toBase64Image(...t) {
return this.canvas.toDataURL(...t);
}
bindEvents() {
this.bindUserEvents(),
this.options.responsive
? this.bindResponsiveEvents()
: (this.attached = !0);
}
bindUserEvents() {
const t = this._listeners,
e = this.platform,
i = (i, s) => {
e.addEventListener(this, i, s), (t[i] = s);
},
s = (t, e, i) => {
(t.offsetX = e), (t.offsetY = i), this._eventHandler(t);
};
Q(this.options.events, (t) => i(t, s));
}
bindResponsiveEvents() {
this._responsiveListeners || (this._responsiveListeners = {});
const t = this._responsiveListeners,
e = this.platform,
i = (i, s) => {
e.addEventListener(this, i, s), (t[i] = s);
},
s = (i, s) => {
t[i] && (e.removeEventListener(this, i, s), delete t[i]);
},
n = (t, e) => {
this.canvas && this.resize(t, e);
};
let o;
const a = () => {
s("attach", a),
(this.attached = !0),
this.resize(),
i("resize", n),
i("detach", o);
};
(o = () => {
(this.attached = !1),
s("resize", n),
this._stop(),
this._resize(0, 0),
i("attach", a);
}),
e.isAttached(this.canvas) ? a() : o();
}
unbindEvents() {
Q(this._listeners, (t, e) => {
this.platform.removeEventListener(this, e, t);
}),
(this._listeners = {}),
Q(this._responsiveListeners, (t, e) => {
this.platform.removeEventListener(this, e, t);
}),
(this._responsiveListeners = void 0);
}
updateHoverStyle(t, e, i) {
const s = i ? "set" : "remove";
let n, o, a, r;
for (
"dataset" === e &&
((n = this.getDatasetMeta(t[0].datasetIndex)),
n.controller["_" + s + "DatasetHoverStyle"]()),
a = 0,
r = t.length;
a < r;
++a
) {
o = t[a];
const e = o && this.getDatasetMeta(o.datasetIndex).controller;
e && e[s + "HoverStyle"](o.element, o.datasetIndex, o.index);
}
}
getActiveElements() {
return this._active || [];
}
setActiveElements(t) {
const e = this._active || [],
i = t.map(({ datasetIndex: t, index: e }) => {
const i = this.getDatasetMeta(t);
if (!i) throw new Error("No dataset found at index " + t);
return { datasetIndex: t, element: i.data[e], index: e };
});
!tt(i, e) &&
((this._active = i),
(this._lastEvent = null),
this._updateHoverStyles(i, e));
}
notifyPlugins(t, e, i) {
return this._plugins.notify(this, t, e, i);
}
_updateHoverStyles(t, e, i) {
const s = this.options.hover,
n = (t, e) =>
t.filter(
(t) =>
!e.some(
(e) => t.datasetIndex === e.datasetIndex && t.index === e.index
)
),
o = n(e, t),
a = i ? t : n(t, e);
o.length && this.updateHoverStyle(o, s.mode, !1),
a.length && s.mode && this.updateHoverStyle(a, s.mode, !0);
}
_eventHandler(t, e) {
const i = {
event: t,
replay: e,
cancelable: !0,
inChartArea: Jt(t, this.chartArea, this._minPadding),
},
s = (e) =>
(e.options.events || this.options.events).includes(t.native.type);
if (!1 === this.notifyPlugins("beforeEvent", i, s)) return;
const n = this._handleEvent(t, e, i.inChartArea);
return (
(i.cancelable = !1),
this.notifyPlugins("afterEvent", i, s),
(n || i.changed) && this.render(),
this
);
}
_handleEvent(t, e, i) {
const { _active: s = [], options: n } = this,
o = e,
a = this._getActiveElements(t, s, i, o),
r = ft(t),
l = (function (t, e, i, s) {
return i && "mouseout" !== t.type ? (s ? e : t) : null;
})(t, this._lastEvent, i, r);
i &&
((this._lastEvent = null),
J(n.onHover, [t, a, this], this),
r && J(n.onClick, [t, a, this], this));
const h = !tt(a, s);
return (
(h || e) && ((this._active = a), this._updateHoverStyles(a, s, e)),
(this._lastEvent = l),
h
);
}
_getActiveElements(t, e, i, s) {
if ("mouseout" === t.type) return [];
if (!i) return e;
const n = this.options.hover;
return this.getElementsAtEventForMode(t, n.mode, n, s);
}
}
const un = () => Q(dn.instances, (t) => t._plugins.invalidate()),
fn = !0;
function gn() {
throw new Error(
"This method is not implemented: Check that a complete date adapter is provided."
);
}
Object.defineProperties(dn, {
defaults: { enumerable: fn, value: bt },
instances: { enumerable: fn, value: ln },
overrides: { enumerable: fn, value: gt },
registry: { enumerable: fn, value: Ws },
version: { enumerable: fn, value: "3.7.1" },
getChart: { enumerable: fn, value: hn },
register: {
enumerable: fn,
value: (...t) => {
Ws.add(...t), un();
},
},
unregister: {
enumerable: fn,
value: (...t) => {
Ws.remove(...t), un();
},
},
});
class pn {
constructor(t) {
this.options = t || {};
}
formats() {
return gn();
}
parse(t, e) {
return gn();
}
format(t, e) {
return gn();
}
add(t, e, i) {
return gn();
}
diff(t, e, i) {
return gn();
}
startOf(t, e, i) {
return gn();
}
endOf(t, e) {
return gn();
}
}
pn.override = function (t) {
Object.assign(pn.prototype, t);
};
var mn = { _date: pn };
function xn(t) {
const e = t.iScale,
i = (function (t, e) {
if (!t._cache.$bar) {
const i = t.getMatchingVisibleMetas(e);
let s = [];
for (let e = 0, n = i.length; e < n; e++)
s = s.concat(i[e].controller.getAllParsedValues(t));
t._cache.$bar = fe(s.sort((t, e) => t - e));
}
return t._cache.$bar;
})(e, t.type);
let s,
n,
o,
a,
r = e._length;
const l = () => {
32767 !== o &&
-32768 !== o &&
(ct(a) && (r = Math.min(r, Math.abs(o - a) || r)), (a = o));
};
for (s = 0, n = i.length; s < n; ++s) (o = e.getPixelForValue(i[s])), l();
for (a = void 0, s = 0, n = e.ticks.length; s < n; ++s)
(o = e.getPixelForTick(s)), l();
return r;
}
function bn(t, e, i, s) {
return (
Y(t)
? (function (t, e, i, s) {
const n = i.parse(t[0], s),
o = i.parse(t[1], s),
a = Math.min(n, o),
r = Math.max(n, o);
let l = a,
h = r;
Math.abs(a) > Math.abs(r) && ((l = r), (h = a)),
(e[i.axis] = h),
(e._custom = {
barStart: l,
barEnd: h,
start: n,
end: o,
min: a,
max: r,
});
})(t, e, i, s)
: (e[i.axis] = i.parse(t, s)),
e
);
}
function _n(t, e, i, s) {
const n = t.iScale,
o = t.vScale,
a = n.getLabels(),
r = n === o,
l = [];
let h, c, d, u;
for (h = i, c = i + s; h < c; ++h)
(u = e[h]),
(d = {}),
(d[n.axis] = r || n.parse(a[h], h)),
l.push(bn(u, d, o, h));
return l;
}
function yn(t) {
return t && void 0 !== t.barStart && void 0 !== t.barEnd;
}
function vn(t, e, i, s) {
let n = e.borderSkipped;
const o = {};
if (!n) return void (t.borderSkipped = o);
const {
start: a,
end: r,
reverse: l,
top: h,
bottom: c,
} = (function (t) {
let e, i, s, n, o;
return (
t.horizontal
? ((e = t.base > t.x), (i = "left"), (s = "right"))
: ((e = t.base < t.y), (i = "bottom"), (s = "top")),
e ? ((n = "end"), (o = "start")) : ((n = "start"), (o = "end")),
{ start: i, end: s, reverse: e, top: n, bottom: o }
);
})(t);
"middle" === n &&
i &&
((t.enableBorderRadius = !0),
(i._top || 0) === s
? (n = h)
: (i._bottom || 0) === s
? (n = c)
: ((o[wn(c, a, r, l)] = !0), (n = h))),
(o[wn(n, a, r, l)] = !0),
(t.borderSkipped = o);
}
function wn(t, e, i, s) {
var n, o, a;
return (
s
? ((a = i),
(t = Mn((t = (n = t) === (o = e) ? a : n === a ? o : n), i, e)))
: (t = Mn(t, e, i)),
t
);
}
function Mn(t, e, i) {
return "start" === t ? e : "end" === t ? i : t;
}
function kn(t, { inflateAmount: e }, i) {
t.inflateAmount = "auto" === e ? (1 === i ? 0.33 : 0) : e;
}
class Sn extends Ps {
parsePrimitiveData(t, e, i, s) {
return _n(t, e, i, s);
}
parseArrayData(t, e, i, s) {
return _n(t, e, i, s);
}
parseObjectData(t, e, i, s) {
const { iScale: n, vScale: o } = t,
{ xAxisKey: a = "x", yAxisKey: r = "y" } = this._parsing,
l = "x" === n.axis ? a : r,
h = "x" === o.axis ? a : r,
c = [];
let d, u, f, g;
for (d = i, u = i + s; d < u; ++d)
(g = e[d]),
(f = {}),
(f[n.axis] = n.parse(lt(g, l), d)),
c.push(bn(lt(g, h), f, o, d));
return c;
}
updateRangeFromParsed(t, e, i, s) {
super.updateRangeFromParsed(t, e, i, s);
const n = i._custom;
n &&
e === this._cachedMeta.vScale &&
((t.min = Math.min(t.min, n.min)), (t.max = Math.max(t.max, n.max)));
}
getMaxOverflow() {
return 0;
}
getLabelAndValue(t) {
const e = this._cachedMeta,
{ iScale: i, vScale: s } = e,
n = this.getParsed(t),
o = n._custom,
a = yn(o)
? "[" + o.start + ", " + o.end + "]"
: "" + s.getLabelForValue(n[s.axis]);
return { label: "" + i.getLabelForValue(n[i.axis]), value: a };
}
initialize() {
(this.enableOptionSharing = !0), super.initialize();
this._cachedMeta.stack = this.getDataset().stack;
}
update(t) {
const e = this._cachedMeta;
this.updateElements(e.data, 0, e.data.length, t);
}
updateElements(t, e, i, s) {
const n = "reset" === s,
{
index: o,
_cachedMeta: { vScale: a },
} = this,
r = a.getBasePixel(),
l = a.isHorizontal(),
h = this._getRuler(),
c = this.resolveDataElementOptions(e, s),
d = this.getSharedOptions(c),
u = this.includeOptions(s, d);
this.updateSharedOptions(d, s, c);
for (let c = e; c < e + i; c++) {
const e = this.getParsed(c),
i =
n || $(e[a.axis])
? { base: r, head: r }
: this._calculateBarValuePixels(c),
f = this._calculateBarIndexPixels(c, h),
g = (e._stacks || {})[a.axis],
p = {
horizontal: l,
base: i.base,
enableBorderRadius:
!g || yn(e._custom) || o === g._top || o === g._bottom,
x: l ? i.head : f.center,
y: l ? f.center : i.head,
height: l ? f.size : Math.abs(i.size),
width: l ? Math.abs(i.size) : f.size,
};
u &&
(p.options =
d || this.resolveDataElementOptions(c, t[c].active ? "active" : s));
const m = p.options || t[c].options;
vn(p, m, g, o), kn(p, m, h.ratio), this.updateElement(t[c], c, p, s);
}
}
_getStacks(t, e) {
const i = this._cachedMeta.iScale,
s = i.getMatchingVisibleMetas(this._type),
n = i.options.stacked,
o = s.length,
a = [];
let r, l;
for (r = 0; r < o; ++r)
if (((l = s[r]), l.controller.options.grouped)) {
if (void 0 !== e) {
const t =
l.controller.getParsed(e)[l.controller._cachedMeta.vScale.axis];
if ($(t) || isNaN(t)) continue;
}
if (
((!1 === n ||
-1 === a.indexOf(l.stack) ||
(void 0 === n && void 0 === l.stack)) &&
a.push(l.stack),
l.index === t)
)
break;
}
return a.length || a.push(void 0), a;
}
_getStackCount(t) {
return this._getStacks(void 0, t).length;
}
_getStackIndex(t, e, i) {
const s = this._getStacks(t, i),
n = void 0 !== e ? s.indexOf(e) : -1;
return -1 === n ? s.length - 1 : n;
}
_getRuler() {
const t = this.options,
e = this._cachedMeta,
i = e.iScale,
s = [];
let n, o;
for (n = 0, o = e.data.length; n < o; ++n)
s.push(i.getPixelForValue(this.getParsed(n)[i.axis], n));
const a = t.barThickness;
return {
min: a || xn(e),
pixels: s,
start: i._startPixel,
end: i._endPixel,
stackCount: this._getStackCount(),
scale: i,
grouped: t.grouped,
ratio: a ? 1 : t.categoryPercentage * t.barPercentage,
};
}
_calculateBarValuePixels(t) {
const {
_cachedMeta: { vScale: e, _stacked: i },
options: { base: s, minBarLength: n },
} = this,
o = s || 0,
a = this.getParsed(t),
r = a._custom,
l = yn(r);
let h,
c,
d = a[e.axis],
u = 0,
f = i ? this.applyStack(e, a, i) : d;
f !== d && ((u = f - d), (f = d)),
l &&
((d = r.barStart),
(f = r.barEnd - r.barStart),
0 !== d && Ct(d) !== Ct(r.barEnd) && (u = 0),
(u += d));
const g = $(s) || l ? u : s;
let p = e.getPixelForValue(g);
if (
((h = this.chart.getDataVisibility(t) ? e.getPixelForValue(u + f) : p),
(c = h - p),
Math.abs(c) < n &&
((c =
(function (t, e, i) {
return 0 !== t
? Ct(t)
: (e.isHorizontal() ? 1 : -1) * (e.min >= i ? 1 : -1);
})(c, e, o) * n),
d === o && (p -= c / 2),
(h = p + c)),
p === e.getPixelForValue(o))
) {
const t = (Ct(c) * e.getLineWidthForValue(o)) / 2;
(p += t), (c -= t);
}
return { size: c, base: p, head: h, center: h + c / 2 };
}
_calculateBarIndexPixels(t, e) {
const i = e.scale,
s = this.options,
n = s.skipNull,
o = K(s.maxBarThickness, 1 / 0);
let a, r;
if (e.grouped) {
const i = n ? this._getStackCount(t) : e.stackCount,
l =
"flex" === s.barThickness
? (function (t, e, i, s) {
const n = e.pixels,
o = n[t];
let a = t > 0 ? n[t - 1] : null,
r = t < n.length - 1 ? n[t + 1] : null;
const l = i.categoryPercentage;
null === a &&
(a = o - (null === r ? e.end - e.start : r - o)),
null === r && (r = o + o - a);
const h = o - ((o - Math.min(a, r)) / 2) * l;
return {
chunk: ((Math.abs(r - a) / 2) * l) / s,
ratio: i.barPercentage,
start: h,
};
})(t, e, s, i)
: (function (t, e, i, s) {
const n = i.barThickness;
let o, a;
return (
$(n)
? ((o = e.min * i.categoryPercentage),
(a = i.barPercentage))
: ((o = n * s), (a = 1)),
{ chunk: o / s, ratio: a, start: e.pixels[t] - o / 2 }
);
})(t, e, s, i),
h = this._getStackIndex(
this.index,
this._cachedMeta.stack,
n ? t : void 0
);
(a = l.start + l.chunk * h + l.chunk / 2),
(r = Math.min(o, l.chunk * l.ratio));
} else (a = i.getPixelForValue(this.getParsed(t)[i.axis], t)), (r = Math.min(o, e.min * e.ratio));
return { base: a - r / 2, head: a + r / 2, center: a, size: r };
}
draw() {
const t = this._cachedMeta,
e = t.vScale,
i = t.data,
s = i.length;
let n = 0;
for (; n < s; ++n)
null !== this.getParsed(n)[e.axis] && i[n].draw(this._ctx);
}
}
(Sn.id = "bar"),
(Sn.defaults = {
datasetElementType: !1,
dataElementType: "bar",
categoryPercentage: 0.8,
barPercentage: 0.9,
grouped: !0,
animations: {
numbers: {
type: "number",
properties: ["x", "y", "base", "width", "height"],
},
},
}),
(Sn.overrides = {
scales: {
_index_: { type: "category", offset: !0, grid: { offset: !0 } },
_value_: { type: "linear", beginAtZero: !0 },
},
});
class Pn extends Ps {
initialize() {
(this.enableOptionSharing = !0), super.initialize();
}
parsePrimitiveData(t, e, i, s) {
const n = super.parsePrimitiveData(t, e, i, s);
for (let t = 0; t < n.length; t++)
n[t]._custom = this.resolveDataElementOptions(t + i).radius;
return n;
}
parseArrayData(t, e, i, s) {
const n = super.parseArrayData(t, e, i, s);
for (let t = 0; t < n.length; t++) {
const s = e[i + t];
n[t]._custom = K(s[2], this.resolveDataElementOptions(t + i).radius);
}
return n;
}
parseObjectData(t, e, i, s) {
const n = super.parseObjectData(t, e, i, s);
for (let t = 0; t < n.length; t++) {
const s = e[i + t];
n[t]._custom = K(
s && s.r && +s.r,
this.resolveDataElementOptions(t + i).radius
);
}
return n;
}
getMaxOverflow() {
const t = this._cachedMeta.data;
let e = 0;
for (let i = t.length - 1; i >= 0; --i)
e = Math.max(e, t[i].size(this.resolveDataElementOptions(i)) / 2);
return e > 0 && e;
}
getLabelAndValue(t) {
const e = this._cachedMeta,
{ xScale: i, yScale: s } = e,
n = this.getParsed(t),
o = i.getLabelForValue(n.x),
a = s.getLabelForValue(n.y),
r = n._custom;
return {
label: e.label,
value: "(" + o + ", " + a + (r ? ", " + r : "") + ")",
};
}
update(t) {
const e = this._cachedMeta.data;
this.updateElements(e, 0, e.length, t);
}
updateElements(t, e, i, s) {
const n = "reset" === s,
{ iScale: o, vScale: a } = this._cachedMeta,
r = this.resolveDataElementOptions(e, s),
l = this.getSharedOptions(r),
h = this.includeOptions(s, l),
c = o.axis,
d = a.axis;
for (let r = e; r < e + i; r++) {
const e = t[r],
i = !n && this.getParsed(r),
l = {},
u = (l[c] = n ? o.getPixelForDecimal(0.5) : o.getPixelForValue(i[c])),
f = (l[d] = n ? a.getBasePixel() : a.getPixelForValue(i[d]));
(l.skip = isNaN(u) || isNaN(f)),
h &&
((l.options = this.resolveDataElementOptions(
r,
e.active ? "active" : s
)),
n && (l.options.radius = 0)),
this.updateElement(e, r, l, s);
}
this.updateSharedOptions(l, s, r);
}
resolveDataElementOptions(t, e) {
const i = this.getParsed(t);
let s = super.resolveDataElementOptions(t, e);
s.$shared && (s = Object.assign({}, s, { $shared: !1 }));
const n = s.radius;
return (
"active" !== e && (s.radius = 0), (s.radius += K(i && i._custom, n)), s
);
}
}
(Pn.id = "bubble"),
(Pn.defaults = {
datasetElementType: !1,
dataElementType: "point",
animations: {
numbers: {
type: "number",
properties: ["x", "y", "borderWidth", "radius"],
},
},
}),
(Pn.overrides = {
scales: { x: { type: "linear" }, y: { type: "linear" } },
plugins: { tooltip: { callbacks: { title: () => "" } } },
});
class Dn extends Ps {
constructor(t, e) {
super(t, e),
(this.enableOptionSharing = !0),
(this.innerRadius = void 0),
(this.outerRadius = void 0),
(this.offsetX = void 0),
(this.offsetY = void 0);
}
linkScales() {}
parse(t, e) {
const i = this.getDataset().data,
s = this._cachedMeta;
if (!1 === this._parsing) s._parsed = i;
else {
let n,
o,
a = (t) => +i[t];
if (U(i[t])) {
const { key: t = "value" } = this._parsing;
a = (e) => +lt(i[e], t);
}
for (n = t, o = t + e; n < o; ++n) s._parsed[n] = a(n);
}
}
_getRotation() {
return It(this.options.rotation - 90);
}
_getCircumference() {
return It(this.options.circumference);
}
_getRotationExtents() {
let t = yt,
e = -yt;
for (let i = 0; i < this.chart.data.datasets.length; ++i)
if (this.chart.isDatasetVisible(i)) {
const s = this.chart.getDatasetMeta(i).controller,
n = s._getRotation(),
o = s._getCircumference();
(t = Math.min(t, n)), (e = Math.max(e, n + o));
}
return { rotation: t, circumference: e - t };
}
update(t) {
const e = this.chart,
{ chartArea: i } = e,
s = this._cachedMeta,
n = s.data,
o =
this.getMaxBorderWidth() +
this.getMaxOffset(n) +
this.options.spacing,
a = Math.max((Math.min(i.width, i.height) - o) / 2, 0),
r = Math.min(G(this.options.cutout, a), 1),
l = this._getRingWeight(this.index),
{ circumference: h, rotation: c } = this._getRotationExtents(),
{
ratioX: d,
ratioY: u,
offsetX: f,
offsetY: g,
} = (function (t, e, i) {
let s = 1,
n = 1,
o = 0,
a = 0;
if (e < yt) {
const r = t,
l = r + e,
h = Math.cos(r),
c = Math.sin(r),
d = Math.cos(l),
u = Math.sin(l),
f = (t, e, s) =>
Ht(t, r, l, !0) ? 1 : Math.max(e, e * i, s, s * i),
g = (t, e, s) =>
Ht(t, r, l, !0) ? -1 : Math.min(e, e * i, s, s * i),
p = f(0, h, d),
m = f(kt, c, u),
x = g(_t, h, d),
b = g(_t + kt, c, u);
(s = (p - x) / 2),
(n = (m - b) / 2),
(o = -(p + x) / 2),
(a = -(m + b) / 2);
}
return { ratioX: s, ratioY: n, offsetX: o, offsetY: a };
})(c, h, r),
p = (i.width - o) / d,
m = (i.height - o) / u,
x = Math.max(Math.min(p, m) / 2, 0),
b = Z(this.options.radius, x),
_ = (b - Math.max(b * r, 0)) / this._getVisibleDatasetWeightTotal();
(this.offsetX = f * b),
(this.offsetY = g * b),
(s.total = this.calculateTotal()),
(this.outerRadius = b - _ * this._getRingWeightOffset(this.index)),
(this.innerRadius = Math.max(this.outerRadius - _ * l, 0)),
this.updateElements(n, 0, n.length, t);
}
_circumference(t, e) {
const i = this.options,
s = this._cachedMeta,
n = this._getCircumference();
return (e && i.animation.animateRotate) ||
!this.chart.getDataVisibility(t) ||
null === s._parsed[t] ||
s.data[t].hidden
? 0
: this.calculateCircumference((s._parsed[t] * n) / yt);
}
updateElements(t, e, i, s) {
const n = "reset" === s,
o = this.chart,
a = o.chartArea,
r = o.options.animation,
l = (a.left + a.right) / 2,
h = (a.top + a.bottom) / 2,
c = n && r.animateScale,
d = c ? 0 : this.innerRadius,
u = c ? 0 : this.outerRadius,
f = this.resolveDataElementOptions(e, s),
g = this.getSharedOptions(f),
p = this.includeOptions(s, g);
let m,
x = this._getRotation();
for (m = 0; m < e; ++m) x += this._circumference(m, n);
for (m = e; m < e + i; ++m) {
const e = this._circumference(m, n),
i = t[m],
o = {
x: l + this.offsetX,
y: h + this.offsetY,
startAngle: x,
endAngle: x + e,
circumference: e,
outerRadius: u,
innerRadius: d,
};
p &&
(o.options =
g || this.resolveDataElementOptions(m, i.active ? "active" : s)),
(x += e),
this.updateElement(i, m, o, s);
}
this.updateSharedOptions(g, s, f);
}
calculateTotal() {
const t = this._cachedMeta,
e = t.data;
let i,
s = 0;
for (i = 0; i < e.length; i++) {
const n = t._parsed[i];
null === n ||
isNaN(n) ||
!this.chart.getDataVisibility(i) ||
e[i].hidden ||
(s += Math.abs(n));
}
return s;
}
calculateCircumference(t) {
const e = this._cachedMeta.total;
return e > 0 && !isNaN(t) ? yt * (Math.abs(t) / e) : 0;
}
getLabelAndValue(t) {
const e = this._cachedMeta,
i = this.chart,
s = i.data.labels || [],
n = Ri(e._parsed[t], i.options.locale);
return { label: s[t] || "", value: n };
}
getMaxBorderWidth(t) {
let e = 0;
const i = this.chart;
let s, n, o, a, r;
if (!t)
for (s = 0, n = i.data.datasets.length; s < n; ++s)
if (i.isDatasetVisible(s)) {
(o = i.getDatasetMeta(s)), (t = o.data), (a = o.controller);
break;
}
if (!t) return 0;
for (s = 0, n = t.length; s < n; ++s)
(r = a.resolveDataElementOptions(s)),
"inner" !== r.borderAlign &&
(e = Math.max(e, r.borderWidth || 0, r.hoverBorderWidth || 0));
return e;
}
getMaxOffset(t) {
let e = 0;
for (let i = 0, s = t.length; i < s; ++i) {
const t = this.resolveDataElementOptions(i);
e = Math.max(e, t.offset || 0, t.hoverOffset || 0);
}
return e;
}
_getRingWeightOffset(t) {
let e = 0;
for (let i = 0; i < t; ++i)
this.chart.isDatasetVisible(i) && (e += this._getRingWeight(i));
return e;
}
_getRingWeight(t) {
return Math.max(K(this.chart.data.datasets[t].weight, 1), 0);
}
_getVisibleDatasetWeightTotal() {
return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;
}
}
(Dn.id = "doughnut"),
(Dn.defaults = {
datasetElementType: !1,
dataElementType: "arc",
animation: { animateRotate: !0, animateScale: !1 },
animations: {
numbers: {
type: "number",
properties: [
"circumference",
"endAngle",
"innerRadius",
"outerRadius",
"startAngle",
"x",
"y",
"offset",
"borderWidth",
"spacing",
],
},
},
cutout: "50%",
rotation: 0,
circumference: 360,
radius: "100%",
spacing: 0,
indexAxis: "r",
}),
(Dn.descriptors = {
_scriptable: (t) => "spacing" !== t,
_indexable: (t) => "spacing" !== t,
}),
(Dn.overrides = {
aspectRatio: 1,
plugins: {
legend: {
labels: {
generateLabels(t) {
const e = t.data;
if (e.labels.length && e.datasets.length) {
const {
labels: { pointStyle: i },
} = t.legend.options;
return e.labels.map((e, s) => {
const n = t.getDatasetMeta(0).controller.getStyle(s);
return {
text: e,
fillStyle: n.backgroundColor,
strokeStyle: n.borderColor,
lineWidth: n.borderWidth,
pointStyle: i,
hidden: !t.getDataVisibility(s),
index: s,
};
});
}
return [];
},
},
onClick(t, e, i) {
i.chart.toggleDataVisibility(e.index), i.chart.update();
},
},
tooltip: {
callbacks: {
title: () => "",
label(t) {
let e = t.label;
const i = ": " + t.formattedValue;
return Y(e) ? ((e = e.slice()), (e[0] += i)) : (e += i), e;
},
},
},
},
});
class Cn extends Ps {
initialize() {
(this.enableOptionSharing = !0), super.initialize();
}
update(t) {
const e = this._cachedMeta,
{ dataset: i, data: s = [], _dataset: n } = e,
o = this.chart._animationsDisabled;
let { start: a, count: r } = (function (t, e, i) {
const s = e.length;
let n = 0,
o = s;
if (t._sorted) {
const { iScale: a, _parsed: r } = t,
l = a.axis,
{
min: h,
max: c,
minDefined: d,
maxDefined: u,
} = a.getUserBounds();
d &&
(n = jt(
Math.min(
re(r, a.axis, h).lo,
i ? s : re(e, l, a.getPixelForValue(h)).lo
),
0,
s - 1
)),
(o = u
? jt(
Math.max(
re(r, a.axis, c).hi + 1,
i ? 0 : re(e, l, a.getPixelForValue(c)).hi + 1
),
n,
s
) - n
: s - n);
}
return { start: n, count: o };
})(e, s, o);
(this._drawStart = a),
(this._drawCount = r),
(function (t) {
const { xScale: e, yScale: i, _scaleRanges: s } = t,
n = { xmin: e.min, xmax: e.max, ymin: i.min, ymax: i.max };
if (!s) return (t._scaleRanges = n), !0;
const o =
s.xmin !== e.min ||
s.xmax !== e.max ||
s.ymin !== i.min ||
s.ymax !== i.max;
return Object.assign(s, n), o;
})(e) && ((a = 0), (r = s.length)),
(i._chart = this.chart),
(i._datasetIndex = this.index),
(i._decimated = !!n._decimated),
(i.points = s);
const l = this.resolveDatasetElementOptions(t);
this.options.showLine || (l.borderWidth = 0),
(l.segment = this.options.segment),
this.updateElement(i, void 0, { animated: !o, options: l }, t),
this.updateElements(s, a, r, t);
}
updateElements(t, e, i, s) {
const n = "reset" === s,
{ iScale: o, vScale: a, _stacked: r, _dataset: l } = this._cachedMeta,
h = this.resolveDataElementOptions(e, s),
c = this.getSharedOptions(h),
d = this.includeOptions(s, c),
u = o.axis,
f = a.axis,
{ spanGaps: g, segment: p } = this.options,
m = Tt(g) ? g : Number.POSITIVE_INFINITY,
x = this.chart._animationsDisabled || n || "none" === s;
let b = e > 0 && this.getParsed(e - 1);
for (let h = e; h < e + i; ++h) {
const e = t[h],
i = this.getParsed(h),
g = x ? e : {},
_ = $(i[f]),
y = (g[u] = o.getPixelForValue(i[u], h)),
v = (g[f] =
n || _
? a.getBasePixel()
: a.getPixelForValue(r ? this.applyStack(a, i, r) : i[f], h));
(g.skip = isNaN(y) || isNaN(v) || _),
(g.stop = h > 0 && i[u] - b[u] > m),
p && ((g.parsed = i), (g.raw = l.data[h])),
d &&
(g.options =
c || this.resolveDataElementOptions(h, e.active ? "active" : s)),
x || this.updateElement(e, h, g, s),
(b = i);
}
this.updateSharedOptions(c, s, h);
}
getMaxOverflow() {
const t = this._cachedMeta,
e = t.dataset,
i = (e.options && e.options.borderWidth) || 0,
s = t.data || [];
if (!s.length) return i;
const n = s[0].size(this.resolveDataElementOptions(0)),
o = s[s.length - 1].size(this.resolveDataElementOptions(s.length - 1));
return Math.max(i, n, o) / 2;
}
draw() {
const t = this._cachedMeta;
t.dataset.updateControlPoints(this.chart.chartArea, t.iScale.axis),
super.draw();
}
}
(Cn.id = "line"),
(Cn.defaults = {
datasetElementType: "line",
dataElementType: "point",
showLine: !0,
spanGaps: !1,
}),
(Cn.overrides = {
scales: { _index_: { type: "category" }, _value_: { type: "linear" } },
});
class On extends Ps {
constructor(t, e) {
super(t, e), (this.innerRadius = void 0), (this.outerRadius = void 0);
}
getLabelAndValue(t) {
const e = this._cachedMeta,
i = this.chart,
s = i.data.labels || [],
n = Ri(e._parsed[t].r, i.options.locale);
return { label: s[t] || "", value: n };
}
update(t) {
const e = this._cachedMeta.data;
this._updateRadius(), this.updateElements(e, 0, e.length, t);
}
_updateRadius() {
const t = this.chart,
e = t.chartArea,
i = t.options,
s = Math.min(e.right - e.left, e.bottom - e.top),
n = Math.max(s / 2, 0),
o =
(n -
Math.max(
i.cutoutPercentage ? (n / 100) * i.cutoutPercentage : 1,
0
)) /
t.getVisibleDatasetCount();
(this.outerRadius = n - o * this.index),
(this.innerRadius = this.outerRadius - o);
}
updateElements(t, e, i, s) {
const n = "reset" === s,
o = this.chart,
a = this.getDataset(),
r = o.options.animation,
l = this._cachedMeta.rScale,
h = l.xCenter,
c = l.yCenter,
d = l.getIndexAngle(0) - 0.5 * _t;
let u,
f = d;
const g = 360 / this.countVisibleElements();
for (u = 0; u < e; ++u) f += this._computeAngle(u, s, g);
for (u = e; u < e + i; u++) {
const e = t[u];
let i = f,
p = f + this._computeAngle(u, s, g),
m = o.getDataVisibility(u)
? l.getDistanceFromCenterForValue(a.data[u])
: 0;
(f = p),
n && (r.animateScale && (m = 0), r.animateRotate && (i = p = d));
const x = {
x: h,
y: c,
innerRadius: 0,
outerRadius: m,
startAngle: i,
endAngle: p,
options: this.resolveDataElementOptions(u, e.active ? "active" : s),
};
this.updateElement(e, u, x, s);
}
}
countVisibleElements() {
const t = this.getDataset(),
e = this._cachedMeta;
let i = 0;
return (
e.data.forEach((e, s) => {
!isNaN(t.data[s]) && this.chart.getDataVisibility(s) && i++;
}),
i
);
}
_computeAngle(t, e, i) {
return this.chart.getDataVisibility(t)
? It(this.resolveDataElementOptions(t, e).angle || i)
: 0;
}
}
(On.id = "polarArea"),
(On.defaults = {
dataElementType: "arc",
animation: { animateRotate: !0, animateScale: !0 },
animations: {
numbers: {
type: "number",
properties: [
"x",
"y",
"startAngle",
"endAngle",
"innerRadius",
"outerRadius",
],
},
},
indexAxis: "r",
startAngle: 0,
}),
(On.overrides = {
aspectRatio: 1,
plugins: {
legend: {
labels: {
generateLabels(t) {
const e = t.data;
if (e.labels.length && e.datasets.length) {
const {
labels: { pointStyle: i },
} = t.legend.options;
return e.labels.map((e, s) => {
const n = t.getDatasetMeta(0).controller.getStyle(s);
return {
text: e,
fillStyle: n.backgroundColor,
strokeStyle: n.borderColor,
lineWidth: n.borderWidth,
pointStyle: i,
hidden: !t.getDataVisibility(s),
index: s,
};
});
}
return [];
},
},
onClick(t, e, i) {
i.chart.toggleDataVisibility(e.index), i.chart.update();
},
},
tooltip: {
callbacks: {
title: () => "",
label: (t) =>
t.chart.data.labels[t.dataIndex] + ": " + t.formattedValue,
},
},
},
scales: {
r: {
type: "radialLinear",
angleLines: { display: !1 },
beginAtZero: !0,
grid: { circular: !0 },
pointLabels: { display: !1 },
startAngle: 0,
},
},
});
class An extends Dn {}
(An.id = "pie"),
(An.defaults = {
cutout: 0,
rotation: 0,
circumference: 360,
radius: "100%",
});
class Tn extends Ps {
getLabelAndValue(t) {
const e = this._cachedMeta.vScale,
i = this.getParsed(t);
return {
label: e.getLabels()[t],
value: "" + e.getLabelForValue(i[e.axis]),
};
}
update(t) {
const e = this._cachedMeta,
i = e.dataset,
s = e.data || [],
n = e.iScale.getLabels();
if (((i.points = s), "resize" !== t)) {
const e = this.resolveDatasetElementOptions(t);
this.options.showLine || (e.borderWidth = 0);
const o = { _loop: !0, _fullLoop: n.length === s.length, options: e };
this.updateElement(i, void 0, o, t);
}
this.updateElements(s, 0, s.length, t);
}
updateElements(t, e, i, s) {
const n = this.getDataset(),
o = this._cachedMeta.rScale,
a = "reset" === s;
for (let r = e; r < e + i; r++) {
const e = t[r],
i = this.resolveDataElementOptions(r, e.active ? "active" : s),
l = o.getPointPositionForValue(r, n.data[r]),
h = a ? o.xCenter : l.x,
c = a ? o.yCenter : l.y,
d = {
x: h,
y: c,
angle: l.angle,
skip: isNaN(h) || isNaN(c),
options: i,
};
this.updateElement(e, r, d, s);
}
}
}
(Tn.id = "radar"),
(Tn.defaults = {
datasetElementType: "line",
dataElementType: "point",
indexAxis: "r",
showLine: !0,
elements: { line: { fill: "start" } },
}),
(Tn.overrides = {
aspectRatio: 1,
scales: { r: { type: "radialLinear" } },
});
class Ln extends Cn {}
(Ln.id = "scatter"),
(Ln.defaults = { showLine: !1, fill: !1 }),
(Ln.overrides = {
interaction: { mode: "point" },
plugins: {
tooltip: {
callbacks: {
title: () => "",
label: (t) => "(" + t.label + ", " + t.formattedValue + ")",
},
},
},
scales: { x: { type: "linear" }, y: { type: "linear" } },
});
var Rn = Object.freeze({
__proto__: null,
BarController: Sn,
BubbleController: Pn,
DoughnutController: Dn,
LineController: Cn,
PolarAreaController: On,
PieController: An,
RadarController: Tn,
ScatterController: Ln,
});
function En(t, e, i) {
const {
startAngle: s,
pixelMargin: n,
x: o,
y: a,
outerRadius: r,
innerRadius: l,
} = e;
let h = n / r;
t.beginPath(),
t.arc(o, a, r, s - h, i + h),
l > n
? ((h = n / l), t.arc(o, a, l, i + h, s - h, !0))
: t.arc(o, a, n, i + kt, s - kt),
t.closePath(),
t.clip();
}
function In(t, e, i, s) {
const n = Be(t.options.borderRadius, [
"outerStart",
"outerEnd",
"innerStart",
"innerEnd",
]);
const o = (i - e) / 2,
a = Math.min(o, (s * e) / 2),
r = (t) => {
const e = ((i - Math.min(o, t)) * s) / 2;
return jt(t, 0, Math.min(o, e));
};
return {
outerStart: r(n.outerStart),
outerEnd: r(n.outerEnd),
innerStart: jt(n.innerStart, 0, a),
innerEnd: jt(n.innerEnd, 0, a),
};
}
function zn(t, e, i, s) {
return { x: i + t * Math.cos(e), y: s + t * Math.sin(e) };
}
function Fn(t, e, i, s, n) {
const { x: o, y: a, startAngle: r, pixelMargin: l, innerRadius: h } = e,
c = Math.max(e.outerRadius + s + i - l, 0),
d = h > 0 ? h + s + i + l : 0;
let u = 0;
const f = n - r;
if (s) {
const t = ((h > 0 ? h - s : 0) + (c > 0 ? c - s : 0)) / 2;
u = (f - (0 !== t ? (f * t) / (t + s) : f)) / 2;
}
const g = (f - Math.max(0.001, f * c - i / _t) / c) / 2,
p = r + g + u,
m = n - g - u,
{
outerStart: x,
outerEnd: b,
innerStart: _,
innerEnd: y,
} = In(e, d, c, m - p),
v = c - x,
w = c - b,
M = p + x / v,
k = m - b / w,
S = d + _,
P = d + y,
D = p + _ / S,
C = m - y / P;
if ((t.beginPath(), t.arc(o, a, c, M, k), b > 0)) {
const e = zn(w, k, o, a);
t.arc(e.x, e.y, b, k, m + kt);
}
const O = zn(P, m, o, a);
if ((t.lineTo(O.x, O.y), y > 0)) {
const e = zn(P, C, o, a);
t.arc(e.x, e.y, y, m + kt, C + Math.PI);
}
if ((t.arc(o, a, d, m - y / d, p + _ / d, !0), _ > 0)) {
const e = zn(S, D, o, a);
t.arc(e.x, e.y, _, D + Math.PI, p - kt);
}
const A = zn(v, p, o, a);
if ((t.lineTo(A.x, A.y), x > 0)) {
const e = zn(v, M, o, a);
t.arc(e.x, e.y, x, p - kt, M);
}
t.closePath();
}
function Bn(t, e, i, s, n) {
const { options: o } = e,
{ borderWidth: a, borderJoinStyle: r } = o,
l = "inner" === o.borderAlign;
a &&
(l
? ((t.lineWidth = 2 * a), (t.lineJoin = r || "round"))
: ((t.lineWidth = a), (t.lineJoin = r || "bevel")),
e.fullCircles &&
(function (t, e, i) {
const {
x: s,
y: n,
startAngle: o,
pixelMargin: a,
fullCircles: r,
} = e,
l = Math.max(e.outerRadius - a, 0),
h = e.innerRadius + a;
let c;
for (
i && En(t, e, o + yt),
t.beginPath(),
t.arc(s, n, h, o + yt, o, !0),
c = 0;
c < r;
++c
)
t.stroke();
for (t.beginPath(), t.arc(s, n, l, o, o + yt), c = 0; c < r; ++c)
t.stroke();
})(t, e, l),
l && En(t, e, n),
Fn(t, e, i, s, n),
t.stroke());
}
class Vn extends Ds {
constructor(t) {
super(),
(this.options = void 0),
(this.circumference = void 0),
(this.startAngle = void 0),
(this.endAngle = void 0),
(this.innerRadius = void 0),
(this.outerRadius = void 0),
(this.pixelMargin = 0),
(this.fullCircles = 0),
t && Object.assign(this, t);
}
inRange(t, e, i) {
const s = this.getProps(["x", "y"], i),
{ angle: n, distance: o } = Bt(s, { x: t, y: e }),
{
startAngle: a,
endAngle: r,
innerRadius: l,
outerRadius: h,
circumference: c,
} = this.getProps(
[
"startAngle",
"endAngle",
"innerRadius",
"outerRadius",
"circumference",
],
i
),
d = this.options.spacing / 2,
u = K(c, r - a) >= yt || Ht(n, a, r),
f = Yt(o, l + d, h + d);
return u && f;
}
getCenterPoint(t) {
const {
x: e,
y: i,
startAngle: s,
endAngle: n,
innerRadius: o,
outerRadius: a,
} = this.getProps(
[
"x",
"y",
"startAngle",
"endAngle",
"innerRadius",
"outerRadius",
"circumference",
],
t
),
{ offset: r, spacing: l } = this.options,
h = (s + n) / 2,
c = (o + a + l + r) / 2;
return { x: e + Math.cos(h) * c, y: i + Math.sin(h) * c };
}
tooltipPosition(t) {
return this.getCenterPoint(t);
}
draw(t) {
const { options: e, circumference: i } = this,
s = (e.offset || 0) / 2,
n = (e.spacing || 0) / 2;
if (
((this.pixelMargin = "inner" === e.borderAlign ? 0.33 : 0),
(this.fullCircles = i > yt ? Math.floor(i / yt) : 0),
0 === i || this.innerRadius < 0 || this.outerRadius < 0)
)
return;
t.save();
let o = 0;
if (s) {
o = s / 2;
const e = (this.startAngle + this.endAngle) / 2;
t.translate(Math.cos(e) * o, Math.sin(e) * o),
this.circumference >= _t && (o = s);
}
(t.fillStyle = e.backgroundColor), (t.strokeStyle = e.borderColor);
const a = (function (t, e, i, s) {
const { fullCircles: n, startAngle: o, circumference: a } = e;
let r = e.endAngle;
if (n) {
Fn(t, e, i, s, o + yt);
for (let e = 0; e < n; ++e) t.fill();
isNaN(a) || ((r = o + (a % yt)), a % yt == 0 && (r += yt));
}
return Fn(t, e, i, s, r), t.fill(), r;
})(t, this, o, n);
Bn(t, this, o, n, a), t.restore();
}
}
function Wn(t, e, i = e) {
(t.lineCap = K(i.borderCapStyle, e.borderCapStyle)),
t.setLineDash(K(i.borderDash, e.borderDash)),
(t.lineDashOffset = K(i.borderDashOffset, e.borderDashOffset)),
(t.lineJoin = K(i.borderJoinStyle, e.borderJoinStyle)),
(t.lineWidth = K(i.borderWidth, e.borderWidth)),
(t.strokeStyle = K(i.borderColor, e.borderColor));
}
function Nn(t, e, i) {
t.lineTo(i.x, i.y);
}
function Hn(t, e, i = {}) {
const s = t.length,
{ start: n = 0, end: o = s - 1 } = i,
{ start: a, end: r } = e,
l = Math.max(n, a),
h = Math.min(o, r),
c = (n < a && o < a) || (n > r && o > r);
return {
count: s,
start: l,
loop: e.loop,
ilen: h < l && !c ? s + h - l : h - l,
};
}
function jn(t, e, i, s) {
const { points: n, options: o } = e,
{ count: a, start: r, loop: l, ilen: h } = Hn(n, i, s),
c = (function (t) {
return t.stepped
? ee
: t.tension || "monotone" === t.cubicInterpolationMode
? ie
: Nn;
})(o);
let d,
u,
f,
{ move: g = !0, reverse: p } = s || {};
for (d = 0; d <= h; ++d)
(u = n[(r + (p ? h - d : d)) % a]),
u.skip ||
(g ? (t.moveTo(u.x, u.y), (g = !1)) : c(t, f, u, p, o.stepped),
(f = u));
return l && ((u = n[(r + (p ? h : 0)) % a]), c(t, f, u, p, o.stepped)), !!l;
}
function $n(t, e, i, s) {
const n = e.points,
{ count: o, start: a, ilen: r } = Hn(n, i, s),
{ move: l = !0, reverse: h } = s || {};
let c,
d,
u,
f,
g,
p,
m = 0,
x = 0;
const b = (t) => (a + (h ? r - t : t)) % o,
_ = () => {
f !== g && (t.lineTo(m, g), t.lineTo(m, f), t.lineTo(m, p));
};
for (l && ((d = n[b(0)]), t.moveTo(d.x, d.y)), c = 0; c <= r; ++c) {
if (((d = n[b(c)]), d.skip)) continue;
const e = d.x,
i = d.y,
s = 0 | e;
s === u
? (i < f ? (f = i) : i > g && (g = i), (m = (x * m + e) / ++x))
: (_(), t.lineTo(e, i), (u = s), (x = 0), (f = g = i)),
(p = i);
}
_();
}
function Yn(t) {
const e = t.options,
i = e.borderDash && e.borderDash.length;
return !(
t._decimated ||
t._loop ||
e.tension ||
"monotone" === e.cubicInterpolationMode ||
e.stepped ||
i
)
? $n
: jn;
}
(Vn.id = "arc"),
(Vn.defaults = {
borderAlign: "center",
borderColor: "#fff",
borderJoinStyle: void 0,
borderRadius: 0,
borderWidth: 2,
offset: 0,
spacing: 0,
angle: void 0,
}),
(Vn.defaultRoutes = { backgroundColor: "backgroundColor" });
const Un = "function" == typeof Path2D;
function Xn(t, e, i, s) {
Un && !e.options.segment
? (function (t, e, i, s) {
let n = e._path;
n || ((n = e._path = new Path2D()), e.path(n, i, s) && n.closePath()),
Wn(t, e.options),
t.stroke(n);
})(t, e, i, s)
: (function (t, e, i, s) {
const { segments: n, options: o } = e,
a = Yn(e);
for (const r of n)
Wn(t, o, r.style),
t.beginPath(),
a(t, e, r, { start: i, end: i + s - 1 }) && t.closePath(),
t.stroke();
})(t, e, i, s);
}
class qn extends Ds {
constructor(t) {
super(),
(this.animated = !0),
(this.options = void 0),
(this._chart = void 0),
(this._loop = void 0),
(this._fullLoop = void 0),
(this._path = void 0),
(this._points = void 0),
(this._segments = void 0),
(this._decimated = !1),
(this._pointsUpdated = !1),
(this._datasetIndex = void 0),
t && Object.assign(this, t);
}
updateControlPoints(t, e) {
const i = this.options;
if (
(i.tension || "monotone" === i.cubicInterpolationMode) &&
!i.stepped &&
!this._pointsUpdated
) {
const s = i.spanGaps ? this._loop : this._fullLoop;
ki(this._points, i, t, s, e), (this._pointsUpdated = !0);
}
}
set points(t) {
(this._points = t),
delete this._segments,
delete this._path,
(this._pointsUpdated = !1);
}
get points() {
return this._points;
}
get segments() {
return (
this._segments || (this._segments = Ni(this, this.options.segment))
);
}
first() {
const t = this.segments,
e = this.points;
return t.length && e[t[0].start];
}
last() {
const t = this.segments,
e = this.points,
i = t.length;
return i && e[t[i - 1].end];
}
interpolate(t, e) {
const i = this.options,
s = t[e],
n = this.points,
o = Wi(this, { property: e, start: s, end: s });
if (!o.length) return;
const a = [],
r = (function (t) {
return t.stepped
? Ai
: t.tension || "monotone" === t.cubicInterpolationMode
? Ti
: Oi;
})(i);
let l, h;
for (l = 0, h = o.length; l < h; ++l) {
const { start: h, end: c } = o[l],
d = n[h],
u = n[c];
if (d === u) {
a.push(d);
continue;
}
const f = r(d, u, Math.abs((s - d[e]) / (u[e] - d[e])), i.stepped);
(f[e] = t[e]), a.push(f);
}
return 1 === a.length ? a[0] : a;
}
pathSegment(t, e, i) {
return Yn(this)(t, this, e, i);
}
path(t, e, i) {
const s = this.segments,
n = Yn(this);
let o = this._loop;
(e = e || 0), (i = i || this.points.length - e);
for (const a of s) o &= n(t, this, a, { start: e, end: e + i - 1 });
return !!o;
}
draw(t, e, i, s) {
const n = this.options || {};
(this.points || []).length &&
n.borderWidth &&
(t.save(), Xn(t, this, i, s), t.restore()),
this.animated && ((this._pointsUpdated = !1), (this._path = void 0));
}
}
function Kn(t, e, i, s) {
const n = t.options,
{ [i]: o } = t.getProps([i], s);
return Math.abs(e - o) < n.radius + n.hitRadius;
}
(qn.id = "line"),
(qn.defaults = {
borderCapStyle: "butt",
borderDash: [],
borderDashOffset: 0,
borderJoinStyle: "miter",
borderWidth: 3,
capBezierPoints: !0,
cubicInterpolationMode: "default",
fill: !1,
spanGaps: !1,
stepped: !1,
tension: 0,
}),
(qn.defaultRoutes = {
backgroundColor: "backgroundColor",
borderColor: "borderColor",
}),
(qn.descriptors = {
_scriptable: !0,
_indexable: (t) => "borderDash" !== t && "fill" !== t,
});
class Gn extends Ds {
constructor(t) {
super(),
(this.options = void 0),
(this.parsed = void 0),
(this.skip = void 0),
(this.stop = void 0),
t && Object.assign(this, t);
}
inRange(t, e, i) {
const s = this.options,
{ x: n, y: o } = this.getProps(["x", "y"], i);
return (
Math.pow(t - n, 2) + Math.pow(e - o, 2) <
Math.pow(s.hitRadius + s.radius, 2)
);
}
inXRange(t, e) {
return Kn(this, t, "x", e);
}
inYRange(t, e) {
return Kn(this, t, "y", e);
}
getCenterPoint(t) {
const { x: e, y: i } = this.getProps(["x", "y"], t);
return { x: e, y: i };
}
size(t) {
let e = (t = t || this.options || {}).radius || 0;
e = Math.max(e, (e && t.hoverRadius) || 0);
return 2 * (e + ((e && t.borderWidth) || 0));
}
draw(t, e) {
const i = this.options;
this.skip ||
i.radius < 0.1 ||
!Jt(this, e, this.size(i) / 2) ||
((t.strokeStyle = i.borderColor),
(t.lineWidth = i.borderWidth),
(t.fillStyle = i.backgroundColor),
Zt(t, i, this.x, this.y));
}
getRange() {
const t = this.options || {};
return t.radius + t.hitRadius;
}
}
function Zn(t, e) {
const {
x: i,
y: s,
base: n,
width: o,
height: a,
} = t.getProps(["x", "y", "base", "width", "height"], e);
let r, l, h, c, d;
return (
t.horizontal
? ((d = a / 2),
(r = Math.min(i, n)),
(l = Math.max(i, n)),
(h = s - d),
(c = s + d))
: ((d = o / 2),
(r = i - d),
(l = i + d),
(h = Math.min(s, n)),
(c = Math.max(s, n))),
{ left: r, top: h, right: l, bottom: c }
);
}
function Jn(t, e, i, s) {
return t ? 0 : jt(e, i, s);
}
function Qn(t) {
const e = Zn(t),
i = e.right - e.left,
s = e.bottom - e.top,
n = (function (t, e, i) {
const s = t.options.borderWidth,
n = t.borderSkipped,
o = Ve(s);
return {
t: Jn(n.top, o.top, 0, i),
r: Jn(n.right, o.right, 0, e),
b: Jn(n.bottom, o.bottom, 0, i),
l: Jn(n.left, o.left, 0, e),
};
})(t, i / 2, s / 2),
o = (function (t, e, i) {
const { enableBorderRadius: s } = t.getProps(["enableBorderRadius"]),
n = t.options.borderRadius,
o = We(n),
a = Math.min(e, i),
r = t.borderSkipped,
l = s || U(n);
return {
topLeft: Jn(!l || r.top || r.left, o.topLeft, 0, a),
topRight: Jn(!l || r.top || r.right, o.topRight, 0, a),
bottomLeft: Jn(!l || r.bottom || r.left, o.bottomLeft, 0, a),
bottomRight: Jn(!l || r.bottom || r.right, o.bottomRight, 0, a),
};
})(t, i / 2, s / 2);
return {
outer: { x: e.left, y: e.top, w: i, h: s, radius: o },
inner: {
x: e.left + n.l,
y: e.top + n.t,
w: i - n.l - n.r,
h: s - n.t - n.b,
radius: {
topLeft: Math.max(0, o.topLeft - Math.max(n.t, n.l)),
topRight: Math.max(0, o.topRight - Math.max(n.t, n.r)),
bottomLeft: Math.max(0, o.bottomLeft - Math.max(n.b, n.l)),
bottomRight: Math.max(0, o.bottomRight - Math.max(n.b, n.r)),
},
},
};
}
function to(t, e, i, s) {
const n = null === e,
o = null === i,
a = t && !(n && o) && Zn(t, s);
return a && (n || Yt(e, a.left, a.right)) && (o || Yt(i, a.top, a.bottom));
}
function eo(t, e) {
t.rect(e.x, e.y, e.w, e.h);
}
function io(t, e, i = {}) {
const s = t.x !== i.x ? -e : 0,
n = t.y !== i.y ? -e : 0,
o = (t.x + t.w !== i.x + i.w ? e : 0) - s,
a = (t.y + t.h !== i.y + i.h ? e : 0) - n;
return { x: t.x + s, y: t.y + n, w: t.w + o, h: t.h + a, radius: t.radius };
}
(Gn.id = "point"),
(Gn.defaults = {
borderWidth: 1,
hitRadius: 1,
hoverBorderWidth: 1,
hoverRadius: 4,
pointStyle: "circle",
radius: 3,
rotation: 0,
}),
(Gn.defaultRoutes = {
backgroundColor: "backgroundColor",
borderColor: "borderColor",
});
class so extends Ds {
constructor(t) {
super(),
(this.options = void 0),
(this.horizontal = void 0),
(this.base = void 0),
(this.width = void 0),
(this.height = void 0),
(this.inflateAmount = void 0),
t && Object.assign(this, t);
}
draw(t) {
const {
inflateAmount: e,
options: { borderColor: i, backgroundColor: s },
} = this,
{ inner: n, outer: o } = Qn(this),
a =
(r = o.radius).topLeft || r.topRight || r.bottomLeft || r.bottomRight
? oe
: eo;
var r;
t.save(),
(o.w === n.w && o.h === n.h) ||
(t.beginPath(),
a(t, io(o, e, n)),
t.clip(),
a(t, io(n, -e, o)),
(t.fillStyle = i),
t.fill("evenodd")),
t.beginPath(),
a(t, io(n, e)),
(t.fillStyle = s),
t.fill(),
t.restore();
}
inRange(t, e, i) {
return to(this, t, e, i);
}
inXRange(t, e) {
return to(this, t, null, e);
}
inYRange(t, e) {
return to(this, null, t, e);
}
getCenterPoint(t) {
const {
x: e,
y: i,
base: s,
horizontal: n,
} = this.getProps(["x", "y", "base", "horizontal"], t);
return { x: n ? (e + s) / 2 : e, y: n ? i : (i + s) / 2 };
}
getRange(t) {
return "x" === t ? this.width / 2 : this.height / 2;
}
}
(so.id = "bar"),
(so.defaults = {
borderSkipped: "start",
borderWidth: 0,
borderRadius: 0,
inflateAmount: "auto",
pointStyle: void 0,
}),
(so.defaultRoutes = {
backgroundColor: "backgroundColor",
borderColor: "borderColor",
});
var no = Object.freeze({
__proto__: null,
ArcElement: Vn,
LineElement: qn,
PointElement: Gn,
BarElement: so,
});
function oo(t) {
if (t._decimated) {
const e = t._data;
delete t._decimated,
delete t._data,
Object.defineProperty(t, "data", { value: e });
}
}
function ao(t) {
t.data.datasets.forEach((t) => {
oo(t);
});
}
var ro = {
id: "decimation",
defaults: { algorithm: "min-max", enabled: !1 },
beforeElementsUpdate: (t, e, i) => {
if (!i.enabled) return void ao(t);
const s = t.width;
t.data.datasets.forEach((e, n) => {
const { _data: o, indexAxis: a } = e,
r = t.getDatasetMeta(n),
l = o || e.data;
if ("y" === je([a, t.options.indexAxis])) return;
if ("line" !== r.type) return;
const h = t.scales[r.xAxisID];
if ("linear" !== h.type && "time" !== h.type) return;
if (t.options.parsing) return;
let { start: c, count: d } = (function (t, e) {
const i = e.length;
let s,
n = 0;
const { iScale: o } = t,
{
min: a,
max: r,
minDefined: l,
maxDefined: h,
} = o.getUserBounds();
return (
l && (n = jt(re(e, o.axis, a).lo, 0, i - 1)),
(s = h ? jt(re(e, o.axis, r).hi + 1, n, i) - n : i - n),
{ start: n, count: s }
);
})(r, l);
if (d <= (i.threshold || 4 * s)) return void oo(e);
let u;
switch (
($(o) &&
((e._data = l),
delete e.data,
Object.defineProperty(e, "data", {
configurable: !0,
enumerable: !0,
get: function () {
return this._decimated;
},
set: function (t) {
this._data = t;
},
})),
i.algorithm)
) {
case "lttb":
u = (function (t, e, i, s, n) {
const o = n.samples || s;
if (o >= i) return t.slice(e, e + i);
const a = [],
r = (i - 2) / (o - 2);
let l = 0;
const h = e + i - 1;
let c,
d,
u,
f,
g,
p = e;
for (a[l++] = t[p], c = 0; c < o - 2; c++) {
let s,
n = 0,
o = 0;
const h = Math.floor((c + 1) * r) + 1 + e,
m = Math.min(Math.floor((c + 2) * r) + 1, i) + e,
x = m - h;
for (s = h; s < m; s++) (n += t[s].x), (o += t[s].y);
(n /= x), (o /= x);
const b = Math.floor(c * r) + 1 + e,
_ = Math.min(Math.floor((c + 1) * r) + 1, i) + e,
{ x: y, y: v } = t[p];
for (u = f = -1, s = b; s < _; s++)
(f =
0.5 *
Math.abs((y - n) * (t[s].y - v) - (y - t[s].x) * (o - v))),
f > u && ((u = f), (d = t[s]), (g = s));
(a[l++] = d), (p = g);
}
return (a[l++] = t[h]), a;
})(l, c, d, s, i);
break;
case "min-max":
u = (function (t, e, i, s) {
let n,
o,
a,
r,
l,
h,
c,
d,
u,
f,
g = 0,
p = 0;
const m = [],
x = e + i - 1,
b = t[e].x,
_ = t[x].x - b;
for (n = e; n < e + i; ++n) {
(o = t[n]), (a = ((o.x - b) / _) * s), (r = o.y);
const e = 0 | a;
if (e === l)
r < u ? ((u = r), (h = n)) : r > f && ((f = r), (c = n)),
(g = (p * g + o.x) / ++p);
else {
const i = n - 1;
if (!$(h) && !$(c)) {
const e = Math.min(h, c),
s = Math.max(h, c);
e !== d && e !== i && m.push({ ...t[e], x: g }),
s !== d && s !== i && m.push({ ...t[s], x: g });
}
n > 0 && i !== d && m.push(t[i]),
m.push(o),
(l = e),
(p = 0),
(u = f = r),
(h = c = d = n);
}
}
return m;
})(l, c, d, s);
break;
default:
throw new Error(
`Unsupported decimation algorithm '${i.algorithm}'`
);
}
e._decimated = u;
});
},
destroy(t) {
ao(t);
},
};
function lo(t, e, i) {
const s = (function (t) {
const e = t.options,
i = e.fill;
let s = K(i && i.target, i);
return (
void 0 === s && (s = !!e.backgroundColor),
!1 !== s && null !== s && (!0 === s ? "origin" : s)
);
})(t);
if (U(s)) return !isNaN(s.value) && s;
let n = parseFloat(s);
return X(n) && Math.floor(n) === n
? (("-" !== s[0] && "+" !== s[0]) || (n = e + n),
!(n === e || n < 0 || n >= i) && n)
: ["origin", "start", "end", "stack", "shape"].indexOf(s) >= 0 && s;
}
class ho {
constructor(t) {
(this.x = t.x), (this.y = t.y), (this.radius = t.radius);
}
pathSegment(t, e, i) {
const { x: s, y: n, radius: o } = this;
return (
(e = e || { start: 0, end: yt }),
t.arc(s, n, o, e.end, e.start, !0),
!i.bounds
);
}
interpolate(t) {
const { x: e, y: i, radius: s } = this,
n = t.angle;
return { x: e + Math.cos(n) * s, y: i + Math.sin(n) * s, angle: n };
}
}
function co(t) {
return (t.scale || {}).getPointPositionForValue
? (function (t) {
const { scale: e, fill: i } = t,
s = e.options,
n = e.getLabels().length,
o = [],
a = s.reverse ? e.max : e.min,
r = s.reverse ? e.min : e.max;
let l, h, c;
if (
((c =
"start" === i
? a
: "end" === i
? r
: U(i)
? i.value
: e.getBaseValue()),
s.grid.circular)
)
return (
(h = e.getPointPositionForValue(0, a)),
new ho({
x: h.x,
y: h.y,
radius: e.getDistanceFromCenterForValue(c),
})
);
for (l = 0; l < n; ++l) o.push(e.getPointPositionForValue(l, c));
return o;
})(t)
: (function (t) {
const { scale: e = {}, fill: i } = t;
let s,
n = null;
return (
"start" === i
? (n = e.bottom)
: "end" === i
? (n = e.top)
: U(i)
? (n = e.getPixelForValue(i.value))
: e.getBasePixel && (n = e.getBasePixel()),
X(n)
? ((s = e.isHorizontal()), { x: s ? n : null, y: s ? null : n })
: null
);
})(t);
}
function uo(t, e, i) {
for (; e > t; e--) {
const t = i[e];
if (!isNaN(t.x) && !isNaN(t.y)) break;
}
return e;
}
function fo(t, e, i) {
const s = [];
for (let n = 0; n < i.length; n++) {
const o = i[n],
{ first: a, last: r, point: l } = go(o, e, "x");
if (!(!l || (a && r)))
if (a) s.unshift(l);
else if ((t.push(l), !r)) break;
}
t.push(...s);
}
function go(t, e, i) {
const s = t.interpolate(e, i);
if (!s) return {};
const n = s[i],
o = t.segments,
a = t.points;
let r = !1,
l = !1;
for (let t = 0; t < o.length; t++) {
const e = o[t],
s = a[e.start][i],
h = a[e.end][i];
if (Yt(n, s, h)) {
(r = n === s), (l = n === h);
break;
}
}
return { first: r, last: l, point: s };
}
function po(t) {
const { chart: e, fill: i, line: s } = t;
if (X(i))
return (function (t, e) {
const i = t.getDatasetMeta(e);
return i && t.isDatasetVisible(e) ? i.dataset : null;
})(e, i);
if ("stack" === i)
return (function (t) {
const { scale: e, index: i, line: s } = t,
n = [],
o = s.segments,
a = s.points,
r = (function (t, e) {
const i = [],
s = t.getMatchingVisibleMetas("line");
for (let t = 0; t < s.length; t++) {
const n = s[t];
if (n.index === e) break;
n.hidden || i.unshift(n.dataset);
}
return i;
})(e, i);
r.push(mo({ x: null, y: e.bottom }, s));
for (let t = 0; t < o.length; t++) {
const e = o[t];
for (let t = e.start; t <= e.end; t++) fo(n, a[t], r);
}
return new qn({ points: n, options: {} });
})(t);
if ("shape" === i) return !0;
const n = co(t);
return n instanceof ho ? n : mo(n, s);
}
function mo(t, e) {
let i = [],
s = !1;
return (
Y(t)
? ((s = !0), (i = t))
: (i = (function (t, e) {
const { x: i = null, y: s = null } = t || {},
n = e.points,
o = [];
return (
e.segments.forEach(({ start: t, end: e }) => {
e = uo(t, e, n);
const a = n[t],
r = n[e];
null !== s
? (o.push({ x: a.x, y: s }), o.push({ x: r.x, y: s }))
: null !== i &&
(o.push({ x: i, y: a.y }), o.push({ x: i, y: r.y }));
}),
o
);
})(t, e)),
i.length
? new qn({ points: i, options: { tension: 0 }, _loop: s, _fullLoop: s })
: null
);
}
function xo(t, e, i) {
let s = t[e].fill;
const n = [e];
let o;
if (!i) return s;
for (; !1 !== s && -1 === n.indexOf(s); ) {
if (!X(s)) return s;
if (((o = t[s]), !o)) return !1;
if (o.visible) return s;
n.push(s), (s = o.fill);
}
return !1;
}
function bo(t, e, i) {
const { segments: s, points: n } = e;
let o = !0,
a = !1;
t.beginPath();
for (const r of s) {
const { start: s, end: l } = r,
h = n[s],
c = n[uo(s, l, n)];
o
? (t.moveTo(h.x, h.y), (o = !1))
: (t.lineTo(h.x, i), t.lineTo(h.x, h.y)),
(a = !!e.pathSegment(t, r, { move: a })),
a ? t.closePath() : t.lineTo(c.x, i);
}
t.lineTo(e.first().x, i), t.closePath(), t.clip();
}
function _o(t, e, i, s) {
if (s) return;
let n = e[t],
o = i[t];
return (
"angle" === t && ((n = Nt(n)), (o = Nt(o))),
{ property: t, start: n, end: o }
);
}
function yo(t, e, i, s) {
return t && e ? s(t[i], e[i]) : t ? t[i] : e ? e[i] : 0;
}
function vo(t, e, i) {
const { top: s, bottom: n } = e.chart.chartArea,
{ property: o, start: a, end: r } = i || {};
"x" === o && (t.beginPath(), t.rect(a, s, r - a, n - s), t.clip());
}
function wo(t, e, i, s) {
const n = e.interpolate(i, s);
n && t.lineTo(n.x, n.y);
}
function Mo(t, e) {
const { line: i, target: s, property: n, color: o, scale: a } = e,
r = (function (t, e, i) {
const s = t.segments,
n = t.points,
o = e.points,
a = [];
for (const t of s) {
let { start: s, end: r } = t;
r = uo(s, r, n);
const l = _o(i, n[s], n[r], t.loop);
if (!e.segments) {
a.push({ source: t, target: l, start: n[s], end: n[r] });
continue;
}
const h = Wi(e, l);
for (const e of h) {
const s = _o(i, o[e.start], o[e.end], e.loop),
r = Vi(t, n, s);
for (const t of r)
a.push({
source: t,
target: e,
start: { [i]: yo(l, s, "start", Math.max) },
end: { [i]: yo(l, s, "end", Math.min) },
});
}
}
return a;
})(i, s, n);
for (const { source: e, target: l, start: h, end: c } of r) {
const { style: { backgroundColor: r = o } = {} } = e,
d = !0 !== s;
t.save(), (t.fillStyle = r), vo(t, a, d && _o(n, h, c)), t.beginPath();
const u = !!i.pathSegment(t, e);
let f;
if (d) {
u ? t.closePath() : wo(t, s, c, n);
const e = !!s.pathSegment(t, l, { move: u, reverse: !0 });
(f = u && e), f || wo(t, s, h, n);
}
t.closePath(), t.fill(f ? "evenodd" : "nonzero"), t.restore();
}
}
function ko(t, e, i) {
const s = po(e),
{ line: n, scale: o, axis: a } = e,
r = n.options,
l = r.fill,
h = r.backgroundColor,
{ above: c = h, below: d = h } = l || {};
s &&
n.points.length &&
(Qt(t, i),
(function (t, e) {
const { line: i, target: s, above: n, below: o, area: a, scale: r } = e,
l = i._loop ? "angle" : e.axis;
t.save(),
"x" === l &&
o !== n &&
(bo(t, s, a.top),
Mo(t, { line: i, target: s, color: n, scale: r, property: l }),
t.restore(),
t.save(),
bo(t, s, a.bottom)),
Mo(t, { line: i, target: s, color: o, scale: r, property: l }),
t.restore();
})(t, {
line: n,
target: s,
above: c,
below: d,
area: i,
scale: o,
axis: a,
}),
te(t));
}
var So = {
id: "filler",
afterDatasetsUpdate(t, e, i) {
const s = (t.data.datasets || []).length,
n = [];
let o, a, r, l;
for (a = 0; a < s; ++a)
(o = t.getDatasetMeta(a)),
(r = o.dataset),
(l = null),
r &&
r.options &&
r instanceof qn &&
(l = {
visible: t.isDatasetVisible(a),
index: a,
fill: lo(r, a, s),
chart: t,
axis: o.controller.options.indexAxis,
scale: o.vScale,
line: r,
}),
(o.$filler = l),
n.push(l);
for (a = 0; a < s; ++a)
(l = n[a]), l && !1 !== l.fill && (l.fill = xo(n, a, i.propagate));
},
beforeDraw(t, e, i) {
const s = "beforeDraw" === i.drawTime,
n = t.getSortedVisibleDatasetMetas(),
o = t.chartArea;
for (let e = n.length - 1; e >= 0; --e) {
const i = n[e].$filler;
i && (i.line.updateControlPoints(o, i.axis), s && ko(t.ctx, i, o));
}
},
beforeDatasetsDraw(t, e, i) {
if ("beforeDatasetsDraw" !== i.drawTime) return;
const s = t.getSortedVisibleDatasetMetas();
for (let e = s.length - 1; e >= 0; --e) {
const i = s[e].$filler;
i && ko(t.ctx, i, t.chartArea);
}
},
beforeDatasetDraw(t, e, i) {
const s = e.meta.$filler;
s &&
!1 !== s.fill &&
"beforeDatasetDraw" === i.drawTime &&
ko(t.ctx, s, t.chartArea);
},
defaults: { propagate: !0, drawTime: "beforeDatasetDraw" },
};
const Po = (t, e) => {
let { boxHeight: i = e, boxWidth: s = e } = t;
return (
t.usePointStyle && ((i = Math.min(i, e)), (s = Math.min(s, e))),
{ boxWidth: s, boxHeight: i, itemHeight: Math.max(e, i) }
);
};
class Do extends Ds {
constructor(t) {
super(),
(this._added = !1),
(this.legendHitBoxes = []),
(this._hoveredItem = null),
(this.doughnutMode = !1),
(this.chart = t.chart),
(this.options = t.options),
(this.ctx = t.ctx),
(this.legendItems = void 0),
(this.columnSizes = void 0),
(this.lineWidths = void 0),
(this.maxHeight = void 0),
(this.maxWidth = void 0),
(this.top = void 0),
(this.bottom = void 0),
(this.left = void 0),
(this.right = void 0),
(this.height = void 0),
(this.width = void 0),
(this._margins = void 0),
(this.position = void 0),
(this.weight = void 0),
(this.fullSize = void 0);
}
update(t, e, i) {
(this.maxWidth = t),
(this.maxHeight = e),
(this._margins = i),
this.setDimensions(),
this.buildLabels(),
this.fit();
}
setDimensions() {
this.isHorizontal()
? ((this.width = this.maxWidth),
(this.left = this._margins.left),
(this.right = this.width))
: ((this.height = this.maxHeight),
(this.top = this._margins.top),
(this.bottom = this.height));
}
buildLabels() {
const t = this.options.labels || {};
let e = J(t.generateLabels, [this.chart], this) || [];
t.filter && (e = e.filter((e) => t.filter(e, this.chart.data))),
t.sort && (e = e.sort((e, i) => t.sort(e, i, this.chart.data))),
this.options.reverse && e.reverse(),
(this.legendItems = e);
}
fit() {
const { options: t, ctx: e } = this;
if (!t.display) return void (this.width = this.height = 0);
const i = t.labels,
s = He(i.font),
n = s.size,
o = this._computeTitleHeight(),
{ boxWidth: a, itemHeight: r } = Po(i, n);
let l, h;
(e.font = s.string),
this.isHorizontal()
? ((l = this.maxWidth), (h = this._fitRows(o, n, a, r) + 10))
: ((h = this.maxHeight), (l = this._fitCols(o, n, a, r) + 10)),
(this.width = Math.min(l, t.maxWidth || this.maxWidth)),
(this.height = Math.min(h, t.maxHeight || this.maxHeight));
}
_fitRows(t, e, i, s) {
const {
ctx: n,
maxWidth: o,
options: {
labels: { padding: a },
},
} = this,
r = (this.legendHitBoxes = []),
l = (this.lineWidths = [0]),
h = s + a;
let c = t;
(n.textAlign = "left"), (n.textBaseline = "middle");
let d = -1,
u = -h;
return (
this.legendItems.forEach((t, f) => {
const g = i + e / 2 + n.measureText(t.text).width;
(0 === f || l[l.length - 1] + g + 2 * a > o) &&
((c += h), (l[l.length - (f > 0 ? 0 : 1)] = 0), (u += h), d++),
(r[f] = { left: 0, top: u, row: d, width: g, height: s }),
(l[l.length - 1] += g + a);
}),
c
);
}
_fitCols(t, e, i, s) {
const {
ctx: n,
maxHeight: o,
options: {
labels: { padding: a },
},
} = this,
r = (this.legendHitBoxes = []),
l = (this.columnSizes = []),
h = o - t;
let c = a,
d = 0,
u = 0,
f = 0,
g = 0;
return (
this.legendItems.forEach((t, o) => {
const p = i + e / 2 + n.measureText(t.text).width;
o > 0 &&
u + s + 2 * a > h &&
((c += d + a),
l.push({ width: d, height: u }),
(f += d + a),
g++,
(d = u = 0)),
(r[o] = { left: f, top: u, col: g, width: p, height: s }),
(d = Math.max(d, p)),
(u += s + a);
}),
(c += d),
l.push({ width: d, height: u }),
c
);
}
adjustHitBoxes() {
if (!this.options.display) return;
const t = this._computeTitleHeight(),
{
legendHitBoxes: e,
options: {
align: i,
labels: { padding: s },
rtl: o,
},
} = this,
a = Ei(o, this.left, this.width);
if (this.isHorizontal()) {
let o = 0,
r = n(i, this.left + s, this.right - this.lineWidths[o]);
for (const l of e)
o !== l.row &&
((o = l.row),
(r = n(i, this.left + s, this.right - this.lineWidths[o]))),
(l.top += this.top + t + s),
(l.left = a.leftForLtr(a.x(r), l.width)),
(r += l.width + s);
} else {
let o = 0,
r = n(i, this.top + t + s, this.bottom - this.columnSizes[o].height);
for (const l of e)
l.col !== o &&
((o = l.col),
(r = n(
i,
this.top + t + s,
this.bottom - this.columnSizes[o].height
))),
(l.top = r),
(l.left += this.left + s),
(l.left = a.leftForLtr(a.x(l.left), l.width)),
(r += l.height + s);
}
}
isHorizontal() {
return (
"top" === this.options.position || "bottom" === this.options.position
);
}
draw() {
if (this.options.display) {
const t = this.ctx;
Qt(t, this), this._draw(), te(t);
}
}
_draw() {
const { options: t, columnSizes: e, lineWidths: i, ctx: s } = this,
{ align: a, labels: r } = t,
l = bt.color,
h = Ei(t.rtl, this.left, this.width),
c = He(r.font),
{ color: d, padding: u } = r,
f = c.size,
g = f / 2;
let p;
this.drawTitle(),
(s.textAlign = h.textAlign("left")),
(s.textBaseline = "middle"),
(s.lineWidth = 0.5),
(s.font = c.string);
const { boxWidth: m, boxHeight: x, itemHeight: b } = Po(r, f),
_ = this.isHorizontal(),
y = this._computeTitleHeight();
(p = _
? {
x: n(a, this.left + u, this.right - i[0]),
y: this.top + u + y,
line: 0,
}
: {
x: this.left + u,
y: n(a, this.top + y + u, this.bottom - e[0].height),
line: 0,
}),
Ii(this.ctx, t.textDirection);
const v = b + u;
this.legendItems.forEach((w, M) => {
(s.strokeStyle = w.fontColor || d), (s.fillStyle = w.fontColor || d);
const k = s.measureText(w.text).width,
S = h.textAlign(w.textAlign || (w.textAlign = r.textAlign)),
P = m + g + k;
let D = p.x,
C = p.y;
h.setWidth(this.width),
_
? M > 0 &&
D + P + u > this.right &&
((C = p.y += v),
p.line++,
(D = p.x = n(a, this.left + u, this.right - i[p.line])))
: M > 0 &&
C + v > this.bottom &&
((D = p.x = D + e[p.line].width + u),
p.line++,
(C = p.y =
n(a, this.top + y + u, this.bottom - e[p.line].height)));
!(function (t, e, i) {
if (isNaN(m) || m <= 0 || isNaN(x) || x < 0) return;
s.save();
const n = K(i.lineWidth, 1);
if (
((s.fillStyle = K(i.fillStyle, l)),
(s.lineCap = K(i.lineCap, "butt")),
(s.lineDashOffset = K(i.lineDashOffset, 0)),
(s.lineJoin = K(i.lineJoin, "miter")),
(s.lineWidth = n),
(s.strokeStyle = K(i.strokeStyle, l)),
s.setLineDash(K(i.lineDash, [])),
r.usePointStyle)
) {
const o = {
radius: (m * Math.SQRT2) / 2,
pointStyle: i.pointStyle,
rotation: i.rotation,
borderWidth: n,
},
a = h.xPlus(t, m / 2);
Zt(s, o, a, e + g);
} else {
const o = e + Math.max((f - x) / 2, 0),
a = h.leftForLtr(t, m),
r = We(i.borderRadius);
s.beginPath(),
Object.values(r).some((t) => 0 !== t)
? oe(s, { x: a, y: o, w: m, h: x, radius: r })
: s.rect(a, o, m, x),
s.fill(),
0 !== n && s.stroke();
}
s.restore();
})(h.x(D), C, w),
(D = o(S, D + m + g, _ ? D + P : this.right, t.rtl)),
(function (t, e, i) {
se(s, i.text, t, e + b / 2, c, {
strikethrough: i.hidden,
textAlign: h.textAlign(i.textAlign),
});
})(h.x(D), C, w),
_ ? (p.x += P + u) : (p.y += v);
}),
zi(this.ctx, t.textDirection);
}
drawTitle() {
const t = this.options,
e = t.title,
i = He(e.font),
o = Ne(e.padding);
if (!e.display) return;
const a = Ei(t.rtl, this.left, this.width),
r = this.ctx,
l = e.position,
h = i.size / 2,
c = o.top + h;
let d,
u = this.left,
f = this.width;
if (this.isHorizontal())
(f = Math.max(...this.lineWidths)),
(d = this.top + c),
(u = n(t.align, u, this.right - f));
else {
const e = this.columnSizes.reduce((t, e) => Math.max(t, e.height), 0);
d =
c +
n(
t.align,
this.top,
this.bottom - e - t.labels.padding - this._computeTitleHeight()
);
}
const g = n(l, u, u + f);
(r.textAlign = a.textAlign(s(l))),
(r.textBaseline = "middle"),
(r.strokeStyle = e.color),
(r.fillStyle = e.color),
(r.font = i.string),
se(r, e.text, g, d, i);
}
_computeTitleHeight() {
const t = this.options.title,
e = He(t.font),
i = Ne(t.padding);
return t.display ? e.lineHeight + i.height : 0;
}
_getLegendItemAt(t, e) {
let i, s, n;
if (Yt(t, this.left, this.right) && Yt(e, this.top, this.bottom))
for (n = this.legendHitBoxes, i = 0; i < n.length; ++i)
if (
((s = n[i]),
Yt(t, s.left, s.left + s.width) && Yt(e, s.top, s.top + s.height))
)
return this.legendItems[i];
return null;
}
handleEvent(t) {
const e = this.options;
if (
!(function (t, e) {
if ("mousemove" === t && (e.onHover || e.onLeave)) return !0;
if (e.onClick && ("click" === t || "mouseup" === t)) return !0;
return !1;
})(t.type, e)
)
return;
const i = this._getLegendItemAt(t.x, t.y);
if ("mousemove" === t.type) {
const o = this._hoveredItem,
a =
((n = i),
null !== (s = o) &&
null !== n &&
s.datasetIndex === n.datasetIndex &&
s.index === n.index);
o && !a && J(e.onLeave, [t, o, this], this),
(this._hoveredItem = i),
i && !a && J(e.onHover, [t, i, this], this);
} else i && J(e.onClick, [t, i, this], this);
var s, n;
}
}
var Co = {
id: "legend",
_element: Do,
start(t, e, i) {
const s = (t.legend = new Do({ ctx: t.ctx, options: i, chart: t }));
ni.configure(t, s, i), ni.addBox(t, s);
},
stop(t) {
ni.removeBox(t, t.legend), delete t.legend;
},
beforeUpdate(t, e, i) {
const s = t.legend;
ni.configure(t, s, i), (s.options = i);
},
afterUpdate(t) {
const e = t.legend;
e.buildLabels(), e.adjustHitBoxes();
},
afterEvent(t, e) {
e.replay || t.legend.handleEvent(e.event);
},
defaults: {
display: !0,
position: "top",
align: "center",
fullSize: !0,
reverse: !1,
weight: 1e3,
onClick(t, e, i) {
const s = e.datasetIndex,
n = i.chart;
n.isDatasetVisible(s)
? (n.hide(s), (e.hidden = !0))
: (n.show(s), (e.hidden = !1));
},
onHover: null,
onLeave: null,
labels: {
color: (t) => t.chart.options.color,
boxWidth: 40,
padding: 10,
generateLabels(t) {
const e = t.data.datasets,
{
labels: {
usePointStyle: i,
pointStyle: s,
textAlign: n,
color: o,
},
} = t.legend.options;
return t._getSortedDatasetMetas().map((t) => {
const a = t.controller.getStyle(i ? 0 : void 0),
r = Ne(a.borderWidth);
return {
text: e[t.index].label,
fillStyle: a.backgroundColor,
fontColor: o,
hidden: !t.visible,
lineCap: a.borderCapStyle,
lineDash: a.borderDash,
lineDashOffset: a.borderDashOffset,
lineJoin: a.borderJoinStyle,
lineWidth: (r.width + r.height) / 4,
strokeStyle: a.borderColor,
pointStyle: s || a.pointStyle,
rotation: a.rotation,
textAlign: n || a.textAlign,
borderRadius: 0,
datasetIndex: t.index,
};
}, this);
},
},
title: {
color: (t) => t.chart.options.color,
display: !1,
position: "center",
text: "",
},
},
descriptors: {
_scriptable: (t) => !t.startsWith("on"),
labels: {
_scriptable: (t) => !["generateLabels", "filter", "sort"].includes(t),
},
},
};
class Oo extends Ds {
constructor(t) {
super(),
(this.chart = t.chart),
(this.options = t.options),
(this.ctx = t.ctx),
(this._padding = void 0),
(this.top = void 0),
(this.bottom = void 0),
(this.left = void 0),
(this.right = void 0),
(this.width = void 0),
(this.height = void 0),
(this.position = void 0),
(this.weight = void 0),
(this.fullSize = void 0);
}
update(t, e) {
const i = this.options;
if (((this.left = 0), (this.top = 0), !i.display))
return void (this.width = this.height = this.right = this.bottom = 0);
(this.width = this.right = t), (this.height = this.bottom = e);
const s = Y(i.text) ? i.text.length : 1;
this._padding = Ne(i.padding);
const n = s * He(i.font).lineHeight + this._padding.height;
this.isHorizontal() ? (this.height = n) : (this.width = n);
}
isHorizontal() {
const t = this.options.position;
return "top" === t || "bottom" === t;
}
_drawArgs(t) {
const { top: e, left: i, bottom: s, right: o, options: a } = this,
r = a.align;
let l,
h,
c,
d = 0;
return (
this.isHorizontal()
? ((h = n(r, i, o)), (c = e + t), (l = o - i))
: ("left" === a.position
? ((h = i + t), (c = n(r, s, e)), (d = -0.5 * _t))
: ((h = o - t), (c = n(r, e, s)), (d = 0.5 * _t)),
(l = s - e)),
{ titleX: h, titleY: c, maxWidth: l, rotation: d }
);
}
draw() {
const t = this.ctx,
e = this.options;
if (!e.display) return;
const i = He(e.font),
n = i.lineHeight / 2 + this._padding.top,
{ titleX: o, titleY: a, maxWidth: r, rotation: l } = this._drawArgs(n);
se(t, e.text, 0, 0, i, {
color: e.color,
maxWidth: r,
rotation: l,
textAlign: s(e.align),
textBaseline: "middle",
translation: [o, a],
});
}
}
var Ao = {
id: "title",
_element: Oo,
start(t, e, i) {
!(function (t, e) {
const i = new Oo({ ctx: t.ctx, options: e, chart: t });
ni.configure(t, i, e), ni.addBox(t, i), (t.titleBlock = i);
})(t, i);
},
stop(t) {
const e = t.titleBlock;
ni.removeBox(t, e), delete t.titleBlock;
},
beforeUpdate(t, e, i) {
const s = t.titleBlock;
ni.configure(t, s, i), (s.options = i);
},
defaults: {
align: "center",
display: !1,
font: { weight: "bold" },
fullSize: !0,
padding: 10,
position: "top",
text: "",
weight: 2e3,
},
defaultRoutes: { color: "color" },
descriptors: { _scriptable: !0, _indexable: !1 },
};
const To = new WeakMap();
var Lo = {
id: "subtitle",
start(t, e, i) {
const s = new Oo({ ctx: t.ctx, options: i, chart: t });
ni.configure(t, s, i), ni.addBox(t, s), To.set(t, s);
},
stop(t) {
ni.removeBox(t, To.get(t)), To.delete(t);
},
beforeUpdate(t, e, i) {
const s = To.get(t);
ni.configure(t, s, i), (s.options = i);
},
defaults: {
align: "center",
display: !1,
font: { weight: "normal" },
fullSize: !0,
padding: 0,
position: "top",
text: "",
weight: 1500,
},
defaultRoutes: { color: "color" },
descriptors: { _scriptable: !0, _indexable: !1 },
};
const Ro = {
average(t) {
if (!t.length) return !1;
let e,
i,
s = 0,
n = 0,
o = 0;
for (e = 0, i = t.length; e < i; ++e) {
const i = t[e].element;
if (i && i.hasValue()) {
const t = i.tooltipPosition();
(s += t.x), (n += t.y), ++o;
}
}
return { x: s / o, y: n / o };
},
nearest(t, e) {
if (!t.length) return !1;
let i,
s,
n,
o = e.x,
a = e.y,
r = Number.POSITIVE_INFINITY;
for (i = 0, s = t.length; i < s; ++i) {
const s = t[i].element;
if (s && s.hasValue()) {
const t = Vt(e, s.getCenterPoint());
t < r && ((r = t), (n = s));
}
}
if (n) {
const t = n.tooltipPosition();
(o = t.x), (a = t.y);
}
return { x: o, y: a };
},
};
function Eo(t, e) {
return e && (Y(e) ? Array.prototype.push.apply(t, e) : t.push(e)), t;
}
function Io(t) {
return ("string" == typeof t || t instanceof String) && t.indexOf("\n") > -1
? t.split("\n")
: t;
}
function zo(t, e) {
const { element: i, datasetIndex: s, index: n } = e,
o = t.getDatasetMeta(s).controller,
{ label: a, value: r } = o.getLabelAndValue(n);
return {
chart: t,
label: a,
parsed: o.getParsed(n),
raw: t.data.datasets[s].data[n],
formattedValue: r,
dataset: o.getDataset(),
dataIndex: n,
datasetIndex: s,
element: i,
};
}
function Fo(t, e) {
const i = t.chart.ctx,
{ body: s, footer: n, title: o } = t,
{ boxWidth: a, boxHeight: r } = e,
l = He(e.bodyFont),
h = He(e.titleFont),
c = He(e.footerFont),
d = o.length,
u = n.length,
f = s.length,
g = Ne(e.padding);
let p = g.height,
m = 0,
x = s.reduce(
(t, e) => t + e.before.length + e.lines.length + e.after.length,
0
);
if (
((x += t.beforeBody.length + t.afterBody.length),
d &&
(p +=
d * h.lineHeight + (d - 1) * e.titleSpacing + e.titleMarginBottom),
x)
) {
p +=
f * (e.displayColors ? Math.max(r, l.lineHeight) : l.lineHeight) +
(x - f) * l.lineHeight +
(x - 1) * e.bodySpacing;
}
u &&
(p += e.footerMarginTop + u * c.lineHeight + (u - 1) * e.footerSpacing);
let b = 0;
const _ = function (t) {
m = Math.max(m, i.measureText(t).width + b);
};
return (
i.save(),
(i.font = h.string),
Q(t.title, _),
(i.font = l.string),
Q(t.beforeBody.concat(t.afterBody), _),
(b = e.displayColors ? a + 2 + e.boxPadding : 0),
Q(s, (t) => {
Q(t.before, _), Q(t.lines, _), Q(t.after, _);
}),
(b = 0),
(i.font = c.string),
Q(t.footer, _),
i.restore(),
(m += g.width),
{ width: m, height: p }
);
}
function Bo(t, e, i, s) {
const { x: n, width: o } = i,
{
width: a,
chartArea: { left: r, right: l },
} = t;
let h = "center";
return (
"center" === s
? (h = n <= (r + l) / 2 ? "left" : "right")
: n <= o / 2
? (h = "left")
: n >= a - o / 2 && (h = "right"),
(function (t, e, i, s) {
const { x: n, width: o } = s,
a = i.caretSize + i.caretPadding;
return (
("left" === t && n + o + a > e.width) ||
("right" === t && n - o - a < 0) ||
void 0
);
})(h, t, e, i) && (h = "center"),
h
);
}
function Vo(t, e, i) {
const s =
i.yAlign ||
e.yAlign ||
(function (t, e) {
const { y: i, height: s } = e;
return i < s / 2 ? "top" : i > t.height - s / 2 ? "bottom" : "center";
})(t, i);
return { xAlign: i.xAlign || e.xAlign || Bo(t, e, i, s), yAlign: s };
}
function Wo(t, e, i, s) {
const { caretSize: n, caretPadding: o, cornerRadius: a } = t,
{ xAlign: r, yAlign: l } = i,
h = n + o,
{ topLeft: c, topRight: d, bottomLeft: u, bottomRight: f } = We(a);
let g = (function (t, e) {
let { x: i, width: s } = t;
return "right" === e ? (i -= s) : "center" === e && (i -= s / 2), i;
})(e, r);
const p = (function (t, e, i) {
let { y: s, height: n } = t;
return "top" === e ? (s += i) : (s -= "bottom" === e ? n + i : n / 2), s;
})(e, l, h);
return (
"center" === l
? "left" === r
? (g += h)
: "right" === r && (g -= h)
: "left" === r
? (g -= Math.max(c, u) + n)
: "right" === r && (g += Math.max(d, f) + n),
{ x: jt(g, 0, s.width - e.width), y: jt(p, 0, s.height - e.height) }
);
}
function No(t, e, i) {
const s = Ne(i.padding);
return "center" === e
? t.x + t.width / 2
: "right" === e
? t.x + t.width - s.right
: t.x + s.left;
}
function Ho(t) {
return Eo([], Io(t));
}
function jo(t, e) {
const i =
e && e.dataset && e.dataset.tooltip && e.dataset.tooltip.callbacks;
return i ? t.override(i) : t;
}
class $o extends Ds {
constructor(t) {
super(),
(this.opacity = 0),
(this._active = []),
(this._eventPosition = void 0),
(this._size = void 0),
(this._cachedAnimations = void 0),
(this._tooltipItems = []),
(this.$animations = void 0),
(this.$context = void 0),
(this.chart = t.chart || t._chart),
(this._chart = this.chart),
(this.options = t.options),
(this.dataPoints = void 0),
(this.title = void 0),
(this.beforeBody = void 0),
(this.body = void 0),
(this.afterBody = void 0),
(this.footer = void 0),
(this.xAlign = void 0),
(this.yAlign = void 0),
(this.x = void 0),
(this.y = void 0),
(this.height = void 0),
(this.width = void 0),
(this.caretX = void 0),
(this.caretY = void 0),
(this.labelColors = void 0),
(this.labelPointStyles = void 0),
(this.labelTextColors = void 0);
}
initialize(t) {
(this.options = t),
(this._cachedAnimations = void 0),
(this.$context = void 0);
}
_resolveAnimations() {
const t = this._cachedAnimations;
if (t) return t;
const e = this.chart,
i = this.options.setContext(this.getContext()),
s = i.enabled && e.options.animation && i.animations,
n = new gs(this.chart, s);
return s._cacheable && (this._cachedAnimations = Object.freeze(n)), n;
}
getContext() {
return (
this.$context ||
(this.$context =
((t = this.chart.getContext()),
(e = this),
(i = this._tooltipItems),
Ye(t, { tooltip: e, tooltipItems: i, type: "tooltip" })))
);
var t, e, i;
}
getTitle(t, e) {
const { callbacks: i } = e,
s = i.beforeTitle.apply(this, [t]),
n = i.title.apply(this, [t]),
o = i.afterTitle.apply(this, [t]);
let a = [];
return (a = Eo(a, Io(s))), (a = Eo(a, Io(n))), (a = Eo(a, Io(o))), a;
}
getBeforeBody(t, e) {
return Ho(e.callbacks.beforeBody.apply(this, [t]));
}
getBody(t, e) {
const { callbacks: i } = e,
s = [];
return (
Q(t, (t) => {
const e = { before: [], lines: [], after: [] },
n = jo(i, t);
Eo(e.before, Io(n.beforeLabel.call(this, t))),
Eo(e.lines, n.label.call(this, t)),
Eo(e.after, Io(n.afterLabel.call(this, t))),
s.push(e);
}),
s
);
}
getAfterBody(t, e) {
return Ho(e.callbacks.afterBody.apply(this, [t]));
}
getFooter(t, e) {
const { callbacks: i } = e,
s = i.beforeFooter.apply(this, [t]),
n = i.footer.apply(this, [t]),
o = i.afterFooter.apply(this, [t]);
let a = [];
return (a = Eo(a, Io(s))), (a = Eo(a, Io(n))), (a = Eo(a, Io(o))), a;
}
_createItems(t) {
const e = this._active,
i = this.chart.data,
s = [],
n = [],
o = [];
let a,
r,
l = [];
for (a = 0, r = e.length; a < r; ++a) l.push(zo(this.chart, e[a]));
return (
t.filter && (l = l.filter((e, s, n) => t.filter(e, s, n, i))),
t.itemSort && (l = l.sort((e, s) => t.itemSort(e, s, i))),
Q(l, (e) => {
const i = jo(t.callbacks, e);
s.push(i.labelColor.call(this, e)),
n.push(i.labelPointStyle.call(this, e)),
o.push(i.labelTextColor.call(this, e));
}),
(this.labelColors = s),
(this.labelPointStyles = n),
(this.labelTextColors = o),
(this.dataPoints = l),
l
);
}
update(t, e) {
const i = this.options.setContext(this.getContext()),
s = this._active;
let n,
o = [];
if (s.length) {
const t = Ro[i.position].call(this, s, this._eventPosition);
(o = this._createItems(i)),
(this.title = this.getTitle(o, i)),
(this.beforeBody = this.getBeforeBody(o, i)),
(this.body = this.getBody(o, i)),
(this.afterBody = this.getAfterBody(o, i)),
(this.footer = this.getFooter(o, i));
const e = (this._size = Fo(this, i)),
a = Object.assign({}, t, e),
r = Vo(this.chart, i, a),
l = Wo(i, a, r, this.chart);
(this.xAlign = r.xAlign),
(this.yAlign = r.yAlign),
(n = {
opacity: 1,
x: l.x,
y: l.y,
width: e.width,
height: e.height,
caretX: t.x,
caretY: t.y,
});
} else 0 !== this.opacity && (n = { opacity: 0 });
(this._tooltipItems = o),
(this.$context = void 0),
n && this._resolveAnimations().update(this, n),
t &&
i.external &&
i.external.call(this, {
chart: this.chart,
tooltip: this,
replay: e,
});
}
drawCaret(t, e, i, s) {
const n = this.getCaretPosition(t, i, s);
e.lineTo(n.x1, n.y1), e.lineTo(n.x2, n.y2), e.lineTo(n.x3, n.y3);
}
getCaretPosition(t, e, i) {
const { xAlign: s, yAlign: n } = this,
{ caretSize: o, cornerRadius: a } = i,
{ topLeft: r, topRight: l, bottomLeft: h, bottomRight: c } = We(a),
{ x: d, y: u } = t,
{ width: f, height: g } = e;
let p, m, x, b, _, y;
return (
"center" === n
? ((_ = u + g / 2),
"left" === s
? ((p = d), (m = p - o), (b = _ + o), (y = _ - o))
: ((p = d + f), (m = p + o), (b = _ - o), (y = _ + o)),
(x = p))
: ((m =
"left" === s
? d + Math.max(r, h) + o
: "right" === s
? d + f - Math.max(l, c) - o
: this.caretX),
"top" === n
? ((b = u), (_ = b - o), (p = m - o), (x = m + o))
: ((b = u + g), (_ = b + o), (p = m + o), (x = m - o)),
(y = b)),
{ x1: p, x2: m, x3: x, y1: b, y2: _, y3: y }
);
}
drawTitle(t, e, i) {
const s = this.title,
n = s.length;
let o, a, r;
if (n) {
const l = Ei(i.rtl, this.x, this.width);
for (
t.x = No(this, i.titleAlign, i),
e.textAlign = l.textAlign(i.titleAlign),
e.textBaseline = "middle",
o = He(i.titleFont),
a = i.titleSpacing,
e.fillStyle = i.titleColor,
e.font = o.string,
r = 0;
r < n;
++r
)
e.fillText(s[r], l.x(t.x), t.y + o.lineHeight / 2),
(t.y += o.lineHeight + a),
r + 1 === n && (t.y += i.titleMarginBottom - a);
}
}
_drawColorBox(t, e, i, s, n) {
const o = this.labelColors[i],
a = this.labelPointStyles[i],
{ boxHeight: r, boxWidth: l, boxPadding: h } = n,
c = He(n.bodyFont),
d = No(this, "left", n),
u = s.x(d),
f = r < c.lineHeight ? (c.lineHeight - r) / 2 : 0,
g = e.y + f;
if (n.usePointStyle) {
const e = {
radius: Math.min(l, r) / 2,
pointStyle: a.pointStyle,
rotation: a.rotation,
borderWidth: 1,
},
i = s.leftForLtr(u, l) + l / 2,
h = g + r / 2;
(t.strokeStyle = n.multiKeyBackground),
(t.fillStyle = n.multiKeyBackground),
Zt(t, e, i, h),
(t.strokeStyle = o.borderColor),
(t.fillStyle = o.backgroundColor),
Zt(t, e, i, h);
} else {
(t.lineWidth = o.borderWidth || 1),
(t.strokeStyle = o.borderColor),
t.setLineDash(o.borderDash || []),
(t.lineDashOffset = o.borderDashOffset || 0);
const e = s.leftForLtr(u, l - h),
i = s.leftForLtr(s.xPlus(u, 1), l - h - 2),
a = We(o.borderRadius);
Object.values(a).some((t) => 0 !== t)
? (t.beginPath(),
(t.fillStyle = n.multiKeyBackground),
oe(t, { x: e, y: g, w: l, h: r, radius: a }),
t.fill(),
t.stroke(),
(t.fillStyle = o.backgroundColor),
t.beginPath(),
oe(t, { x: i, y: g + 1, w: l - 2, h: r - 2, radius: a }),
t.fill())
: ((t.fillStyle = n.multiKeyBackground),
t.fillRect(e, g, l, r),
t.strokeRect(e, g, l, r),
(t.fillStyle = o.backgroundColor),
t.fillRect(i, g + 1, l - 2, r - 2));
}
t.fillStyle = this.labelTextColors[i];
}
drawBody(t, e, i) {
const { body: s } = this,
{
bodySpacing: n,
bodyAlign: o,
displayColors: a,
boxHeight: r,
boxWidth: l,
boxPadding: h,
} = i,
c = He(i.bodyFont);
let d = c.lineHeight,
u = 0;
const f = Ei(i.rtl, this.x, this.width),
g = function (i) {
e.fillText(i, f.x(t.x + u), t.y + d / 2), (t.y += d + n);
},
p = f.textAlign(o);
let m, x, b, _, y, v, w;
for (
e.textAlign = o,
e.textBaseline = "middle",
e.font = c.string,
t.x = No(this, p, i),
e.fillStyle = i.bodyColor,
Q(this.beforeBody, g),
u = a && "right" !== p ? ("center" === o ? l / 2 + h : l + 2 + h) : 0,
_ = 0,
v = s.length;
_ < v;
++_
) {
for (
m = s[_],
x = this.labelTextColors[_],
e.fillStyle = x,
Q(m.before, g),
b = m.lines,
a &&
b.length &&
(this._drawColorBox(e, t, _, f, i),
(d = Math.max(c.lineHeight, r))),
y = 0,
w = b.length;
y < w;
++y
)
g(b[y]), (d = c.lineHeight);
Q(m.after, g);
}
(u = 0), (d = c.lineHeight), Q(this.afterBody, g), (t.y -= n);
}
drawFooter(t, e, i) {
const s = this.footer,
n = s.length;
let o, a;
if (n) {
const r = Ei(i.rtl, this.x, this.width);
for (
t.x = No(this, i.footerAlign, i),
t.y += i.footerMarginTop,
e.textAlign = r.textAlign(i.footerAlign),
e.textBaseline = "middle",
o = He(i.footerFont),
e.fillStyle = i.footerColor,
e.font = o.string,
a = 0;
a < n;
++a
)
e.fillText(s[a], r.x(t.x), t.y + o.lineHeight / 2),
(t.y += o.lineHeight + i.footerSpacing);
}
}
drawBackground(t, e, i, s) {
const { xAlign: n, yAlign: o } = this,
{ x: a, y: r } = t,
{ width: l, height: h } = i,
{
topLeft: c,
topRight: d,
bottomLeft: u,
bottomRight: f,
} = We(s.cornerRadius);
(e.fillStyle = s.backgroundColor),
(e.strokeStyle = s.borderColor),
(e.lineWidth = s.borderWidth),
e.beginPath(),
e.moveTo(a + c, r),
"top" === o && this.drawCaret(t, e, i, s),
e.lineTo(a + l - d, r),
e.quadraticCurveTo(a + l, r, a + l, r + d),
"center" === o && "right" === n && this.drawCaret(t, e, i, s),
e.lineTo(a + l, r + h - f),
e.quadraticCurveTo(a + l, r + h, a + l - f, r + h),
"bottom" === o && this.drawCaret(t, e, i, s),
e.lineTo(a + u, r + h),
e.quadraticCurveTo(a, r + h, a, r + h - u),
"center" === o && "left" === n && this.drawCaret(t, e, i, s),
e.lineTo(a, r + c),
e.quadraticCurveTo(a, r, a + c, r),
e.closePath(),
e.fill(),
s.borderWidth > 0 && e.stroke();
}
_updateAnimationTarget(t) {
const e = this.chart,
i = this.$animations,
s = i && i.x,
n = i && i.y;
if (s || n) {
const i = Ro[t.position].call(this, this._active, this._eventPosition);
if (!i) return;
const o = (this._size = Fo(this, t)),
a = Object.assign({}, i, this._size),
r = Vo(e, t, a),
l = Wo(t, a, r, e);
(s._to === l.x && n._to === l.y) ||
((this.xAlign = r.xAlign),
(this.yAlign = r.yAlign),
(this.width = o.width),
(this.height = o.height),
(this.caretX = i.x),
(this.caretY = i.y),
this._resolveAnimations().update(this, l));
}
}
draw(t) {
const e = this.options.setContext(this.getContext());
let i = this.opacity;
if (!i) return;
this._updateAnimationTarget(e);
const s = { width: this.width, height: this.height },
n = { x: this.x, y: this.y };
i = Math.abs(i) < 0.001 ? 0 : i;
const o = Ne(e.padding),
a =
this.title.length ||
this.beforeBody.length ||
this.body.length ||
this.afterBody.length ||
this.footer.length;
e.enabled &&
a &&
(t.save(),
(t.globalAlpha = i),
this.drawBackground(n, t, s, e),
Ii(t, e.textDirection),
(n.y += o.top),
this.drawTitle(n, t, e),
this.drawBody(n, t, e),
this.drawFooter(n, t, e),
zi(t, e.textDirection),
t.restore());
}
getActiveElements() {
return this._active || [];
}
setActiveElements(t, e) {
const i = this._active,
s = t.map(({ datasetIndex: t, index: e }) => {
const i = this.chart.getDatasetMeta(t);
if (!i) throw new Error("Cannot find a dataset at index " + t);
return { datasetIndex: t, element: i.data[e], index: e };
}),
n = !tt(i, s),
o = this._positionChanged(s, e);
(n || o) &&
((this._active = s),
(this._eventPosition = e),
(this._ignoreReplayEvents = !0),
this.update(!0));
}
handleEvent(t, e, i = !0) {
if (e && this._ignoreReplayEvents) return !1;
this._ignoreReplayEvents = !1;
const s = this.options,
n = this._active || [],
o = this._getActiveElements(t, n, e, i),
a = this._positionChanged(o, t),
r = e || !tt(o, n) || a;
return (
r &&
((this._active = o),
(s.enabled || s.external) &&
((this._eventPosition = { x: t.x, y: t.y }), this.update(!0, e))),
r
);
}
_getActiveElements(t, e, i, s) {
const n = this.options;
if ("mouseout" === t.type) return [];
if (!s) return e;
const o = this.chart.getElementsAtEventForMode(t, n.mode, n, i);
return n.reverse && o.reverse(), o;
}
_positionChanged(t, e) {
const { caretX: i, caretY: s, options: n } = this,
o = Ro[n.position].call(this, t, e);
return !1 !== o && (i !== o.x || s !== o.y);
}
}
$o.positioners = Ro;
var Yo = {
id: "tooltip",
_element: $o,
positioners: Ro,
afterInit(t, e, i) {
i && (t.tooltip = new $o({ chart: t, options: i }));
},
beforeUpdate(t, e, i) {
t.tooltip && t.tooltip.initialize(i);
},
reset(t, e, i) {
t.tooltip && t.tooltip.initialize(i);
},
afterDraw(t) {
const e = t.tooltip,
i = { tooltip: e };
!1 !== t.notifyPlugins("beforeTooltipDraw", i) &&
(e && e.draw(t.ctx), t.notifyPlugins("afterTooltipDraw", i));
},
afterEvent(t, e) {
if (t.tooltip) {
const i = e.replay;
t.tooltip.handleEvent(e.event, i, e.inChartArea) && (e.changed = !0);
}
},
defaults: {
enabled: !0,
external: null,
position: "average",
backgroundColor: "rgba(0,0,0,0.8)",
titleColor: "#fff",
titleFont: { weight: "bold" },
titleSpacing: 2,
titleMarginBottom: 6,
titleAlign: "left",
bodyColor: "#fff",
bodySpacing: 2,
bodyFont: {},
bodyAlign: "left",
footerColor: "#fff",
footerSpacing: 2,
footerMarginTop: 6,
footerFont: { weight: "bold" },
footerAlign: "left",
padding: 6,
caretPadding: 2,
caretSize: 5,
cornerRadius: 6,
boxHeight: (t, e) => e.bodyFont.size,
boxWidth: (t, e) => e.bodyFont.size,
multiKeyBackground: "#fff",
displayColors: !0,
boxPadding: 0,
borderColor: "rgba(0,0,0,0)",
borderWidth: 0,
animation: { duration: 400, easing: "easeOutQuart" },
animations: {
numbers: {
type: "number",
properties: ["x", "y", "width", "height", "caretX", "caretY"],
},
opacity: { easing: "linear", duration: 200 },
},
callbacks: {
beforeTitle: H,
title(t) {
if (t.length > 0) {
const e = t[0],
i = e.chart.data.labels,
s = i ? i.length : 0;
if (this && this.options && "dataset" === this.options.mode)
return e.dataset.label || "";
if (e.label) return e.label;
if (s > 0 && e.dataIndex < s) return i[e.dataIndex];
}
return "";
},
afterTitle: H,
beforeBody: H,
beforeLabel: H,
label(t) {
if (this && this.options && "dataset" === this.options.mode)
return t.label + ": " + t.formattedValue || t.formattedValue;
let e = t.dataset.label || "";
e && (e += ": ");
const i = t.formattedValue;
return $(i) || (e += i), e;
},
labelColor(t) {
const e = t.chart
.getDatasetMeta(t.datasetIndex)
.controller.getStyle(t.dataIndex);
return {
borderColor: e.borderColor,
backgroundColor: e.backgroundColor,
borderWidth: e.borderWidth,
borderDash: e.borderDash,
borderDashOffset: e.borderDashOffset,
borderRadius: 0,
};
},
labelTextColor() {
return this.options.bodyColor;
},
labelPointStyle(t) {
const e = t.chart
.getDatasetMeta(t.datasetIndex)
.controller.getStyle(t.dataIndex);
return { pointStyle: e.pointStyle, rotation: e.rotation };
},
afterLabel: H,
afterBody: H,
beforeFooter: H,
footer: H,
afterFooter: H,
},
},
defaultRoutes: {
bodyFont: "font",
footerFont: "font",
titleFont: "font",
},
descriptors: {
_scriptable: (t) =>
"filter" !== t && "itemSort" !== t && "external" !== t,
_indexable: !1,
callbacks: { _scriptable: !1, _indexable: !1 },
animation: { _fallback: !1 },
animations: { _fallback: "animation" },
},
additionalOptionScopes: ["interaction"],
},
Uo = Object.freeze({
__proto__: null,
Decimation: ro,
Filler: So,
Legend: Co,
SubTitle: Lo,
Title: Ao,
Tooltip: Yo,
});
function Xo(t, e, i, s) {
const n = t.indexOf(e);
if (-1 === n)
return ((t, e, i, s) => (
"string" == typeof e
? ((i = t.push(e) - 1), s.unshift({ index: i, label: e }))
: isNaN(e) && (i = null),
i
))(t, e, i, s);
return n !== t.lastIndexOf(e) ? i : n;
}
class qo extends Bs {
constructor(t) {
super(t),
(this._startValue = void 0),
(this._valueRange = 0),
(this._addedLabels = []);
}
init(t) {
const e = this._addedLabels;
if (e.length) {
const t = this.getLabels();
for (const { index: i, label: s } of e) t[i] === s && t.splice(i, 1);
this._addedLabels = [];
}
super.init(t);
}
parse(t, e) {
if ($(t)) return null;
const i = this.getLabels();
return ((t, e) =>
null === t
? null
: jt(
Math.round(t),
0,
e
))((e = isFinite(e) && i[e] === t ? e : Xo(i, t, K(e, t), this._addedLabels)), i.length - 1);
}
determineDataLimits() {
const { minDefined: t, maxDefined: e } = this.getUserBounds();
let { min: i, max: s } = this.getMinMax(!0);
"ticks" === this.options.bounds &&
(t || (i = 0), e || (s = this.getLabels().length - 1)),
(this.min = i),
(this.max = s);
}
buildTicks() {
const t = this.min,
e = this.max,
i = this.options.offset,
s = [];
let n = this.getLabels();
(n = 0 === t && e === n.length - 1 ? n : n.slice(t, e + 1)),
(this._valueRange = Math.max(n.length - (i ? 0 : 1), 1)),
(this._startValue = this.min - (i ? 0.5 : 0));
for (let i = t; i <= e; i++) s.push({ value: i });
return s;
}
getLabelForValue(t) {
const e = this.getLabels();
return t >= 0 && t < e.length ? e[t] : t;
}
configure() {
super.configure(),
this.isHorizontal() || (this._reversePixels = !this._reversePixels);
}
getPixelForValue(t) {
return (
"number" != typeof t && (t = this.parse(t)),
null === t
? NaN
: this.getPixelForDecimal((t - this._startValue) / this._valueRange)
);
}
getPixelForTick(t) {
const e = this.ticks;
return t < 0 || t > e.length - 1
? null
: this.getPixelForValue(e[t].value);
}
getValueForPixel(t) {
return Math.round(
this._startValue + this.getDecimalForPixel(t) * this._valueRange
);
}
getBasePixel() {
return this.bottom;
}
}
function Ko(t, e, { horizontal: i, minRotation: s }) {
const n = It(s),
o = (i ? Math.sin(n) : Math.cos(n)) || 0.001,
a = 0.75 * e * ("" + t).length;
return Math.min(e / o, a);
}
(qo.id = "category"),
(qo.defaults = { ticks: { callback: qo.prototype.getLabelForValue } });
class Go extends Bs {
constructor(t) {
super(t),
(this.start = void 0),
(this.end = void 0),
(this._startValue = void 0),
(this._endValue = void 0),
(this._valueRange = 0);
}
parse(t, e) {
return $(t) ||
(("number" == typeof t || t instanceof Number) && !isFinite(+t))
? null
: +t;
}
handleTickRangeOptions() {
const { beginAtZero: t } = this.options,
{ minDefined: e, maxDefined: i } = this.getUserBounds();
let { min: s, max: n } = this;
const o = (t) => (s = e ? s : t),
a = (t) => (n = i ? n : t);
if (t) {
const t = Ct(s),
e = Ct(n);
t < 0 && e < 0 ? a(0) : t > 0 && e > 0 && o(0);
}
if (s === n) {
let e = 1;
(n >= Number.MAX_SAFE_INTEGER || s <= Number.MIN_SAFE_INTEGER) &&
(e = Math.abs(0.05 * n)),
a(n + e),
t || o(s - e);
}
(this.min = s), (this.max = n);
}
getTickLimit() {
const t = this.options.ticks;
let e,
{ maxTicksLimit: i, stepSize: s } = t;
return (
s
? ((e = Math.ceil(this.max / s) - Math.floor(this.min / s) + 1),
e > 1e3 &&
(console.warn(
`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`
),
(e = 1e3)))
: ((e = this.computeTickLimit()), (i = i || 11)),
i && (e = Math.min(i, e)),
e
);
}
computeTickLimit() {
return Number.POSITIVE_INFINITY;
}
buildTicks() {
const t = this.options,
e = t.ticks;
let i = this.getTickLimit();
i = Math.max(2, i);
const s = (function (t, e) {
const i = [],
{
bounds: s,
step: n,
min: o,
max: a,
precision: r,
count: l,
maxTicks: h,
maxDigits: c,
includeBounds: d,
} = t,
u = n || 1,
f = h - 1,
{ min: g, max: p } = e,
m = !$(o),
x = !$(a),
b = !$(l),
_ = (p - g) / (c + 1);
let y,
v,
w,
M,
k = Ot((p - g) / f / u) * u;
if (k < 1e-14 && !m && !x) return [{ value: g }, { value: p }];
(M = Math.ceil(p / k) - Math.floor(g / k)),
M > f && (k = Ot((M * k) / f / u) * u),
$(r) || ((y = Math.pow(10, r)), (k = Math.ceil(k * y) / y)),
"ticks" === s
? ((v = Math.floor(g / k) * k), (w = Math.ceil(p / k) * k))
: ((v = g), (w = p)),
m && x && n && Rt((a - o) / n, k / 1e3)
? ((M = Math.round(Math.min((a - o) / k, h))),
(k = (a - o) / M),
(v = o),
(w = a))
: b
? ((v = m ? o : v), (w = x ? a : w), (M = l - 1), (k = (w - v) / M))
: ((M = (w - v) / k),
(M = Lt(M, Math.round(M), k / 1e3)
? Math.round(M)
: Math.ceil(M)));
const S = Math.max(Ft(k), Ft(v));
(y = Math.pow(10, $(r) ? S : r)),
(v = Math.round(v * y) / y),
(w = Math.round(w * y) / y);
let P = 0;
for (
m &&
(d && v !== o
? (i.push({ value: o }),
v < o && P++,
Lt(Math.round((v + P * k) * y) / y, o, Ko(o, _, t)) && P++)
: v < o && P++);
P < M;
++P
)
i.push({ value: Math.round((v + P * k) * y) / y });
return (
x && d && w !== a
? i.length && Lt(i[i.length - 1].value, a, Ko(a, _, t))
? (i[i.length - 1].value = a)
: i.push({ value: a })
: (x && w !== a) || i.push({ value: w }),
i
);
})(
{
maxTicks: i,
bounds: t.bounds,
min: t.min,
max: t.max,
precision: e.precision,
step: e.stepSize,
count: e.count,
maxDigits: this._maxDigits(),
horizontal: this.isHorizontal(),
minRotation: e.minRotation || 0,
includeBounds: !1 !== e.includeBounds,
},
this._range || this
);
return (
"ticks" === t.bounds && Et(s, this, "value"),
t.reverse
? (s.reverse(), (this.start = this.max), (this.end = this.min))
: ((this.start = this.min), (this.end = this.max)),
s
);
}
configure() {
const t = this.ticks;
let e = this.min,
i = this.max;
if ((super.configure(), this.options.offset && t.length)) {
const s = (i - e) / Math.max(t.length - 1, 1) / 2;
(e -= s), (i += s);
}
(this._startValue = e), (this._endValue = i), (this._valueRange = i - e);
}
getLabelForValue(t) {
return Ri(t, this.chart.options.locale, this.options.ticks.format);
}
}
class Zo extends Go {
determineDataLimits() {
const { min: t, max: e } = this.getMinMax(!0);
(this.min = X(t) ? t : 0),
(this.max = X(e) ? e : 1),
this.handleTickRangeOptions();
}
computeTickLimit() {
const t = this.isHorizontal(),
e = t ? this.width : this.height,
i = It(this.options.ticks.minRotation),
s = (t ? Math.sin(i) : Math.cos(i)) || 0.001,
n = this._resolveTickFontOptions(0);
return Math.ceil(e / Math.min(40, n.lineHeight / s));
}
getPixelForValue(t) {
return null === t
? NaN
: this.getPixelForDecimal((t - this._startValue) / this._valueRange);
}
getValueForPixel(t) {
return this._startValue + this.getDecimalForPixel(t) * this._valueRange;
}
}
function Jo(t) {
return 1 === t / Math.pow(10, Math.floor(Dt(t)));
}
(Zo.id = "linear"),
(Zo.defaults = { ticks: { callback: Os.formatters.numeric } });
class Qo extends Bs {
constructor(t) {
super(t),
(this.start = void 0),
(this.end = void 0),
(this._startValue = void 0),
(this._valueRange = 0);
}
parse(t, e) {
const i = Go.prototype.parse.apply(this, [t, e]);
if (0 !== i) return X(i) && i > 0 ? i : null;
this._zero = !0;
}
determineDataLimits() {
const { min: t, max: e } = this.getMinMax(!0);
(this.min = X(t) ? Math.max(0, t) : null),
(this.max = X(e) ? Math.max(0, e) : null),
this.options.beginAtZero && (this._zero = !0),
this.handleTickRangeOptions();
}
handleTickRangeOptions() {
const { minDefined: t, maxDefined: e } = this.getUserBounds();
let i = this.min,
s = this.max;
const n = (e) => (i = t ? i : e),
o = (t) => (s = e ? s : t),
a = (t, e) => Math.pow(10, Math.floor(Dt(t)) + e);
i === s && (i <= 0 ? (n(1), o(10)) : (n(a(i, -1)), o(a(s, 1)))),
i <= 0 && n(a(s, -1)),
s <= 0 && o(a(i, 1)),
this._zero &&
this.min !== this._suggestedMin &&
i === a(this.min, 0) &&
n(a(i, -1)),
(this.min = i),
(this.max = s);
}
buildTicks() {
const t = this.options,
e = (function (t, e) {
const i = Math.floor(Dt(e.max)),
s = Math.ceil(e.max / Math.pow(10, i)),
n = [];
let o = q(t.min, Math.pow(10, Math.floor(Dt(e.min)))),
a = Math.floor(Dt(o)),
r = Math.floor(o / Math.pow(10, a)),
l = a < 0 ? Math.pow(10, Math.abs(a)) : 1;
do {
n.push({ value: o, major: Jo(o) }),
++r,
10 === r && ((r = 1), ++a, (l = a >= 0 ? 1 : l)),
(o = Math.round(r * Math.pow(10, a) * l) / l);
} while (a < i || (a === i && r < s));
const h = q(t.max, o);
return n.push({ value: h, major: Jo(o) }), n;
})({ min: this._userMin, max: this._userMax }, this);
return (
"ticks" === t.bounds && Et(e, this, "value"),
t.reverse
? (e.reverse(), (this.start = this.max), (this.end = this.min))
: ((this.start = this.min), (this.end = this.max)),
e
);
}
getLabelForValue(t) {
return void 0 === t
? "0"
: Ri(t, this.chart.options.locale, this.options.ticks.format);
}
configure() {
const t = this.min;
super.configure(),
(this._startValue = Dt(t)),
(this._valueRange = Dt(this.max) - Dt(t));
}
getPixelForValue(t) {
return (
(void 0 !== t && 0 !== t) || (t = this.min),
null === t || isNaN(t)
? NaN
: this.getPixelForDecimal(
t === this.min ? 0 : (Dt(t) - this._startValue) / this._valueRange
)
);
}
getValueForPixel(t) {
const e = this.getDecimalForPixel(t);
return Math.pow(10, this._startValue + e * this._valueRange);
}
}
function ta(t) {
const e = t.ticks;
if (e.display && t.display) {
const t = Ne(e.backdropPadding);
return K(e.font && e.font.size, bt.font.size) + t.height;
}
return 0;
}
function ea(t, e, i, s, n) {
return t === s || t === n
? { start: e - i / 2, end: e + i / 2 }
: t < s || t > n
? { start: e - i, end: e }
: { start: e, end: e + i };
}
function ia(t) {
const e = {
l: t.left + t._padding.left,
r: t.right - t._padding.right,
t: t.top + t._padding.top,
b: t.bottom - t._padding.bottom,
},
i = Object.assign({}, e),
s = [],
n = [],
o = t._pointLabels.length,
a = t.options.pointLabels,
r = a.centerPointLabels ? _t / o : 0;
for (let d = 0; d < o; d++) {
const o = a.setContext(t.getPointLabelContext(d));
n[d] = o.padding;
const u = t.getPointPosition(d, t.drawingArea + n[d], r),
f = He(o.font),
g =
((l = t.ctx),
(h = f),
(c = Y((c = t._pointLabels[d])) ? c : [c]),
{ w: qt(l, h.string, c), h: c.length * h.lineHeight });
s[d] = g;
const p = Nt(t.getIndexAngle(d) + r),
m = Math.round(zt(p));
sa(i, e, p, ea(m, u.x, g.w, 0, 180), ea(m, u.y, g.h, 90, 270));
}
var l, h, c;
t.setCenterPoint(e.l - i.l, i.r - e.r, e.t - i.t, i.b - e.b),
(t._pointLabelItems = (function (t, e, i) {
const s = [],
n = t._pointLabels.length,
o = t.options,
a = ta(o) / 2,
r = t.drawingArea,
l = o.pointLabels.centerPointLabels ? _t / n : 0;
for (let o = 0; o < n; o++) {
const n = t.getPointPosition(o, r + a + i[o], l),
h = Math.round(zt(Nt(n.angle + kt))),
c = e[o],
d = aa(n.y, c.h, h),
u = na(h),
f = oa(n.x, c.w, u);
s.push({
x: n.x,
y: d,
textAlign: u,
left: f,
top: d,
right: f + c.w,
bottom: d + c.h,
});
}
return s;
})(t, s, n));
}
function sa(t, e, i, s, n) {
const o = Math.abs(Math.sin(i)),
a = Math.abs(Math.cos(i));
let r = 0,
l = 0;
s.start < e.l
? ((r = (e.l - s.start) / o), (t.l = Math.min(t.l, e.l - r)))
: s.end > e.r &&
((r = (s.end - e.r) / o), (t.r = Math.max(t.r, e.r + r))),
n.start < e.t
? ((l = (e.t - n.start) / a), (t.t = Math.min(t.t, e.t - l)))
: n.end > e.b &&
((l = (n.end - e.b) / a), (t.b = Math.max(t.b, e.b + l)));
}
function na(t) {
return 0 === t || 180 === t ? "center" : t < 180 ? "left" : "right";
}
function oa(t, e, i) {
return "right" === i ? (t -= e) : "center" === i && (t -= e / 2), t;
}
function aa(t, e, i) {
return (
90 === i || 270 === i ? (t -= e / 2) : (i > 270 || i < 90) && (t -= e), t
);
}
function ra(t, e, i, s) {
const { ctx: n } = t;
if (i) n.arc(t.xCenter, t.yCenter, e, 0, yt);
else {
let i = t.getPointPosition(0, e);
n.moveTo(i.x, i.y);
for (let o = 1; o < s; o++)
(i = t.getPointPosition(o, e)), n.lineTo(i.x, i.y);
}
}
(Qo.id = "logarithmic"),
(Qo.defaults = {
ticks: { callback: Os.formatters.logarithmic, major: { enabled: !0 } },
});
class la extends Go {
constructor(t) {
super(t),
(this.xCenter = void 0),
(this.yCenter = void 0),
(this.drawingArea = void 0),
(this._pointLabels = []),
(this._pointLabelItems = []);
}
setDimensions() {
const t = (this._padding = Ne(ta(this.options) / 2)),
e = (this.width = this.maxWidth - t.width),
i = (this.height = this.maxHeight - t.height);
(this.xCenter = Math.floor(this.left + e / 2 + t.left)),
(this.yCenter = Math.floor(this.top + i / 2 + t.top)),
(this.drawingArea = Math.floor(Math.min(e, i) / 2));
}
determineDataLimits() {
const { min: t, max: e } = this.getMinMax(!1);
(this.min = X(t) && !isNaN(t) ? t : 0),
(this.max = X(e) && !isNaN(e) ? e : 0),
this.handleTickRangeOptions();
}
computeTickLimit() {
return Math.ceil(this.drawingArea / ta(this.options));
}
generateTickLabels(t) {
Go.prototype.generateTickLabels.call(this, t),
(this._pointLabels = this.getLabels()
.map((t, e) => {
const i = J(this.options.pointLabels.callback, [t, e], this);
return i || 0 === i ? i : "";
})
.filter((t, e) => this.chart.getDataVisibility(e)));
}
fit() {
const t = this.options;
t.display && t.pointLabels.display
? ia(this)
: this.setCenterPoint(0, 0, 0, 0);
}
setCenterPoint(t, e, i, s) {
(this.xCenter += Math.floor((t - e) / 2)),
(this.yCenter += Math.floor((i - s) / 2)),
(this.drawingArea -= Math.min(
this.drawingArea / 2,
Math.max(t, e, i, s)
));
}
getIndexAngle(t) {
return Nt(
t * (yt / (this._pointLabels.length || 1)) +
It(this.options.startAngle || 0)
);
}
getDistanceFromCenterForValue(t) {
if ($(t)) return NaN;
const e = this.drawingArea / (this.max - this.min);
return this.options.reverse ? (this.max - t) * e : (t - this.min) * e;
}
getValueForDistanceFromCenter(t) {
if ($(t)) return NaN;
const e = t / (this.drawingArea / (this.max - this.min));
return this.options.reverse ? this.max - e : this.min + e;
}
getPointLabelContext(t) {
const e = this._pointLabels || [];
if (t >= 0 && t < e.length) {
const i = e[t];
return (function (t, e, i) {
return Ye(t, { label: i, index: e, type: "pointLabel" });
})(this.getContext(), t, i);
}
}
getPointPosition(t, e, i = 0) {
const s = this.getIndexAngle(t) - kt + i;
return {
x: Math.cos(s) * e + this.xCenter,
y: Math.sin(s) * e + this.yCenter,
angle: s,
};
}
getPointPositionForValue(t, e) {
return this.getPointPosition(t, this.getDistanceFromCenterForValue(e));
}
getBasePosition(t) {
return this.getPointPositionForValue(t || 0, this.getBaseValue());
}
getPointLabelPosition(t) {
const { left: e, top: i, right: s, bottom: n } = this._pointLabelItems[t];
return { left: e, top: i, right: s, bottom: n };
}
drawBackground() {
const {
backgroundColor: t,
grid: { circular: e },
} = this.options;
if (t) {
const i = this.ctx;
i.save(),
i.beginPath(),
ra(
this,
this.getDistanceFromCenterForValue(this._endValue),
e,
this._pointLabels.length
),
i.closePath(),
(i.fillStyle = t),
i.fill(),
i.restore();
}
}
drawGrid() {
const t = this.ctx,
e = this.options,
{ angleLines: i, grid: s } = e,
n = this._pointLabels.length;
let o, a, r;
if (
(e.pointLabels.display &&
(function (t, e) {
const {
ctx: i,
options: { pointLabels: s },
} = t;
for (let n = e - 1; n >= 0; n--) {
const e = s.setContext(t.getPointLabelContext(n)),
o = He(e.font),
{
x: a,
y: r,
textAlign: l,
left: h,
top: c,
right: d,
bottom: u,
} = t._pointLabelItems[n],
{ backdropColor: f } = e;
if (!$(f)) {
const t = Ne(e.backdropPadding);
(i.fillStyle = f),
i.fillRect(
h - t.left,
c - t.top,
d - h + t.width,
u - c + t.height
);
}
se(i, t._pointLabels[n], a, r + o.lineHeight / 2, o, {
color: e.color,
textAlign: l,
textBaseline: "middle",
});
}
})(this, n),
s.display &&
this.ticks.forEach((t, e) => {
if (0 !== e) {
a = this.getDistanceFromCenterForValue(t.value);
!(function (t, e, i, s) {
const n = t.ctx,
o = e.circular,
{ color: a, lineWidth: r } = e;
(!o && !s) ||
!a ||
!r ||
i < 0 ||
(n.save(),
(n.strokeStyle = a),
(n.lineWidth = r),
n.setLineDash(e.borderDash),
(n.lineDashOffset = e.borderDashOffset),
n.beginPath(),
ra(t, i, o, s),
n.closePath(),
n.stroke(),
n.restore());
})(this, s.setContext(this.getContext(e - 1)), a, n);
}
}),
i.display)
) {
for (t.save(), o = n - 1; o >= 0; o--) {
const s = i.setContext(this.getPointLabelContext(o)),
{ color: n, lineWidth: l } = s;
l &&
n &&
((t.lineWidth = l),
(t.strokeStyle = n),
t.setLineDash(s.borderDash),
(t.lineDashOffset = s.borderDashOffset),
(a = this.getDistanceFromCenterForValue(
e.ticks.reverse ? this.min : this.max
)),
(r = this.getPointPosition(o, a)),
t.beginPath(),
t.moveTo(this.xCenter, this.yCenter),
t.lineTo(r.x, r.y),
t.stroke());
}
t.restore();
}
}
drawBorder() {}
drawLabels() {
const t = this.ctx,
e = this.options,
i = e.ticks;
if (!i.display) return;
const s = this.getIndexAngle(0);
let n, o;
t.save(),
t.translate(this.xCenter, this.yCenter),
t.rotate(s),
(t.textAlign = "center"),
(t.textBaseline = "middle"),
this.ticks.forEach((s, a) => {
if (0 === a && !e.reverse) return;
const r = i.setContext(this.getContext(a)),
l = He(r.font);
if (
((n = this.getDistanceFromCenterForValue(this.ticks[a].value)),
r.showLabelBackdrop)
) {
(t.font = l.string),
(o = t.measureText(s.label).width),
(t.fillStyle = r.backdropColor);
const e = Ne(r.backdropPadding);
t.fillRect(
-o / 2 - e.left,
-n - l.size / 2 - e.top,
o + e.width,
l.size + e.height
);
}
se(t, s.label, 0, -n, l, { color: r.color });
}),
t.restore();
}
drawTitle() {}
}
(la.id = "radialLinear"),
(la.defaults = {
display: !0,
animate: !0,
position: "chartArea",
angleLines: {
display: !0,
lineWidth: 1,
borderDash: [],
borderDashOffset: 0,
},
grid: { circular: !1 },
startAngle: 0,
ticks: { showLabelBackdrop: !0, callback: Os.formatters.numeric },
pointLabels: {
backdropColor: void 0,
backdropPadding: 2,
display: !0,
font: { size: 10 },
callback: (t) => t,
padding: 5,
centerPointLabels: !1,
},
}),
(la.defaultRoutes = {
"angleLines.color": "borderColor",
"pointLabels.color": "color",
"ticks.color": "color",
}),
(la.descriptors = { angleLines: { _fallback: "grid" } });
const ha = {
millisecond: { common: !0, size: 1, steps: 1e3 },
second: { common: !0, size: 1e3, steps: 60 },
minute: { common: !0, size: 6e4, steps: 60 },
hour: { common: !0, size: 36e5, steps: 24 },
day: { common: !0, size: 864e5, steps: 30 },
week: { common: !1, size: 6048e5, steps: 4 },
month: { common: !0, size: 2628e6, steps: 12 },
quarter: { common: !1, size: 7884e6, steps: 4 },
year: { common: !0, size: 3154e7 },
},
ca = Object.keys(ha);
function da(t, e) {
return t - e;
}
function ua(t, e) {
if ($(e)) return null;
const i = t._adapter,
{ parser: s, round: n, isoWeekday: o } = t._parseOpts;
let a = e;
return (
"function" == typeof s && (a = s(a)),
X(a) || (a = "string" == typeof s ? i.parse(a, s) : i.parse(a)),
null === a
? null
: (n &&
(a =
"week" !== n || (!Tt(o) && !0 !== o)
? i.startOf(a, n)
: i.startOf(a, "isoWeek", o)),
+a)
);
}
function fa(t, e, i, s) {
const n = ca.length;
for (let o = ca.indexOf(t); o < n - 1; ++o) {
const t = ha[ca[o]],
n = t.steps ? t.steps : Number.MAX_SAFE_INTEGER;
if (t.common && Math.ceil((i - e) / (n * t.size)) <= s) return ca[o];
}
return ca[n - 1];
}
function ga(t, e, i) {
if (i) {
if (i.length) {
const { lo: s, hi: n } = ae(i, e);
t[i[s] >= e ? i[s] : i[n]] = !0;
}
} else t[e] = !0;
}
function pa(t, e, i) {
const s = [],
n = {},
o = e.length;
let a, r;
for (a = 0; a < o; ++a)
(r = e[a]), (n[r] = a), s.push({ value: r, major: !1 });
return 0 !== o && i
? (function (t, e, i, s) {
const n = t._adapter,
o = +n.startOf(e[0].value, s),
a = e[e.length - 1].value;
let r, l;
for (r = o; r <= a; r = +n.add(r, 1, s))
(l = i[r]), l >= 0 && (e[l].major = !0);
return e;
})(t, s, n, i)
: s;
}
class ma extends Bs {
constructor(t) {
super(t),
(this._cache = { data: [], labels: [], all: [] }),
(this._unit = "day"),
(this._majorUnit = void 0),
(this._offsets = {}),
(this._normalized = !1),
(this._parseOpts = void 0);
}
init(t, e) {
const i = t.time || (t.time = {}),
s = (this._adapter = new mn._date(t.adapters.date));
ot(i.displayFormats, s.formats()),
(this._parseOpts = {
parser: i.parser,
round: i.round,
isoWeekday: i.isoWeekday,
}),
super.init(t),
(this._normalized = e.normalized);
}
parse(t, e) {
return void 0 === t ? null : ua(this, t);
}
beforeLayout() {
super.beforeLayout(), (this._cache = { data: [], labels: [], all: [] });
}
determineDataLimits() {
const t = this.options,
e = this._adapter,
i = t.time.unit || "day";
let {
min: s,
max: n,
minDefined: o,
maxDefined: a,
} = this.getUserBounds();
function r(t) {
o || isNaN(t.min) || (s = Math.min(s, t.min)),
a || isNaN(t.max) || (n = Math.max(n, t.max));
}
(o && a) ||
(r(this._getLabelBounds()),
("ticks" === t.bounds && "labels" === t.ticks.source) ||
r(this.getMinMax(!1))),
(s = X(s) && !isNaN(s) ? s : +e.startOf(Date.now(), i)),
(n = X(n) && !isNaN(n) ? n : +e.endOf(Date.now(), i) + 1),
(this.min = Math.min(s, n - 1)),
(this.max = Math.max(s + 1, n));
}
_getLabelBounds() {
const t = this.getLabelTimestamps();
let e = Number.POSITIVE_INFINITY,
i = Number.NEGATIVE_INFINITY;
return (
t.length && ((e = t[0]), (i = t[t.length - 1])), { min: e, max: i }
);
}
buildTicks() {
const t = this.options,
e = t.time,
i = t.ticks,
s =
"labels" === i.source ? this.getLabelTimestamps() : this._generate();
"ticks" === t.bounds &&
s.length &&
((this.min = this._userMin || s[0]),
(this.max = this._userMax || s[s.length - 1]));
const n = this.min,
o = he(s, n, this.max);
return (
(this._unit =
e.unit ||
(i.autoSkip
? fa(e.minUnit, this.min, this.max, this._getLabelCapacity(n))
: (function (t, e, i, s, n) {
for (let o = ca.length - 1; o >= ca.indexOf(i); o--) {
const i = ca[o];
if (ha[i].common && t._adapter.diff(n, s, i) >= e - 1)
return i;
}
return ca[i ? ca.indexOf(i) : 0];
})(this, o.length, e.minUnit, this.min, this.max))),
(this._majorUnit =
i.major.enabled && "year" !== this._unit
? (function (t) {
for (let e = ca.indexOf(t) + 1, i = ca.length; e < i; ++e)
if (ha[ca[e]].common) return ca[e];
})(this._unit)
: void 0),
this.initOffsets(s),
t.reverse && o.reverse(),
pa(this, o, this._majorUnit)
);
}
initOffsets(t) {
let e,
i,
s = 0,
n = 0;
this.options.offset &&
t.length &&
((e = this.getDecimalForValue(t[0])),
(s = 1 === t.length ? 1 - e : (this.getDecimalForValue(t[1]) - e) / 2),
(i = this.getDecimalForValue(t[t.length - 1])),
(n =
1 === t.length
? i
: (i - this.getDecimalForValue(t[t.length - 2])) / 2));
const o = t.length < 3 ? 0.5 : 0.25;
(s = jt(s, 0, o)),
(n = jt(n, 0, o)),
(this._offsets = { start: s, end: n, factor: 1 / (s + 1 + n) });
}
_generate() {
const t = this._adapter,
e = this.min,
i = this.max,
s = this.options,
n = s.time,
o = n.unit || fa(n.minUnit, e, i, this._getLabelCapacity(e)),
a = K(n.stepSize, 1),
r = "week" === o && n.isoWeekday,
l = Tt(r) || !0 === r,
h = {};
let c,
d,
u = e;
if (
(l && (u = +t.startOf(u, "isoWeek", r)),
(u = +t.startOf(u, l ? "day" : o)),
t.diff(i, e, o) > 1e5 * a)
)
throw new Error(
e + " and " + i + " are too far apart with stepSize of " + a + " " + o
);
const f = "data" === s.ticks.source && this.getDataTimestamps();
for (c = u, d = 0; c < i; c = +t.add(c, a, o), d++) ga(h, c, f);
return (
(c !== i && "ticks" !== s.bounds && 1 !== d) || ga(h, c, f),
Object.keys(h)
.sort((t, e) => t - e)
.map((t) => +t)
);
}
getLabelForValue(t) {
const e = this._adapter,
i = this.options.time;
return i.tooltipFormat
? e.format(t, i.tooltipFormat)
: e.format(t, i.displayFormats.datetime);
}
_tickFormatFunction(t, e, i, s) {
const n = this.options,
o = n.time.displayFormats,
a = this._unit,
r = this._majorUnit,
l = a && o[a],
h = r && o[r],
c = i[e],
d = r && h && c && c.major,
u = this._adapter.format(t, s || (d ? h : l)),
f = n.ticks.callback;
return f ? J(f, [u, e, i], this) : u;
}
generateTickLabels(t) {
let e, i, s;
for (e = 0, i = t.length; e < i; ++e)
(s = t[e]), (s.label = this._tickFormatFunction(s.value, e, t));
}
getDecimalForValue(t) {
return null === t ? NaN : (t - this.min) / (this.max - this.min);
}
getPixelForValue(t) {
const e = this._offsets,
i = this.getDecimalForValue(t);
return this.getPixelForDecimal((e.start + i) * e.factor);
}
getValueForPixel(t) {
const e = this._offsets,
i = this.getDecimalForPixel(t) / e.factor - e.end;
return this.min + i * (this.max - this.min);
}
_getLabelSize(t) {
const e = this.options.ticks,
i = this.ctx.measureText(t).width,
s = It(this.isHorizontal() ? e.maxRotation : e.minRotation),
n = Math.cos(s),
o = Math.sin(s),
a = this._resolveTickFontOptions(0).size;
return { w: i * n + a * o, h: i * o + a * n };
}
_getLabelCapacity(t) {
const e = this.options.time,
i = e.displayFormats,
s = i[e.unit] || i.millisecond,
n = this._tickFormatFunction(t, 0, pa(this, [t], this._majorUnit), s),
o = this._getLabelSize(n),
a =
Math.floor(
this.isHorizontal() ? this.width / o.w : this.height / o.h
) - 1;
return a > 0 ? a : 1;
}
getDataTimestamps() {
let t,
e,
i = this._cache.data || [];
if (i.length) return i;
const s = this.getMatchingVisibleMetas();
if (this._normalized && s.length)
return (this._cache.data = s[0].controller.getAllParsedValues(this));
for (t = 0, e = s.length; t < e; ++t)
i = i.concat(s[t].controller.getAllParsedValues(this));
return (this._cache.data = this.normalize(i));
}
getLabelTimestamps() {
const t = this._cache.labels || [];
let e, i;
if (t.length) return t;
const s = this.getLabels();
for (e = 0, i = s.length; e < i; ++e) t.push(ua(this, s[e]));
return (this._cache.labels = this._normalized ? t : this.normalize(t));
}
normalize(t) {
return fe(t.sort(da));
}
}
function xa(t, e, i) {
let s,
n,
o,
a,
r = 0,
l = t.length - 1;
i
? (e >= t[r].pos && e <= t[l].pos && ({ lo: r, hi: l } = re(t, "pos", e)),
({ pos: s, time: o } = t[r]),
({ pos: n, time: a } = t[l]))
: (e >= t[r].time &&
e <= t[l].time &&
({ lo: r, hi: l } = re(t, "time", e)),
({ time: s, pos: o } = t[r]),
({ time: n, pos: a } = t[l]));
const h = n - s;
return h ? o + ((a - o) * (e - s)) / h : o;
}
(ma.id = "time"),
(ma.defaults = {
bounds: "data",
adapters: {},
time: {
parser: !1,
unit: !1,
round: !1,
isoWeekday: !1,
minUnit: "millisecond",
displayFormats: {},
},
ticks: { source: "auto", major: { enabled: !1 } },
});
class ba extends ma {
constructor(t) {
super(t),
(this._table = []),
(this._minPos = void 0),
(this._tableRange = void 0);
}
initOffsets() {
const t = this._getTimestampsForTable(),
e = (this._table = this.buildLookupTable(t));
(this._minPos = xa(e, this.min)),
(this._tableRange = xa(e, this.max) - this._minPos),
super.initOffsets(t);
}
buildLookupTable(t) {
const { min: e, max: i } = this,
s = [],
n = [];
let o, a, r, l, h;
for (o = 0, a = t.length; o < a; ++o)
(l = t[o]), l >= e && l <= i && s.push(l);
if (s.length < 2)
return [
{ time: e, pos: 0 },
{ time: i, pos: 1 },
];
for (o = 0, a = s.length; o < a; ++o)
(h = s[o + 1]),
(r = s[o - 1]),
(l = s[o]),
Math.round((h + r) / 2) !== l &&
n.push({ time: l, pos: o / (a - 1) });
return n;
}
_getTimestampsForTable() {
let t = this._cache.all || [];
if (t.length) return t;
const e = this.getDataTimestamps(),
i = this.getLabelTimestamps();
return (
(t =
e.length && i.length
? this.normalize(e.concat(i))
: e.length
? e
: i),
(t = this._cache.all = t),
t
);
}
getDecimalForValue(t) {
return (xa(this._table, t) - this._minPos) / this._tableRange;
}
getValueForPixel(t) {
const e = this._offsets,
i = this.getDecimalForPixel(t) / e.factor - e.end;
return xa(this._table, i * this._tableRange + this._minPos, !0);
}
}
(ba.id = "timeseries"), (ba.defaults = ma.defaults);
var _a = Object.freeze({
__proto__: null,
CategoryScale: qo,
LinearScale: Zo,
LogarithmicScale: Qo,
RadialLinearScale: la,
TimeScale: ma,
TimeSeriesScale: ba,
});
return (
dn.register(Rn, _a, no, Uo),
(dn.helpers = { ...Yi }),
(dn._adapters = mn),
(dn.Animation = us),
(dn.Animations = gs),
(dn.animator = a),
(dn.controllers = Ws.controllers.items),
(dn.DatasetController = Ps),
(dn.Element = Ds),
(dn.elements = no),
(dn.Interaction = Ee),
(dn.layouts = ni),
(dn.platforms = hs),
(dn.Scale = Bs),
(dn.Ticks = Os),
Object.assign(dn, Rn, _a, no, Uo, hs),
(dn.Chart = dn),
"undefined" != typeof window && (window.Chart = dn),
dn
);
});