{"version":3,"file":"js/378-a1152f317bf76bce3a14.js","mappings":"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","sources":["webpack://relier-react-webpack-rails/./node_modules/@hotwired/stimulus/dist/stimulus.js","webpack://relier-react-webpack-rails/./node_modules/@kanety/stimulus-accordion/dist/index.module.js","webpack://relier-react-webpack-rails/./node_modules/debounce/index.js","webpack://relier-react-webpack-rails/./node_modules/@kurkle/color/dist/color.esm.js","webpack://relier-react-webpack-rails/./node_modules/chart.js/dist/chunks/helpers.segment.js","webpack://relier-react-webpack-rails/./node_modules/chart.js/dist/chart.js","webpack://relier-react-webpack-rails/./node_modules/chart.js/auto/auto.js"],"sourcesContent":["/*\nStimulus 3.2.1\nCopyright © 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n","import{Controller as t}from\"@hotwired/stimulus\";class e{constructor(t){this.controller=t}get togglers(){return this.controller.togglers}get openedTogglers(){return this.controller.openedTogglers}get key(){return this.controller.storeKeyValue}load(){if(this.key){var t=this.constructor.load(this.key);if(t){var e=new Set(t);this.togglers.forEach(t=>{var s=this.controller.findContent(t);e.has(this.controller.getID(t))?this.controller.show(t,s):this.controller.hide(t,s)})}}}save(){if(this.key){var t=this.openedTogglers.map(t=>this.controller.getID(t));this.constructor.save(this.key,t)}}static load(t){var e=sessionStorage.getItem(t);try{return JSON.parse(e)}catch(t){return console.error(t),null}}static save(t,e){try{sessionStorage.setItem(t,JSON.stringify(e))}catch(t){return console.error(t),null}}}class s extends t{get togglers(){return this.context.bindingObserver.bindings.filter(t=>\"toggle\"==t.action.methodName).map(t=>t.action.element)}get openedTogglers(){return this.togglers.filter(t=>this.isOpened(t))}get contents(){return this.scope.findAllElements(\"[data-accordion-id]\")}connect(){this.init(),this.store=new e(this),this.store.load()}init(){this.togglers.forEach(t=>{var e=this.findContent(t);this.isOpened(t)?this.show(t,e,!1):this.hide(t,e,!1)})}toggle(t){this.togglers.forEach(e=>{e.contains(t.target)?this.isOpened(e)?this.close(e):this.open(e):this.isOpened(e)&&this.close(e)}),t.preventDefault()}open(t){var e=this.findContent(t);this.show(t,e),this.store.save(),this.dispatch(\"opened\",{detail:{toggler:t,content:e}})}close(t){var e=this.findContent(t);this.hide(t,e),this.store.save(),this.dispatch(\"closed\",{detail:{toggler:t,content:e}})}show(t,e,s){void 0===s&&(s=!0),s&&(e.style.height=\"0px\",e.removeEventListener(\"transitionend\",this.transitionEnd),e.addEventListener(\"transitionend\",this.transitionEnd),setTimeout(()=>{e.style.height=e.scrollHeight+\"px\"})),this.toggleClass(t,e,!0),this.toggleText(t,!0)}hide(t,e,s){void 0===s&&(s=!0),s&&(e.style.height=e.scrollHeight+\"px\",e.removeEventListener(\"transitionend\",this.transitionEnd),e.addEventListener(\"transitionend\",this.transitionEnd),setTimeout(()=>{e.style.height=\"0px\"})),this.toggleClass(t,e,!1),this.toggleText(t,!1)}transitionEnd(t){t.target.style.height=\"\"}toggleClass(t,e,s){s?(t.classList.add(\"st-accordion__icon--opened\"),e.classList.add(\"st-accordion__content--visible\")):(t.classList.remove(\"st-accordion__icon--opened\"),e.classList.remove(\"st-accordion__content--visible\"))}toggleText(t,e){var s;(s=t.getAttribute(e?\"data-accordion-opened-text-param\":\"data-accordion-closed-text-param\"))&&(t.innerHTML=s)}isOpened(t){return t.matches(\".st-accordion__icon--opened\")}findContent(t){var e=this.getID(t);return this.scope.findElement('[data-accordion-id=\"'+e+'\"]')}getID(t){return t.getAttribute(\"href\").replace(/^#/,\"\")}}s.values={storeKey:String};export{s as default};\n//# sourceMappingURL=index.module.js.map\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce(func, wait, immediate){\n  var timeout, args, context, timestamp, result;\n  if (null == wait) wait = 100;\n\n  function later() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n    }\n  };\n\n  var debounced = function(){\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n\n  debounced.clear = function() {\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n  \n  debounced.flush = function() {\n    if (timeout) {\n      result = func.apply(context, args);\n      context = args = null;\n      \n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n\n  return debounced;\n};\n\n// Adds compatibility for ES modules\ndebounce.debounce = debounce;\n\nmodule.exports = debounce;\n","/*!\n * @kurkle/color v0.3.2\n * https://github.com/kurkle/color#readme\n * (c) 2023 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n  return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n  return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n  return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n  return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n  return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n  return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n  var len = str.length;\n  var ret;\n  if (str[0] === '#') {\n    if (len === 4 || len === 5) {\n      ret = {\n        r: 255 & map$1[str[1]] * 17,\n        g: 255 & map$1[str[2]] * 17,\n        b: 255 & map$1[str[3]] * 17,\n        a: len === 5 ? map$1[str[4]] * 17 : 255\n      };\n    } else if (len === 7 || len === 9) {\n      ret = {\n        r: map$1[str[1]] << 4 | map$1[str[2]],\n        g: map$1[str[3]] << 4 | map$1[str[4]],\n        b: map$1[str[5]] << 4 | map$1[str[6]],\n        a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n      };\n    }\n  }\n  return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n  var f = isShort(v) ? h1 : h2;\n  return v\n    ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n    : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n  const a = s * Math.min(l, 1 - l);\n  const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n  const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n  return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n  const rgb = hsl2rgbn(h, 1, 0.5);\n  let i;\n  if (w + b > 1) {\n    i = 1 / (w + b);\n    w *= i;\n    b *= i;\n  }\n  for (i = 0; i < 3; i++) {\n    rgb[i] *= 1 - w - b;\n    rgb[i] += w;\n  }\n  return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n  if (r === max) {\n    return ((g - b) / d) + (g < b ? 6 : 0);\n  }\n  if (g === max) {\n    return (b - r) / d + 2;\n  }\n  return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n  const range = 255;\n  const r = v.r / range;\n  const g = v.g / range;\n  const b = v.b / range;\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n  let h, s, d;\n  if (max !== min) {\n    d = max - min;\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n    h = hueValue(r, g, b, d, max);\n    h = h * 60 + 0.5;\n  }\n  return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n  return (\n    Array.isArray(a)\n      ? f(a[0], a[1], a[2])\n      : f(a, b, c)\n  ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n  return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n  return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n  return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n  return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n  const m = HUE_RE.exec(str);\n  let a = 255;\n  let v;\n  if (!m) {\n    return;\n  }\n  if (m[5] !== v) {\n    a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n  }\n  const h = hue(+m[2]);\n  const p1 = +m[3] / 100;\n  const p2 = +m[4] / 100;\n  if (m[1] === 'hwb') {\n    v = hwb2rgb(h, p1, p2);\n  } else if (m[1] === 'hsv') {\n    v = hsv2rgb(h, p1, p2);\n  } else {\n    v = hsl2rgb(h, p1, p2);\n  }\n  return {\n    r: v[0],\n    g: v[1],\n    b: v[2],\n    a: a\n  };\n}\nfunction rotate(v, deg) {\n  var h = rgb2hsl(v);\n  h[0] = hue(h[0] + deg);\n  h = hsl2rgb(h);\n  v.r = h[0];\n  v.g = h[1];\n  v.b = h[2];\n}\nfunction hslString(v) {\n  if (!v) {\n    return;\n  }\n  const a = rgb2hsl(v);\n  const h = a[0];\n  const s = n2p(a[1]);\n  const l = n2p(a[2]);\n  return v.a < 255\n    ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n    : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n  x: 'dark',\n  Z: 'light',\n  Y: 're',\n  X: 'blu',\n  W: 'gr',\n  V: 'medium',\n  U: 'slate',\n  A: 'ee',\n  T: 'ol',\n  S: 'or',\n  B: 'ra',\n  C: 'lateg',\n  D: 'ights',\n  R: 'in',\n  Q: 'turquois',\n  E: 'hi',\n  P: 'ro',\n  O: 'al',\n  N: 'le',\n  M: 'de',\n  L: 'yello',\n  F: 'en',\n  K: 'ch',\n  G: 'arks',\n  H: 'ea',\n  I: 'ightg',\n  J: 'wh'\n};\nconst names$1 = {\n  OiceXe: 'f0f8ff',\n  antiquewEte: 'faebd7',\n  aqua: 'ffff',\n  aquamarRe: '7fffd4',\n  azuY: 'f0ffff',\n  beige: 'f5f5dc',\n  bisque: 'ffe4c4',\n  black: '0',\n  blanKedOmond: 'ffebcd',\n  Xe: 'ff',\n  XeviTet: '8a2be2',\n  bPwn: 'a52a2a',\n  burlywood: 'deb887',\n  caMtXe: '5f9ea0',\n  KartYuse: '7fff00',\n  KocTate: 'd2691e',\n  cSO: 'ff7f50',\n  cSnflowerXe: '6495ed',\n  cSnsilk: 'fff8dc',\n  crimson: 'dc143c',\n  cyan: 'ffff',\n  xXe: '8b',\n  xcyan: '8b8b',\n  xgTMnPd: 'b8860b',\n  xWay: 'a9a9a9',\n  xgYF: '6400',\n  xgYy: 'a9a9a9',\n  xkhaki: 'bdb76b',\n  xmagFta: '8b008b',\n  xTivegYF: '556b2f',\n  xSange: 'ff8c00',\n  xScEd: '9932cc',\n  xYd: '8b0000',\n  xsOmon: 'e9967a',\n  xsHgYF: '8fbc8f',\n  xUXe: '483d8b',\n  xUWay: '2f4f4f',\n  xUgYy: '2f4f4f',\n  xQe: 'ced1',\n  xviTet: '9400d3',\n  dAppRk: 'ff1493',\n  dApskyXe: 'bfff',\n  dimWay: '696969',\n  dimgYy: '696969',\n  dodgerXe: '1e90ff',\n  fiYbrick: 'b22222',\n  flSOwEte: 'fffaf0',\n  foYstWAn: '228b22',\n  fuKsia: 'ff00ff',\n  gaRsbSo: 'dcdcdc',\n  ghostwEte: 'f8f8ff',\n  gTd: 'ffd700',\n  gTMnPd: 'daa520',\n  Way: '808080',\n  gYF: '8000',\n  gYFLw: 'adff2f',\n  gYy: '808080',\n  honeyMw: 'f0fff0',\n  hotpRk: 'ff69b4',\n  RdianYd: 'cd5c5c',\n  Rdigo: '4b0082',\n  ivSy: 'fffff0',\n  khaki: 'f0e68c',\n  lavFMr: 'e6e6fa',\n  lavFMrXsh: 'fff0f5',\n  lawngYF: '7cfc00',\n  NmoncEffon: 'fffacd',\n  ZXe: 'add8e6',\n  ZcSO: 'f08080',\n  Zcyan: 'e0ffff',\n  ZgTMnPdLw: 'fafad2',\n  ZWay: 'd3d3d3',\n  ZgYF: '90ee90',\n  ZgYy: 'd3d3d3',\n  ZpRk: 'ffb6c1',\n  ZsOmon: 'ffa07a',\n  ZsHgYF: '20b2aa',\n  ZskyXe: '87cefa',\n  ZUWay: '778899',\n  ZUgYy: '778899',\n  ZstAlXe: 'b0c4de',\n  ZLw: 'ffffe0',\n  lime: 'ff00',\n  limegYF: '32cd32',\n  lRF: 'faf0e6',\n  magFta: 'ff00ff',\n  maPon: '800000',\n  VaquamarRe: '66cdaa',\n  VXe: 'cd',\n  VScEd: 'ba55d3',\n  VpurpN: '9370db',\n  VsHgYF: '3cb371',\n  VUXe: '7b68ee',\n  VsprRggYF: 'fa9a',\n  VQe: '48d1cc',\n  VviTetYd: 'c71585',\n  midnightXe: '191970',\n  mRtcYam: 'f5fffa',\n  mistyPse: 'ffe4e1',\n  moccasR: 'ffe4b5',\n  navajowEte: 'ffdead',\n  navy: '80',\n  Tdlace: 'fdf5e6',\n  Tive: '808000',\n  TivedBb: '6b8e23',\n  Sange: 'ffa500',\n  SangeYd: 'ff4500',\n  ScEd: 'da70d6',\n  pOegTMnPd: 'eee8aa',\n  pOegYF: '98fb98',\n  pOeQe: 'afeeee',\n  pOeviTetYd: 'db7093',\n  papayawEp: 'ffefd5',\n  pHKpuff: 'ffdab9',\n  peru: 'cd853f',\n  pRk: 'ffc0cb',\n  plum: 'dda0dd',\n  powMrXe: 'b0e0e6',\n  purpN: '800080',\n  YbeccapurpN: '663399',\n  Yd: 'ff0000',\n  Psybrown: 'bc8f8f',\n  PyOXe: '4169e1',\n  saddNbPwn: '8b4513',\n  sOmon: 'fa8072',\n  sandybPwn: 'f4a460',\n  sHgYF: '2e8b57',\n  sHshell: 'fff5ee',\n  siFna: 'a0522d',\n  silver: 'c0c0c0',\n  skyXe: '87ceeb',\n  UXe: '6a5acd',\n  UWay: '708090',\n  UgYy: '708090',\n  snow: 'fffafa',\n  sprRggYF: 'ff7f',\n  stAlXe: '4682b4',\n  tan: 'd2b48c',\n  teO: '8080',\n  tEstN: 'd8bfd8',\n  tomato: 'ff6347',\n  Qe: '40e0d0',\n  viTet: 'ee82ee',\n  JHt: 'f5deb3',\n  wEte: 'ffffff',\n  wEtesmoke: 'f5f5f5',\n  Lw: 'ffff00',\n  LwgYF: '9acd32'\n};\nfunction unpack() {\n  const unpacked = {};\n  const keys = Object.keys(names$1);\n  const tkeys = Object.keys(map);\n  let i, j, k, ok, nk;\n  for (i = 0; i < keys.length; i++) {\n    ok = nk = keys[i];\n    for (j = 0; j < tkeys.length; j++) {\n      k = tkeys[j];\n      nk = nk.replace(k, map[k]);\n    }\n    k = parseInt(names$1[ok], 16);\n    unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n  }\n  return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n  if (!names) {\n    names = unpack();\n    names.transparent = [0, 0, 0, 0];\n  }\n  const a = names[str.toLowerCase()];\n  return a && {\n    r: a[0],\n    g: a[1],\n    b: a[2],\n    a: a.length === 4 ? a[3] : 255\n  };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n  const m = RGB_RE.exec(str);\n  let a = 255;\n  let r, g, b;\n  if (!m) {\n    return;\n  }\n  if (m[7] !== r) {\n    const v = +m[7];\n    a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n  }\n  r = +m[1];\n  g = +m[3];\n  b = +m[5];\n  r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n  g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n  b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n  return {\n    r: r,\n    g: g,\n    b: b,\n    a: a\n  };\n}\nfunction rgbString(v) {\n  return v && (\n    v.a < 255\n      ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n      : `rgb(${v.r}, ${v.g}, ${v.b})`\n  );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n  const r = from(b2n(rgb1.r));\n  const g = from(b2n(rgb1.g));\n  const b = from(b2n(rgb1.b));\n  return {\n    r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n    g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n    b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n    a: rgb1.a + t * (rgb2.a - rgb1.a)\n  };\n}\n\nfunction modHSL(v, i, ratio) {\n  if (v) {\n    let tmp = rgb2hsl(v);\n    tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n    tmp = hsl2rgb(tmp);\n    v.r = tmp[0];\n    v.g = tmp[1];\n    v.b = tmp[2];\n  }\n}\nfunction clone(v, proto) {\n  return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n  var v = {r: 0, g: 0, b: 0, a: 255};\n  if (Array.isArray(input)) {\n    if (input.length >= 3) {\n      v = {r: input[0], g: input[1], b: input[2], a: 255};\n      if (input.length > 3) {\n        v.a = n2b(input[3]);\n      }\n    }\n  } else {\n    v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n    v.a = n2b(v.a);\n  }\n  return v;\n}\nfunction functionParse(str) {\n  if (str.charAt(0) === 'r') {\n    return rgbParse(str);\n  }\n  return hueParse(str);\n}\nclass Color {\n  constructor(input) {\n    if (input instanceof Color) {\n      return input;\n    }\n    const type = typeof input;\n    let v;\n    if (type === 'object') {\n      v = fromObject(input);\n    } else if (type === 'string') {\n      v = hexParse(input) || nameParse(input) || functionParse(input);\n    }\n    this._rgb = v;\n    this._valid = !!v;\n  }\n  get valid() {\n    return this._valid;\n  }\n  get rgb() {\n    var v = clone(this._rgb);\n    if (v) {\n      v.a = b2n(v.a);\n    }\n    return v;\n  }\n  set rgb(obj) {\n    this._rgb = fromObject(obj);\n  }\n  rgbString() {\n    return this._valid ? rgbString(this._rgb) : undefined;\n  }\n  hexString() {\n    return this._valid ? hexString(this._rgb) : undefined;\n  }\n  hslString() {\n    return this._valid ? hslString(this._rgb) : undefined;\n  }\n  mix(color, weight) {\n    if (color) {\n      const c1 = this.rgb;\n      const c2 = color.rgb;\n      let w2;\n      const p = weight === w2 ? 0.5 : weight;\n      const w = 2 * p - 1;\n      const a = c1.a - c2.a;\n      const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n      w2 = 1 - w1;\n      c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n      c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n      c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n      c1.a = p * c1.a + (1 - p) * c2.a;\n      this.rgb = c1;\n    }\n    return this;\n  }\n  interpolate(color, t) {\n    if (color) {\n      this._rgb = interpolate(this._rgb, color._rgb, t);\n    }\n    return this;\n  }\n  clone() {\n    return new Color(this.rgb);\n  }\n  alpha(a) {\n    this._rgb.a = n2b(a);\n    return this;\n  }\n  clearer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 - ratio;\n    return this;\n  }\n  greyscale() {\n    const rgb = this._rgb;\n    const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n    rgb.r = rgb.g = rgb.b = val;\n    return this;\n  }\n  opaquer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 + ratio;\n    return this;\n  }\n  negate() {\n    const v = this._rgb;\n    v.r = 255 - v.r;\n    v.g = 255 - v.g;\n    v.b = 255 - v.b;\n    return this;\n  }\n  lighten(ratio) {\n    modHSL(this._rgb, 2, ratio);\n    return this;\n  }\n  darken(ratio) {\n    modHSL(this._rgb, 2, -ratio);\n    return this;\n  }\n  saturate(ratio) {\n    modHSL(this._rgb, 1, ratio);\n    return this;\n  }\n  desaturate(ratio) {\n    modHSL(this._rgb, 1, -ratio);\n    return this;\n  }\n  rotate(deg) {\n    rotate(this._rgb, deg);\n    return this;\n  }\n}\n\nfunction index_esm(input) {\n  return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/*!\n * Chart.js v4.4.5\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { Color } from '@kurkle/color';\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n    let id = 0;\n    return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n    return value === null || typeof value === 'undefined';\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n    if (Array.isArray && Array.isArray(value)) {\n        return true;\n    }\n    const type = Object.prototype.toString.call(value);\n    if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n        return true;\n    }\n    return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n    return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value  - The value to test.\n */ function isNumberFinite(value) {\n    return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n    return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n    return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n    if (fn && typeof fn.call === 'function') {\n        return fn.apply(thisArg, args);\n    }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n    let i, len, keys;\n    if (isArray(loopable)) {\n        len = loopable.length;\n        if (reverse) {\n            for(i = len - 1; i >= 0; i--){\n                fn.call(thisArg, loopable[i], i);\n            }\n        } else {\n            for(i = 0; i < len; i++){\n                fn.call(thisArg, loopable[i], i);\n            }\n        }\n    } else if (isObject(loopable)) {\n        keys = Object.keys(loopable);\n        len = keys.length;\n        for(i = 0; i < len; i++){\n            fn.call(thisArg, loopable[keys[i]], keys[i]);\n        }\n    }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n    let i, ilen, v0, v1;\n    if (!a0 || !a1 || a0.length !== a1.length) {\n        return false;\n    }\n    for(i = 0, ilen = a0.length; i < ilen; ++i){\n        v0 = a0[i];\n        v1 = a1[i];\n        if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n    if (isArray(source)) {\n        return source.map(clone);\n    }\n    if (isObject(source)) {\n        const target = Object.create(null);\n        const keys = Object.keys(source);\n        const klen = keys.length;\n        let k = 0;\n        for(; k < klen; ++k){\n            target[keys[k]] = clone(source[keys[k]]);\n        }\n        return target;\n    }\n    return source;\n}\nfunction isValidKey(key) {\n    return [\n        '__proto__',\n        'prototype',\n        'constructor'\n    ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n    if (!isValidKey(key)) {\n        return;\n    }\n    const tval = target[key];\n    const sval = source[key];\n    if (isObject(tval) && isObject(sval)) {\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define\n        merge(tval, sval, options);\n    } else {\n        target[key] = clone(sval);\n    }\n}\nfunction merge(target, source, options) {\n    const sources = isArray(source) ? source : [\n        source\n    ];\n    const ilen = sources.length;\n    if (!isObject(target)) {\n        return target;\n    }\n    options = options || {};\n    const merger = options.merger || _merger;\n    let current;\n    for(let i = 0; i < ilen; ++i){\n        current = sources[i];\n        if (!isObject(current)) {\n            continue;\n        }\n        const keys = Object.keys(current);\n        for(let k = 0, klen = keys.length; k < klen; ++k){\n            merger(keys[k], target, current, options);\n        }\n    }\n    return target;\n}\nfunction mergeIf(target, source) {\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    return merge(target, source, {\n        merger: _mergerIf\n    });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n    if (!isValidKey(key)) {\n        return;\n    }\n    const tval = target[key];\n    const sval = source[key];\n    if (isObject(tval) && isObject(sval)) {\n        mergeIf(tval, sval);\n    } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n        target[key] = clone(sval);\n    }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n    if (value !== undefined) {\n        console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n    }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n    // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n    '': (v)=>v,\n    // default resolvers\n    x: (o)=>o.x,\n    y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n    const parts = key.split('.');\n    const keys = [];\n    let tmp = '';\n    for (const part of parts){\n        tmp += part;\n        if (tmp.endsWith('\\\\')) {\n            tmp = tmp.slice(0, -1) + '.';\n        } else {\n            keys.push(tmp);\n            tmp = '';\n        }\n    }\n    return keys;\n}\nfunction _getKeyResolver(key) {\n    const keys = _splitKey(key);\n    return (obj)=>{\n        for (const k of keys){\n            if (k === '') {\n                break;\n            }\n            obj = obj && obj[k];\n        }\n        return obj;\n    };\n}\nfunction resolveObjectKey(obj, key) {\n    const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n    return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n    if (a.size !== b.size) {\n        return false;\n    }\n    for (const item of a){\n        if (!b.has(item)) {\n            return false;\n        }\n    }\n    return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n    return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n    return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n    const roundedRange = Math.round(range);\n    range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n    const niceRange = Math.pow(10, Math.floor(log10(range)));\n    const fraction = range / niceRange;\n    const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n    return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n    const result = [];\n    const sqrt = Math.sqrt(value);\n    let i;\n    for(i = 1; i < sqrt; i++){\n        if (value % i === 0) {\n            result.push(i);\n            result.push(value / i);\n        }\n    }\n    if (sqrt === (sqrt | 0)) {\n        result.push(sqrt);\n    }\n    result.sort((a, b)=>a - b).pop();\n    return result;\n}\nfunction isNumber(n) {\n    return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n    const rounded = Math.round(x);\n    return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n    let i, ilen, value;\n    for(i = 0, ilen = array.length; i < ilen; i++){\n        value = array[i][property];\n        if (!isNaN(value)) {\n            target.min = Math.min(target.min, value);\n            target.max = Math.max(target.max, value);\n        }\n    }\n}\nfunction toRadians(degrees) {\n    return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n    return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n    if (!isNumberFinite(x)) {\n        return;\n    }\n    let e = 1;\n    let p = 0;\n    while(Math.round(x * e) / e !== x){\n        e *= 10;\n        p++;\n    }\n    return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n    const distanceFromXCenter = anglePoint.x - centrePoint.x;\n    const distanceFromYCenter = anglePoint.y - centrePoint.y;\n    const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n    let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n    if (angle < -0.5 * PI) {\n        angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n    }\n    return {\n        angle,\n        distance: radialDistanceFromCenter\n    };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n    return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n    return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n    return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n    const a = _normalizeAngle(angle);\n    const s = _normalizeAngle(start);\n    const e = _normalizeAngle(end);\n    const angleToStart = _normalizeAngle(s - a);\n    const angleToEnd = _normalizeAngle(e - a);\n    const startToAngle = _normalizeAngle(a - s);\n    const endToAngle = _normalizeAngle(a - e);\n    return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n    return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n    return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n    return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n    cmp = cmp || ((index)=>table[index] < value);\n    let hi = table.length - 1;\n    let lo = 0;\n    let mid;\n    while(hi - lo > 1){\n        mid = lo + hi >> 1;\n        if (cmp(mid)) {\n            lo = mid;\n        } else {\n            hi = mid;\n        }\n    }\n    return {\n        lo,\n        hi\n    };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n        const ti = table[index][key];\n        return ti < value || ti === value && table[index + 1][key] === value;\n    } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n    let start = 0;\n    let end = values.length;\n    while(start < end && values[start] < min){\n        start++;\n    }\n    while(end > start && values[end - 1] > max){\n        end--;\n    }\n    return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n    'push',\n    'pop',\n    'shift',\n    'splice',\n    'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n    if (array._chartjs) {\n        array._chartjs.listeners.push(listener);\n        return;\n    }\n    Object.defineProperty(array, '_chartjs', {\n        configurable: true,\n        enumerable: false,\n        value: {\n            listeners: [\n                listener\n            ]\n        }\n    });\n    arrayEvents.forEach((key)=>{\n        const method = '_onData' + _capitalize(key);\n        const base = array[key];\n        Object.defineProperty(array, key, {\n            configurable: true,\n            enumerable: false,\n            value (...args) {\n                const res = base.apply(this, args);\n                array._chartjs.listeners.forEach((object)=>{\n                    if (typeof object[method] === 'function') {\n                        object[method](...args);\n                    }\n                });\n                return res;\n            }\n        });\n    });\n}\nfunction unlistenArrayEvents(array, listener) {\n    const stub = array._chartjs;\n    if (!stub) {\n        return;\n    }\n    const listeners = stub.listeners;\n    const index = listeners.indexOf(listener);\n    if (index !== -1) {\n        listeners.splice(index, 1);\n    }\n    if (listeners.length > 0) {\n        return;\n    }\n    arrayEvents.forEach((key)=>{\n        delete array[key];\n    });\n    delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n    const set = new Set(items);\n    if (set.size === items.length) {\n        return items;\n    }\n    return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n    return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n    if (typeof window === 'undefined') {\n        return function(callback) {\n            return callback();\n        };\n    }\n    return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n    let argsToUse = [];\n    let ticking = false;\n    return function(...args) {\n        // Save the args for use later\n        argsToUse = args;\n        if (!ticking) {\n            ticking = true;\n            requestAnimFrame.call(window, ()=>{\n                ticking = false;\n                fn.apply(thisArg, argsToUse);\n            });\n        }\n    };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n    let timeout;\n    return function(...args) {\n        if (delay) {\n            clearTimeout(timeout);\n            timeout = setTimeout(fn, delay, args);\n        } else {\n            fn.apply(this, args);\n        }\n        return delay;\n    };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n    const check = rtl ? 'left' : 'right';\n    return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n    const pointCount = points.length;\n    let start = 0;\n    let count = pointCount;\n    if (meta._sorted) {\n        const { iScale , _parsed  } = meta;\n        const axis = iScale.axis;\n        const { min , max , minDefined , maxDefined  } = iScale.getUserBounds();\n        if (minDefined) {\n            start = _limitValue(Math.min(// @ts-expect-error Need to type _parsed\n            _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n            animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo), 0, pointCount - 1);\n        }\n        if (maxDefined) {\n            count = _limitValue(Math.max(// @ts-expect-error Need to type _parsed\n            _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n            animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1), start, pointCount) - start;\n        } else {\n            count = pointCount - start;\n        }\n    }\n    return {\n        start,\n        count\n    };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n    const { xScale , yScale , _scaleRanges  } = meta;\n    const newRanges = {\n        xmin: xScale.min,\n        xmax: xScale.max,\n        ymin: yScale.min,\n        ymax: yScale.max\n    };\n    if (!_scaleRanges) {\n        meta._scaleRanges = newRanges;\n        return true;\n    }\n    const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n    Object.assign(_scaleRanges, newRanges);\n    return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n    linear: (t)=>t,\n    easeInQuad: (t)=>t * t,\n    easeOutQuad: (t)=>-t * (t - 2),\n    easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n    easeInCubic: (t)=>t * t * t,\n    easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n    easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n    easeInQuart: (t)=>t * t * t * t,\n    easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n    easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n    easeInQuint: (t)=>t * t * t * t * t,\n    easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n    easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n    easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n    easeOutSine: (t)=>Math.sin(t * HALF_PI),\n    easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n    easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n    easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n    easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n    easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n    easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n    easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n    easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n    easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n    easeInOutElastic (t) {\n        const s = 0.1125;\n        const p = 0.45;\n        return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n    },\n    easeInBack (t) {\n        const s = 1.70158;\n        return t * t * ((s + 1) * t - s);\n    },\n    easeOutBack (t) {\n        const s = 1.70158;\n        return (t -= 1) * t * ((s + 1) * t + s) + 1;\n    },\n    easeInOutBack (t) {\n        let s = 1.70158;\n        if ((t /= 0.5) < 1) {\n            return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n        }\n        return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n    },\n    easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n    easeOutBounce (t) {\n        const m = 7.5625;\n        const d = 2.75;\n        if (t < 1 / d) {\n            return m * t * t;\n        }\n        if (t < 2 / d) {\n            return m * (t -= 1.5 / d) * t + 0.75;\n        }\n        if (t < 2.5 / d) {\n            return m * (t -= 2.25 / d) * t + 0.9375;\n        }\n        return m * (t -= 2.625 / d) * t + 0.984375;\n    },\n    easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n    if (value && typeof value === 'object') {\n        const type = value.toString();\n        return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n    }\n    return false;\n}\nfunction color(value) {\n    return isPatternOrGradient(value) ? value : new Color(value);\n}\nfunction getHoverColor(value) {\n    return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n    'x',\n    'y',\n    'borderWidth',\n    'radius',\n    'tension'\n];\nconst colors = [\n    'color',\n    'borderColor',\n    'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n    defaults.set('animation', {\n        delay: undefined,\n        duration: 1000,\n        easing: 'easeOutQuart',\n        fn: undefined,\n        from: undefined,\n        loop: undefined,\n        to: undefined,\n        type: undefined\n    });\n    defaults.describe('animation', {\n        _fallback: false,\n        _indexable: false,\n        _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n    });\n    defaults.set('animations', {\n        colors: {\n            type: 'color',\n            properties: colors\n        },\n        numbers: {\n            type: 'number',\n            properties: numbers\n        }\n    });\n    defaults.describe('animations', {\n        _fallback: 'animation'\n    });\n    defaults.set('transitions', {\n        active: {\n            animation: {\n                duration: 400\n            }\n        },\n        resize: {\n            animation: {\n                duration: 0\n            }\n        },\n        show: {\n            animations: {\n                colors: {\n                    from: 'transparent'\n                },\n                visible: {\n                    type: 'boolean',\n                    duration: 0\n                }\n            }\n        },\n        hide: {\n            animations: {\n                colors: {\n                    to: 'transparent'\n                },\n                visible: {\n                    type: 'boolean',\n                    easing: 'linear',\n                    fn: (v)=>v | 0\n                }\n            }\n        }\n    });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n    defaults.set('layout', {\n        autoPadding: true,\n        padding: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0\n        }\n    });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n    options = options || {};\n    const cacheKey = locale + JSON.stringify(options);\n    let formatter = intlCache.get(cacheKey);\n    if (!formatter) {\n        formatter = new Intl.NumberFormat(locale, options);\n        intlCache.set(cacheKey, formatter);\n    }\n    return formatter;\n}\nfunction formatNumber(num, locale, options) {\n    return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n        return isArray(value) ?  value : '' + value;\n    },\n numeric (tickValue, index, ticks) {\n        if (tickValue === 0) {\n            return '0';\n        }\n        const locale = this.chart.options.locale;\n        let notation;\n        let delta = tickValue;\n        if (ticks.length > 1) {\n            const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n            if (maxTick < 1e-4 || maxTick > 1e+15) {\n                notation = 'scientific';\n            }\n            delta = calculateDelta(tickValue, ticks);\n        }\n        const logDelta = log10(Math.abs(delta));\n        const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n        const options = {\n            notation,\n            minimumFractionDigits: numDecimal,\n            maximumFractionDigits: numDecimal\n        };\n        Object.assign(options, this.options.ticks.format);\n        return formatNumber(tickValue, locale, options);\n    },\n logarithmic (tickValue, index, ticks) {\n        if (tickValue === 0) {\n            return '0';\n        }\n        const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n        if ([\n            1,\n            2,\n            3,\n            5,\n            10,\n            15\n        ].includes(remain) || index > 0.8 * ticks.length) {\n            return formatters.numeric.call(this, tickValue, index, ticks);\n        }\n        return '';\n    }\n};\nfunction calculateDelta(tickValue, ticks) {\n    let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n    if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n        delta = tickValue - Math.floor(tickValue);\n    }\n    return delta;\n}\n var Ticks = {\n    formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n    defaults.set('scale', {\n        display: true,\n        offset: false,\n        reverse: false,\n        beginAtZero: false,\n bounds: 'ticks',\n        clip: true,\n grace: 0,\n        grid: {\n            display: true,\n            lineWidth: 1,\n            drawOnChartArea: true,\n            drawTicks: true,\n            tickLength: 8,\n            tickWidth: (_ctx, options)=>options.lineWidth,\n            tickColor: (_ctx, options)=>options.color,\n            offset: false\n        },\n        border: {\n            display: true,\n            dash: [],\n            dashOffset: 0.0,\n            width: 1\n        },\n        title: {\n            display: false,\n            text: '',\n            padding: {\n                top: 4,\n                bottom: 4\n            }\n        },\n        ticks: {\n            minRotation: 0,\n            maxRotation: 50,\n            mirror: false,\n            textStrokeWidth: 0,\n            textStrokeColor: '',\n            padding: 3,\n            display: true,\n            autoSkip: true,\n            autoSkipPadding: 3,\n            labelOffset: 0,\n            callback: Ticks.formatters.values,\n            minor: {},\n            major: {},\n            align: 'center',\n            crossAlign: 'near',\n            showLabelBackdrop: false,\n            backdropColor: 'rgba(255, 255, 255, 0.75)',\n            backdropPadding: 2\n        }\n    });\n    defaults.route('scale.ticks', 'color', '', 'color');\n    defaults.route('scale.grid', 'color', '', 'borderColor');\n    defaults.route('scale.border', 'color', '', 'borderColor');\n    defaults.route('scale.title', 'color', '', 'color');\n    defaults.describe('scale', {\n        _fallback: false,\n        _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n        _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n    });\n    defaults.describe('scales', {\n        _fallback: 'scale'\n    });\n    defaults.describe('scale.ticks', {\n        _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n        _indexable: (name)=>name !== 'backdropPadding'\n    });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n    if (!key) {\n        return node;\n    }\n    const keys = key.split('.');\n    for(let i = 0, n = keys.length; i < n; ++i){\n        const k = keys[i];\n        node = node[k] || (node[k] = Object.create(null));\n    }\n    return node;\n}\nfunction set(root, scope, values) {\n    if (typeof scope === 'string') {\n        return merge(getScope$1(root, scope), values);\n    }\n    return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n    constructor(_descriptors, _appliers){\n        this.animation = undefined;\n        this.backgroundColor = 'rgba(0,0,0,0.1)';\n        this.borderColor = 'rgba(0,0,0,0.1)';\n        this.color = '#666';\n        this.datasets = {};\n        this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n        this.elements = {};\n        this.events = [\n            'mousemove',\n            'mouseout',\n            'click',\n            'touchstart',\n            'touchmove'\n        ];\n        this.font = {\n            family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n            size: 12,\n            style: 'normal',\n            lineHeight: 1.2,\n            weight: null\n        };\n        this.hover = {};\n        this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n        this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n        this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n        this.indexAxis = 'x';\n        this.interaction = {\n            mode: 'nearest',\n            intersect: true,\n            includeInvisible: false\n        };\n        this.maintainAspectRatio = true;\n        this.onHover = null;\n        this.onClick = null;\n        this.parsing = true;\n        this.plugins = {};\n        this.responsive = true;\n        this.scale = undefined;\n        this.scales = {};\n        this.showLine = true;\n        this.drawActiveElementsOnTop = true;\n        this.describe(_descriptors);\n        this.apply(_appliers);\n    }\n set(scope, values) {\n        return set(this, scope, values);\n    }\n get(scope) {\n        return getScope$1(this, scope);\n    }\n describe(scope, values) {\n        return set(descriptors, scope, values);\n    }\n    override(scope, values) {\n        return set(overrides, scope, values);\n    }\n route(scope, name, targetScope, targetName) {\n        const scopeObject = getScope$1(this, scope);\n        const targetScopeObject = getScope$1(this, targetScope);\n        const privateName = '_' + name;\n        Object.defineProperties(scopeObject, {\n            [privateName]: {\n                value: scopeObject[name],\n                writable: true\n            },\n            [name]: {\n                enumerable: true,\n                get () {\n                    const local = this[privateName];\n                    const target = targetScopeObject[targetName];\n                    if (isObject(local)) {\n                        return Object.assign({}, target, local);\n                    }\n                    return valueOrDefault(local, target);\n                },\n                set (value) {\n                    this[privateName] = value;\n                }\n            }\n        });\n    }\n    apply(appliers) {\n        appliers.forEach((apply)=>apply(this));\n    }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n    _scriptable: (name)=>!name.startsWith('on'),\n    _indexable: (name)=>name !== 'events',\n    hover: {\n        _fallback: 'interaction'\n    },\n    interaction: {\n        _scriptable: false,\n        _indexable: false\n    }\n}, [\n    applyAnimationsDefaults,\n    applyLayoutsDefaults,\n    applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n    if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n        return null;\n    }\n    return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n    let textWidth = data[string];\n    if (!textWidth) {\n        textWidth = data[string] = ctx.measureText(string).width;\n        gc.push(string);\n    }\n    if (textWidth > longest) {\n        longest = textWidth;\n    }\n    return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n    cache = cache || {};\n    let data = cache.data = cache.data || {};\n    let gc = cache.garbageCollect = cache.garbageCollect || [];\n    if (cache.font !== font) {\n        data = cache.data = {};\n        gc = cache.garbageCollect = [];\n        cache.font = font;\n    }\n    ctx.save();\n    ctx.font = font;\n    let longest = 0;\n    const ilen = arrayOfThings.length;\n    let i, j, jlen, thing, nestedThing;\n    for(i = 0; i < ilen; i++){\n        thing = arrayOfThings[i];\n        // Undefined strings and arrays should not be measured\n        if (thing !== undefined && thing !== null && !isArray(thing)) {\n            longest = _measureText(ctx, data, gc, longest, thing);\n        } else if (isArray(thing)) {\n            // if it is an array lets measure each element\n            // to do maybe simplify this function a bit so we can do this more recursively?\n            for(j = 0, jlen = thing.length; j < jlen; j++){\n                nestedThing = thing[j];\n                // Undefined strings and arrays should not be measured\n                if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n                    longest = _measureText(ctx, data, gc, longest, nestedThing);\n                }\n            }\n        }\n    }\n    ctx.restore();\n    const gcLen = gc.length / 2;\n    if (gcLen > arrayOfThings.length) {\n        for(i = 0; i < gcLen; i++){\n            delete data[gc[i]];\n        }\n        gc.splice(0, gcLen);\n    }\n    return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n    const devicePixelRatio = chart.currentDevicePixelRatio;\n    const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n    return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n    if (!ctx && !canvas) {\n        return;\n    }\n    ctx = ctx || canvas.getContext('2d');\n    ctx.save();\n    // canvas.width and canvas.height do not consider the canvas transform,\n    // while clearRect does\n    ctx.resetTransform();\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n    ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n    let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n    const style = options.pointStyle;\n    const rotation = options.rotation;\n    const radius = options.radius;\n    let rad = (rotation || 0) * RAD_PER_DEG;\n    if (style && typeof style === 'object') {\n        type = style.toString();\n        if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n            ctx.save();\n            ctx.translate(x, y);\n            ctx.rotate(rad);\n            ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n            ctx.restore();\n            return;\n        }\n    }\n    if (isNaN(radius) || radius <= 0) {\n        return;\n    }\n    ctx.beginPath();\n    switch(style){\n        // Default includes circle\n        default:\n            if (w) {\n                ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n            } else {\n                ctx.arc(x, y, radius, 0, TAU);\n            }\n            ctx.closePath();\n            break;\n        case 'triangle':\n            width = w ? w / 2 : radius;\n            ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n            rad += TWO_THIRDS_PI;\n            ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n            rad += TWO_THIRDS_PI;\n            ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n            ctx.closePath();\n            break;\n        case 'rectRounded':\n            // NOTE: the rounded rect implementation changed to use `arc` instead of\n            // `quadraticCurveTo` since it generates better results when rect is\n            // almost a circle. 0.516 (instead of 0.5) produces results with visually\n            // closer proportion to the previous impl and it is inscribed in the\n            // circle with `radius`. For more details, see the following PRs:\n            // https://github.com/chartjs/Chart.js/issues/5597\n            // https://github.com/chartjs/Chart.js/issues/5858\n            cornerRadius = radius * 0.516;\n            size = radius - cornerRadius;\n            xOffset = Math.cos(rad + QUARTER_PI) * size;\n            xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n            yOffset = Math.sin(rad + QUARTER_PI) * size;\n            yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n            ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n            ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n            ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n            ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n            ctx.closePath();\n            break;\n        case 'rect':\n            if (!rotation) {\n                size = Math.SQRT1_2 * radius;\n                width = w ? w / 2 : size;\n                ctx.rect(x - width, y - size, 2 * width, 2 * size);\n                break;\n            }\n            rad += QUARTER_PI;\n        /* falls through */ case 'rectRot':\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            ctx.closePath();\n            break;\n        case 'crossRot':\n            rad += QUARTER_PI;\n        /* falls through */ case 'cross':\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.moveTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            break;\n        case 'star':\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.moveTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            rad += QUARTER_PI;\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.moveTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            break;\n        case 'line':\n            xOffset = w ? w / 2 : Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            ctx.moveTo(x - xOffset, y - yOffset);\n            ctx.lineTo(x + xOffset, y + yOffset);\n            break;\n        case 'dash':\n            ctx.moveTo(x, y);\n            ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n            break;\n        case false:\n            ctx.closePath();\n            break;\n    }\n    ctx.fill();\n    if (options.borderWidth > 0) {\n        ctx.stroke();\n    }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n    margin = margin || 0.5; // margin - default is to match rounded decimals\n    return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n    ctx.save();\n    ctx.beginPath();\n    ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n    ctx.clip();\n}\nfunction unclipArea(ctx) {\n    ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n    if (!previous) {\n        return ctx.lineTo(target.x, target.y);\n    }\n    if (mode === 'middle') {\n        const midpoint = (previous.x + target.x) / 2.0;\n        ctx.lineTo(midpoint, previous.y);\n        ctx.lineTo(midpoint, target.y);\n    } else if (mode === 'after' !== !!flip) {\n        ctx.lineTo(previous.x, target.y);\n    } else {\n        ctx.lineTo(target.x, previous.y);\n    }\n    ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n    if (!previous) {\n        return ctx.lineTo(target.x, target.y);\n    }\n    ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n    if (opts.translation) {\n        ctx.translate(opts.translation[0], opts.translation[1]);\n    }\n    if (!isNullOrUndef(opts.rotation)) {\n        ctx.rotate(opts.rotation);\n    }\n    if (opts.color) {\n        ctx.fillStyle = opts.color;\n    }\n    if (opts.textAlign) {\n        ctx.textAlign = opts.textAlign;\n    }\n    if (opts.textBaseline) {\n        ctx.textBaseline = opts.textBaseline;\n    }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n    if (opts.strikethrough || opts.underline) {\n        /**\n     * Now that IE11 support has been dropped, we can use more\n     * of the TextMetrics object. The actual bounding boxes\n     * are unflagged in Chrome, Firefox, Edge, and Safari so they\n     * can be safely used.\n     * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n     */ const metrics = ctx.measureText(line);\n        const left = x - metrics.actualBoundingBoxLeft;\n        const right = x + metrics.actualBoundingBoxRight;\n        const top = y - metrics.actualBoundingBoxAscent;\n        const bottom = y + metrics.actualBoundingBoxDescent;\n        const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n        ctx.strokeStyle = ctx.fillStyle;\n        ctx.beginPath();\n        ctx.lineWidth = opts.decorationWidth || 2;\n        ctx.moveTo(left, yDecoration);\n        ctx.lineTo(right, yDecoration);\n        ctx.stroke();\n    }\n}\nfunction drawBackdrop(ctx, opts) {\n    const oldColor = ctx.fillStyle;\n    ctx.fillStyle = opts.color;\n    ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n    ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n    const lines = isArray(text) ? text : [\n        text\n    ];\n    const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n    let i, line;\n    ctx.save();\n    ctx.font = font.string;\n    setRenderOpts(ctx, opts);\n    for(i = 0; i < lines.length; ++i){\n        line = lines[i];\n        if (opts.backdrop) {\n            drawBackdrop(ctx, opts.backdrop);\n        }\n        if (stroke) {\n            if (opts.strokeColor) {\n                ctx.strokeStyle = opts.strokeColor;\n            }\n            if (!isNullOrUndef(opts.strokeWidth)) {\n                ctx.lineWidth = opts.strokeWidth;\n            }\n            ctx.strokeText(line, x, y, opts.maxWidth);\n        }\n        ctx.fillText(line, x, y, opts.maxWidth);\n        decorateText(ctx, x, y, line, opts);\n        y += Number(font.lineHeight);\n    }\n    ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n    const { x , y , w , h , radius  } = rect;\n    // top left arc\n    ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n    // line from top left to bottom left\n    ctx.lineTo(x, y + h - radius.bottomLeft);\n    // bottom left arc\n    ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n    // line from bottom left to bottom right\n    ctx.lineTo(x + w - radius.bottomRight, y + h);\n    // bottom right arc\n    ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n    // line from bottom right to top right\n    ctx.lineTo(x + w, y + radius.topRight);\n    // top right arc\n    ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n    // line from top right to top left\n    ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n    const matches = ('' + value).match(LINE_HEIGHT);\n    if (!matches || matches[1] === 'normal') {\n        return size * 1.2;\n    }\n    value = +matches[2];\n    switch(matches[3]){\n        case 'px':\n            return value;\n        case '%':\n            value /= 100;\n            break;\n    }\n    return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n    const ret = {};\n    const objProps = isObject(props);\n    const keys = objProps ? Object.keys(props) : props;\n    const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n    for (const prop of keys){\n        ret[prop] = numberOrZero(read(prop));\n    }\n    return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n *  x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n    return _readValueToProps(value, {\n        top: 'y',\n        right: 'x',\n        bottom: 'y',\n        left: 'x'\n    });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n    return _readValueToProps(value, [\n        'topLeft',\n        'topRight',\n        'bottomLeft',\n        'bottomRight'\n    ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n *  x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n    const obj = toTRBL(value);\n    obj.width = obj.left + obj.right;\n    obj.height = obj.top + obj.bottom;\n    return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n    options = options || {};\n    fallback = fallback || defaults.font;\n    let size = valueOrDefault(options.size, fallback.size);\n    if (typeof size === 'string') {\n        size = parseInt(size, 10);\n    }\n    let style = valueOrDefault(options.style, fallback.style);\n    if (style && !('' + style).match(FONT_STYLE)) {\n        console.warn('Invalid font style specified: \"' + style + '\"');\n        style = undefined;\n    }\n    const font = {\n        family: valueOrDefault(options.family, fallback.family),\n        lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n        size,\n        style,\n        weight: valueOrDefault(options.weight, fallback.weight),\n        string: ''\n    };\n    font.string = toFontString(font);\n    return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n    let cacheable = true;\n    let i, ilen, value;\n    for(i = 0, ilen = inputs.length; i < ilen; ++i){\n        value = inputs[i];\n        if (value === undefined) {\n            continue;\n        }\n        if (context !== undefined && typeof value === 'function') {\n            value = value(context);\n            cacheable = false;\n        }\n        if (index !== undefined && isArray(value)) {\n            value = value[index % value.length];\n            cacheable = false;\n        }\n        if (value !== undefined) {\n            if (info && !cacheable) {\n                info.cacheable = false;\n            }\n            return value;\n        }\n    }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n    const { min , max  } = minmax;\n    const change = toDimension(grace, (max - min) / 2);\n    const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n    return {\n        min: keepZero(min, -Math.abs(change)),\n        max: keepZero(max, change)\n    };\n}\nfunction createContext(parentContext, context) {\n    return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n    ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n    const finalRootScopes = rootScopes || scopes;\n    if (typeof fallback === 'undefined') {\n        fallback = _resolve('_fallback', scopes);\n    }\n    const cache = {\n        [Symbol.toStringTag]: 'Object',\n        _cacheable: true,\n        _scopes: scopes,\n        _rootScopes: finalRootScopes,\n        _fallback: fallback,\n        _getTarget: getTarget,\n        override: (scope)=>_createResolver([\n                scope,\n                ...scopes\n            ], prefixes, finalRootScopes, fallback)\n    };\n    return new Proxy(cache, {\n        /**\n     * A trap for the delete operator.\n     */ deleteProperty (target, prop) {\n            delete target[prop]; // remove from cache\n            delete target._keys; // remove cached keys\n            delete scopes[0][prop]; // remove from top level scope\n            return true;\n        },\n        /**\n     * A trap for getting property values.\n     */ get (target, prop) {\n            return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n        },\n        /**\n     * A trap for Object.getOwnPropertyDescriptor.\n     * Also used by Object.hasOwnProperty.\n     */ getOwnPropertyDescriptor (target, prop) {\n            return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n        },\n        /**\n     * A trap for Object.getPrototypeOf.\n     */ getPrototypeOf () {\n            return Reflect.getPrototypeOf(scopes[0]);\n        },\n        /**\n     * A trap for the in operator.\n     */ has (target, prop) {\n            return getKeysFromAllScopes(target).includes(prop);\n        },\n        /**\n     * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n     */ ownKeys (target) {\n            return getKeysFromAllScopes(target);\n        },\n        /**\n     * A trap for setting property values.\n     */ set (target, prop, value) {\n            const storage = target._storage || (target._storage = getTarget());\n            target[prop] = storage[prop] = value; // set to top level scope + cache\n            delete target._keys; // remove cached keys\n            return true;\n        }\n    });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n    const cache = {\n        _cacheable: false,\n        _proxy: proxy,\n        _context: context,\n        _subProxy: subProxy,\n        _stack: new Set(),\n        _descriptors: _descriptors(proxy, descriptorDefaults),\n        setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n        override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n    };\n    return new Proxy(cache, {\n        /**\n     * A trap for the delete operator.\n     */ deleteProperty (target, prop) {\n            delete target[prop]; // remove from cache\n            delete proxy[prop]; // remove from proxy\n            return true;\n        },\n        /**\n     * A trap for getting property values.\n     */ get (target, prop, receiver) {\n            return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n        },\n        /**\n     * A trap for Object.getOwnPropertyDescriptor.\n     * Also used by Object.hasOwnProperty.\n     */ getOwnPropertyDescriptor (target, prop) {\n            return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n                enumerable: true,\n                configurable: true\n            } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n        },\n        /**\n     * A trap for Object.getPrototypeOf.\n     */ getPrototypeOf () {\n            return Reflect.getPrototypeOf(proxy);\n        },\n        /**\n     * A trap for the in operator.\n     */ has (target, prop) {\n            return Reflect.has(proxy, prop);\n        },\n        /**\n     * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n     */ ownKeys () {\n            return Reflect.ownKeys(proxy);\n        },\n        /**\n     * A trap for setting property values.\n     */ set (target, prop, value) {\n            proxy[prop] = value; // set to proxy\n            delete target[prop]; // remove from cache\n            return true;\n        }\n    });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n    scriptable: true,\n    indexable: true\n}) {\n    const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys  } = proxy;\n    return {\n        allKeys: _allKeys,\n        scriptable: _scriptable,\n        indexable: _indexable,\n        isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n        isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n    };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n    if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n        return target[prop];\n    }\n    const value = resolve();\n    // cache the resolved value\n    target[prop] = value;\n    return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n    const { _proxy , _context , _subProxy , _descriptors: descriptors  } = target;\n    let value = _proxy[prop]; // resolve from proxy\n    // resolve with context\n    if (isFunction(value) && descriptors.isScriptable(prop)) {\n        value = _resolveScriptable(prop, value, target, receiver);\n    }\n    if (isArray(value) && value.length) {\n        value = _resolveArray(prop, value, target, descriptors.isIndexable);\n    }\n    if (needsSubResolver(prop, value)) {\n        // if the resolved value is an object, create a sub resolver for it\n        value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n    }\n    return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n    const { _proxy , _context , _subProxy , _stack  } = target;\n    if (_stack.has(prop)) {\n        throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n    }\n    _stack.add(prop);\n    let value = getValue(_context, _subProxy || receiver);\n    _stack.delete(prop);\n    if (needsSubResolver(prop, value)) {\n        // When scriptable option returns an object, create a resolver on that.\n        value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n    }\n    return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n    const { _proxy , _context , _subProxy , _descriptors: descriptors  } = target;\n    if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n        return value[_context.index % value.length];\n    } else if (isObject(value[0])) {\n        // Array of objects, return array or resolvers\n        const arr = value;\n        const scopes = _proxy._scopes.filter((s)=>s !== arr);\n        value = [];\n        for (const item of arr){\n            const resolver = createSubResolver(scopes, _proxy, prop, item);\n            value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n        }\n    }\n    return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n    return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n    for (const parent of parentScopes){\n        const scope = getScope(key, parent);\n        if (scope) {\n            set.add(scope);\n            const fallback = resolveFallback(scope._fallback, key, value);\n            if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n                // When we reach the descriptor that defines a new _fallback, return that.\n                // The fallback will resume to that new scope.\n                return fallback;\n            }\n        } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n            // Fallback to `false` results to `false`, when falling back to different key.\n            // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n            return null;\n        }\n    }\n    return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n    const rootScopes = resolver._rootScopes;\n    const fallback = resolveFallback(resolver._fallback, prop, value);\n    const allScopes = [\n        ...parentScopes,\n        ...rootScopes\n    ];\n    const set = new Set();\n    set.add(value);\n    let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n    if (key === null) {\n        return false;\n    }\n    if (typeof fallback !== 'undefined' && fallback !== prop) {\n        key = addScopesFromKey(set, allScopes, fallback, key, value);\n        if (key === null) {\n            return false;\n        }\n    }\n    return _createResolver(Array.from(set), [\n        ''\n    ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n    while(key){\n        key = addScopes(set, allScopes, key, fallback, item);\n    }\n    return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n    const parent = resolver._getTarget();\n    if (!(prop in parent)) {\n        parent[prop] = {};\n    }\n    const target = parent[prop];\n    if (isArray(target) && isObject(value)) {\n        // For array of objects, the object is used to store updated values\n        return value;\n    }\n    return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n    let value;\n    for (const prefix of prefixes){\n        value = _resolve(readKey(prefix, prop), scopes);\n        if (typeof value !== 'undefined') {\n            return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n        }\n    }\n}\nfunction _resolve(key, scopes) {\n    for (const scope of scopes){\n        if (!scope) {\n            continue;\n        }\n        const value = scope[key];\n        if (typeof value !== 'undefined') {\n            return value;\n        }\n    }\n}\nfunction getKeysFromAllScopes(target) {\n    let keys = target._keys;\n    if (!keys) {\n        keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n    }\n    return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n    const set = new Set();\n    for (const scope of scopes){\n        for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n            set.add(key);\n        }\n    }\n    return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n    const { iScale  } = meta;\n    const { key ='r'  } = this._parsing;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for(i = 0, ilen = count; i < ilen; ++i){\n        index = i + start;\n        item = data[index];\n        parsed[i] = {\n            r: iScale.parse(resolveObjectKey(item, key), index)\n        };\n    }\n    return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n    // Props to Rob Spencer at scaled innovation for his post on splining between points\n    // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n    // This function must also respect \"skipped\" points\n    const previous = firstPoint.skip ? middlePoint : firstPoint;\n    const current = middlePoint;\n    const next = afterPoint.skip ? middlePoint : afterPoint;\n    const d01 = distanceBetweenPoints(current, previous);\n    const d12 = distanceBetweenPoints(next, current);\n    let s01 = d01 / (d01 + d12);\n    let s12 = d12 / (d01 + d12);\n    // If all points are the same, s01 & s02 will be inf\n    s01 = isNaN(s01) ? 0 : s01;\n    s12 = isNaN(s12) ? 0 : s12;\n    const fa = t * s01; // scaling factor for triangle Ta\n    const fb = t * s12;\n    return {\n        previous: {\n            x: current.x - fa * (next.x - previous.x),\n            y: current.y - fa * (next.y - previous.y)\n        },\n        next: {\n            x: current.x + fb * (next.x - previous.x),\n            y: current.y + fb * (next.y - previous.y)\n        }\n    };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n    const pointsLen = points.length;\n    let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n    let pointAfter = getPoint(points, 0);\n    for(let i = 0; i < pointsLen - 1; ++i){\n        pointCurrent = pointAfter;\n        pointAfter = getPoint(points, i + 1);\n        if (!pointCurrent || !pointAfter) {\n            continue;\n        }\n        if (almostEquals(deltaK[i], 0, EPSILON)) {\n            mK[i] = mK[i + 1] = 0;\n            continue;\n        }\n        alphaK = mK[i] / deltaK[i];\n        betaK = mK[i + 1] / deltaK[i];\n        squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n        if (squaredMagnitude <= 9) {\n            continue;\n        }\n        tauK = 3 / Math.sqrt(squaredMagnitude);\n        mK[i] = alphaK * tauK * deltaK[i];\n        mK[i + 1] = betaK * tauK * deltaK[i];\n    }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n    const valueAxis = getValueAxis(indexAxis);\n    const pointsLen = points.length;\n    let delta, pointBefore, pointCurrent;\n    let pointAfter = getPoint(points, 0);\n    for(let i = 0; i < pointsLen; ++i){\n        pointBefore = pointCurrent;\n        pointCurrent = pointAfter;\n        pointAfter = getPoint(points, i + 1);\n        if (!pointCurrent) {\n            continue;\n        }\n        const iPixel = pointCurrent[indexAxis];\n        const vPixel = pointCurrent[valueAxis];\n        if (pointBefore) {\n            delta = (iPixel - pointBefore[indexAxis]) / 3;\n            pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n            pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n        }\n        if (pointAfter) {\n            delta = (pointAfter[indexAxis] - iPixel) / 3;\n            pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n            pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n        }\n    }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n    const valueAxis = getValueAxis(indexAxis);\n    const pointsLen = points.length;\n    const deltaK = Array(pointsLen).fill(0);\n    const mK = Array(pointsLen);\n    // Calculate slopes (deltaK) and initialize tangents (mK)\n    let i, pointBefore, pointCurrent;\n    let pointAfter = getPoint(points, 0);\n    for(i = 0; i < pointsLen; ++i){\n        pointBefore = pointCurrent;\n        pointCurrent = pointAfter;\n        pointAfter = getPoint(points, i + 1);\n        if (!pointCurrent) {\n            continue;\n        }\n        if (pointAfter) {\n            const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n            // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n            deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n        }\n        mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n    }\n    monotoneAdjust(points, deltaK, mK);\n    monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n    return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n    let i, ilen, point, inArea, inAreaPrev;\n    let inAreaNext = _isPointInArea(points[0], area);\n    for(i = 0, ilen = points.length; i < ilen; ++i){\n        inAreaPrev = inArea;\n        inArea = inAreaNext;\n        inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n        if (!inArea) {\n            continue;\n        }\n        point = points[i];\n        if (inAreaPrev) {\n            point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n            point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n        }\n        if (inAreaNext) {\n            point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n            point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n        }\n    }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n    let i, ilen, point, controlPoints;\n    // Only consider points that are drawn in case the spanGaps option is used\n    if (options.spanGaps) {\n        points = points.filter((pt)=>!pt.skip);\n    }\n    if (options.cubicInterpolationMode === 'monotone') {\n        splineCurveMonotone(points, indexAxis);\n    } else {\n        let prev = loop ? points[points.length - 1] : points[0];\n        for(i = 0, ilen = points.length; i < ilen; ++i){\n            point = points[i];\n            controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n            point.cp1x = controlPoints.previous.x;\n            point.cp1y = controlPoints.previous.y;\n            point.cp2x = controlPoints.next.x;\n            point.cp2y = controlPoints.next.y;\n            prev = point;\n        }\n    }\n    if (options.capBezierPoints) {\n        capBezierPoints(points, area);\n    }\n}\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */ /**\n * @private\n */ function _isDomSupported() {\n    return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n    let parent = domNode.parentNode;\n    if (parent && parent.toString() === '[object ShadowRoot]') {\n        parent = parent.host;\n    }\n    return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n    let valueInPixels;\n    if (typeof styleValue === 'string') {\n        valueInPixels = parseInt(styleValue, 10);\n        if (styleValue.indexOf('%') !== -1) {\n            // percentage * size in dimension\n            valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n        }\n    } else {\n        valueInPixels = styleValue;\n    }\n    return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n    return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n    'top',\n    'right',\n    'bottom',\n    'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n    const result = {};\n    suffix = suffix ? '-' + suffix : '';\n    for(let i = 0; i < 4; i++){\n        const pos = positions[i];\n        result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n    }\n    result.width = result.left + result.right;\n    result.height = result.top + result.bottom;\n    return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n    const touches = e.touches;\n    const source = touches && touches.length ? touches[0] : e;\n    const { offsetX , offsetY  } = source;\n    let box = false;\n    let x, y;\n    if (useOffsetPos(offsetX, offsetY, e.target)) {\n        x = offsetX;\n        y = offsetY;\n    } else {\n        const rect = canvas.getBoundingClientRect();\n        x = source.clientX - rect.left;\n        y = source.clientY - rect.top;\n        box = true;\n    }\n    return {\n        x,\n        y,\n        box\n    };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n    if ('native' in event) {\n        return event;\n    }\n    const { canvas , currentDevicePixelRatio  } = chart;\n    const style = getComputedStyle(canvas);\n    const borderBox = style.boxSizing === 'border-box';\n    const paddings = getPositionedStyle(style, 'padding');\n    const borders = getPositionedStyle(style, 'border', 'width');\n    const { x , y , box  } = getCanvasPosition(event, canvas);\n    const xOffset = paddings.left + (box && borders.left);\n    const yOffset = paddings.top + (box && borders.top);\n    let { width , height  } = chart;\n    if (borderBox) {\n        width -= paddings.width + borders.width;\n        height -= paddings.height + borders.height;\n    }\n    return {\n        x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n        y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n    };\n}\nfunction getContainerSize(canvas, width, height) {\n    let maxWidth, maxHeight;\n    if (width === undefined || height === undefined) {\n        const container = canvas && _getParentNode(canvas);\n        if (!container) {\n            width = canvas.clientWidth;\n            height = canvas.clientHeight;\n        } else {\n            const rect = container.getBoundingClientRect(); // this is the border box of the container\n            const containerStyle = getComputedStyle(container);\n            const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n            const containerPadding = getPositionedStyle(containerStyle, 'padding');\n            width = rect.width - containerPadding.width - containerBorder.width;\n            height = rect.height - containerPadding.height - containerBorder.height;\n            maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n            maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n        }\n    }\n    return {\n        width,\n        height,\n        maxWidth: maxWidth || INFINITY,\n        maxHeight: maxHeight || INFINITY\n    };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n    const style = getComputedStyle(canvas);\n    const margins = getPositionedStyle(style, 'margin');\n    const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n    const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n    const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n    let { width , height  } = containerSize;\n    if (style.boxSizing === 'content-box') {\n        const borders = getPositionedStyle(style, 'border', 'width');\n        const paddings = getPositionedStyle(style, 'padding');\n        width -= paddings.width + borders.width;\n        height -= paddings.height + borders.height;\n    }\n    width = Math.max(0, width - margins.width);\n    height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n    width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n    height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n    if (width && !height) {\n        // https://github.com/chartjs/Chart.js/issues/4659\n        // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n        height = round1(width / 2);\n    }\n    const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n    if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n        height = containerSize.height;\n        width = round1(Math.floor(height * aspectRatio));\n    }\n    return {\n        width,\n        height\n    };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n    const pixelRatio = forceRatio || 1;\n    const deviceHeight = Math.floor(chart.height * pixelRatio);\n    const deviceWidth = Math.floor(chart.width * pixelRatio);\n    chart.height = Math.floor(chart.height);\n    chart.width = Math.floor(chart.width);\n    const canvas = chart.canvas;\n    // If no style has been set on the canvas, the render size is used as display size,\n    // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n    // See https://github.com/chartjs/Chart.js/issues/3575\n    if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n        canvas.style.height = `${chart.height}px`;\n        canvas.style.width = `${chart.width}px`;\n    }\n    if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n        chart.currentDevicePixelRatio = pixelRatio;\n        canvas.height = deviceHeight;\n        canvas.width = deviceWidth;\n        chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n        return true;\n    }\n    return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n    let passiveSupported = false;\n    try {\n        const options = {\n            get passive () {\n                passiveSupported = true;\n                return false;\n            }\n        };\n        if (_isDomSupported()) {\n            window.addEventListener('test', null, options);\n            window.removeEventListener('test', null, options);\n        }\n    } catch (e) {\n    // continue regardless of error\n    }\n    return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n    const value = getStyle(element, property);\n    const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n    return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n    return {\n        x: p1.x + t * (p2.x - p1.x),\n        y: p1.y + t * (p2.y - p1.y)\n    };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n    return {\n        x: p1.x + t * (p2.x - p1.x),\n        y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n    };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n    const cp1 = {\n        x: p1.cp2x,\n        y: p1.cp2y\n    };\n    const cp2 = {\n        x: p2.cp1x,\n        y: p2.cp1y\n    };\n    const a = _pointInLine(p1, cp1, t);\n    const b = _pointInLine(cp1, cp2, t);\n    const c = _pointInLine(cp2, p2, t);\n    const d = _pointInLine(a, b, t);\n    const e = _pointInLine(b, c, t);\n    return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n    return {\n        x (x) {\n            return rectX + rectX + width - x;\n        },\n        setWidth (w) {\n            width = w;\n        },\n        textAlign (align) {\n            if (align === 'center') {\n                return align;\n            }\n            return align === 'right' ? 'left' : 'right';\n        },\n        xPlus (x, value) {\n            return x - value;\n        },\n        leftForLtr (x, itemWidth) {\n            return x - itemWidth;\n        }\n    };\n};\nconst getLeftToRightAdapter = function() {\n    return {\n        x (x) {\n            return x;\n        },\n        setWidth (w) {},\n        textAlign (align) {\n            return align;\n        },\n        xPlus (x, value) {\n            return x + value;\n        },\n        leftForLtr (x, _itemWidth) {\n            return x;\n        }\n    };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n    return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n    let style, original;\n    if (direction === 'ltr' || direction === 'rtl') {\n        style = ctx.canvas.style;\n        original = [\n            style.getPropertyValue('direction'),\n            style.getPropertyPriority('direction')\n        ];\n        style.setProperty('direction', direction, 'important');\n        ctx.prevTextDirection = original;\n    }\n}\nfunction restoreTextDirection(ctx, original) {\n    if (original !== undefined) {\n        delete ctx.prevTextDirection;\n        ctx.canvas.style.setProperty('direction', original[0], original[1]);\n    }\n}\n\nfunction propertyFn(property) {\n    if (property === 'angle') {\n        return {\n            between: _angleBetween,\n            compare: _angleDiff,\n            normalize: _normalizeAngle\n        };\n    }\n    return {\n        between: _isBetween,\n        compare: (a, b)=>a - b,\n        normalize: (x)=>x\n    };\n}\nfunction normalizeSegment({ start , end , count , loop , style  }) {\n    return {\n        start: start % count,\n        end: end % count,\n        loop: loop && (end - start + 1) % count === 0,\n        style\n    };\n}\nfunction getSegment(segment, points, bounds) {\n    const { property , start: startBound , end: endBound  } = bounds;\n    const { between , normalize  } = propertyFn(property);\n    const count = points.length;\n    let { start , end , loop  } = segment;\n    let i, ilen;\n    if (loop) {\n        start += count;\n        end += count;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n                break;\n            }\n            start--;\n            end--;\n        }\n        start %= count;\n        end %= count;\n    }\n    if (end < start) {\n        end += count;\n    }\n    return {\n        start,\n        end,\n        loop,\n        style: segment.style\n    };\n}\n function _boundSegment(segment, points, bounds) {\n    if (!bounds) {\n        return [\n            segment\n        ];\n    }\n    const { property , start: startBound , end: endBound  } = bounds;\n    const count = points.length;\n    const { compare , between , normalize  } = propertyFn(property);\n    const { start , end , loop , style  } = getSegment(segment, points, bounds);\n    const result = [];\n    let inside = false;\n    let subStart = null;\n    let value, point, prevValue;\n    const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n    const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n    const shouldStart = ()=>inside || startIsBefore();\n    const shouldStop = ()=>!inside || endIsBefore();\n    for(let i = start, prev = start; i <= end; ++i){\n        point = points[i % count];\n        if (point.skip) {\n            continue;\n        }\n        value = normalize(point[property]);\n        if (value === prevValue) {\n            continue;\n        }\n        inside = between(value, startBound, endBound);\n        if (subStart === null && shouldStart()) {\n            subStart = compare(value, startBound) === 0 ? i : prev;\n        }\n        if (subStart !== null && shouldStop()) {\n            result.push(normalizeSegment({\n                start: subStart,\n                end: i,\n                loop,\n                count,\n                style\n            }));\n            subStart = null;\n        }\n        prev = i;\n        prevValue = value;\n    }\n    if (subStart !== null) {\n        result.push(normalizeSegment({\n            start: subStart,\n            end,\n            loop,\n            count,\n            style\n        }));\n    }\n    return result;\n}\n function _boundSegments(line, bounds) {\n    const result = [];\n    const segments = line.segments;\n    for(let i = 0; i < segments.length; i++){\n        const sub = _boundSegment(segments[i], line.points, bounds);\n        if (sub.length) {\n            result.push(...sub);\n        }\n    }\n    return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n    let start = 0;\n    let end = count - 1;\n    if (loop && !spanGaps) {\n        while(start < count && !points[start].skip){\n            start++;\n        }\n    }\n    while(start < count && points[start].skip){\n        start++;\n    }\n    start %= count;\n    if (loop) {\n        end += start;\n    }\n    while(end > start && points[end % count].skip){\n        end--;\n    }\n    end %= count;\n    return {\n        start,\n        end\n    };\n}\n function solidSegments(points, start, max, loop) {\n    const count = points.length;\n    const result = [];\n    let last = start;\n    let prev = points[start];\n    let end;\n    for(end = start + 1; end <= max; ++end){\n        const cur = points[end % count];\n        if (cur.skip || cur.stop) {\n            if (!prev.skip) {\n                loop = false;\n                result.push({\n                    start: start % count,\n                    end: (end - 1) % count,\n                    loop\n                });\n                start = last = cur.stop ? end : null;\n            }\n        } else {\n            last = end;\n            if (prev.skip) {\n                start = end;\n            }\n        }\n        prev = cur;\n    }\n    if (last !== null) {\n        result.push({\n            start: start % count,\n            end: last % count,\n            loop\n        });\n    }\n    return result;\n}\n function _computeSegments(line, segmentOptions) {\n    const points = line.points;\n    const spanGaps = line.options.spanGaps;\n    const count = points.length;\n    if (!count) {\n        return [];\n    }\n    const loop = !!line._loop;\n    const { start , end  } = findStartAndEnd(points, count, loop, spanGaps);\n    if (spanGaps === true) {\n        return splitByStyles(line, [\n            {\n                start,\n                end,\n                loop\n            }\n        ], points, segmentOptions);\n    }\n    const max = end < start ? end + count : end;\n    const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n    return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n    if (!segmentOptions || !segmentOptions.setContext || !points) {\n        return segments;\n    }\n    return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n    const chartContext = line._chart.getContext();\n    const baseStyle = readStyle(line.options);\n    const { _datasetIndex: datasetIndex , options: { spanGaps  }  } = line;\n    const count = points.length;\n    const result = [];\n    let prevStyle = baseStyle;\n    let start = segments[0].start;\n    let i = start;\n    function addStyle(s, e, l, st) {\n        const dir = spanGaps ? -1 : 1;\n        if (s === e) {\n            return;\n        }\n        s += count;\n        while(points[s % count].skip){\n            s -= dir;\n        }\n        while(points[e % count].skip){\n            e += dir;\n        }\n        if (s % count !== e % count) {\n            result.push({\n                start: s % count,\n                end: e % count,\n                loop: l,\n                style: st\n            });\n            prevStyle = st;\n            start = e % count;\n        }\n    }\n    for (const segment of segments){\n        start = spanGaps ? start : segment.start;\n        let prev = points[start % count];\n        let style;\n        for(i = start + 1; i <= segment.end; i++){\n            const pt = points[i % count];\n            style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n                type: 'segment',\n                p0: prev,\n                p1: pt,\n                p0DataIndex: (i - 1) % count,\n                p1DataIndex: i % count,\n                datasetIndex\n            })));\n            if (styleChanged(style, prevStyle)) {\n                addStyle(start, i - 1, segment.loop, prevStyle);\n            }\n            prev = pt;\n            prevStyle = style;\n        }\n        if (start < i - 1) {\n            addStyle(start, i - 1, segment.loop, prevStyle);\n        }\n    }\n    return result;\n}\nfunction readStyle(options) {\n    return {\n        backgroundColor: options.backgroundColor,\n        borderCapStyle: options.borderCapStyle,\n        borderDash: options.borderDash,\n        borderDashOffset: options.borderDashOffset,\n        borderJoinStyle: options.borderJoinStyle,\n        borderWidth: options.borderWidth,\n        borderColor: options.borderColor\n    };\n}\nfunction styleChanged(style, prevStyle) {\n    if (!prevStyle) {\n        return false;\n    }\n    const cache = [];\n    const replacer = function(key, value) {\n        if (!isPatternOrGradient(value)) {\n            return value;\n        }\n        if (!cache.includes(value)) {\n            cache.push(value);\n        }\n        return cache.indexOf(value);\n    };\n    return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nexport { unclipArea as $, _rlookupByKey as A, _lookupByKey as B, _isPointInArea as C, getAngleFromPoint as D, toPadding as E, each as F, getMaximumSize as G, HALF_PI as H, _getParentNode as I, readUsedSize as J, supportsEventListenerOptions as K, throttled as L, _isDomSupported as M, _factorize as N, finiteOrDefault as O, PI as P, callback as Q, _addGrace as R, _limitValue as S, TAU as T, toDegrees as U, _measureText as V, _int16Range as W, _alignPixel as X, clipArea as Y, renderText as Z, _arrayUnique as _, resolve as a, fontString as a$, toFont as a0, _toLeftRightCenter as a1, _alignStartEnd as a2, overrides as a3, merge as a4, _capitalize as a5, descriptors as a6, isFunction as a7, _attachContext as a8, _createResolver as a9, overrideTextDirection as aA, _textX as aB, restoreTextDirection as aC, drawPointLegend as aD, distanceBetweenPoints as aE, noop as aF, _setMinAndMaxByKey as aG, niceNum as aH, almostWhole as aI, almostEquals as aJ, _decimalPlaces as aK, Ticks as aL, log10 as aM, _longestText as aN, _filterBetween as aO, _lookup as aP, isPatternOrGradient as aQ, getHoverColor as aR, clone as aS, _merger as aT, _mergerIf as aU, _deprecated as aV, _splitKey as aW, toFontString as aX, splineCurve as aY, splineCurveMonotone as aZ, getStyle as a_, _descriptors as aa, mergeIf as ab, uid as ac, debounce as ad, retinaScale as ae, clearCanvas as af, setsEqual as ag, _elementsEqual as ah, _isClickEvent as ai, _isBetween as aj, _readValueToProps as ak, _updateBezierControlPoints as al, _computeSegments as am, _boundSegments as an, _steppedInterpolation as ao, _bezierInterpolation as ap, _pointInLine as aq, _steppedLineTo as ar, _bezierCurveTo as as, drawPoint as at, addRoundedRectPath as au, toTRBL as av, toTRBLCorners as aw, _boundSegment as ax, _normalizeAngle as ay, getRtlAdapter as az, isArray as b, toLineHeight as b0, PITAU as b1, INFINITY as b2, RAD_PER_DEG as b3, QUARTER_PI as b4, TWO_THIRDS_PI as b5, _angleDiff as b6, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, createContext as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, getRelativePosition as z };\n//# sourceMappingURL=helpers.segment.js.map\n","/*!\n * Chart.js v4.4.5\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, i as isObject, d as defaults, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as createContext, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as getRelativePosition, A as _rlookupByKey, B as _lookupByKey, C as _isPointInArea, D as getAngleFromPoint, E as toPadding, F as each, G as getMaximumSize, I as _getParentNode, J as readUsedSize, K as supportsEventListenerOptions, L as throttled, M as _isDomSupported, N as _factorize, O as finiteOrDefault, Q as callback, R as _addGrace, S as _limitValue, U as toDegrees, V as _measureText, W as _int16Range, X as _alignPixel, Y as clipArea, Z as renderText, $ as unclipArea, a0 as toFont, a1 as _toLeftRightCenter, a2 as _alignStartEnd, a3 as overrides, a4 as merge, a5 as _capitalize, a6 as descriptors, a7 as isFunction, a8 as _attachContext, a9 as _createResolver, aa as _descriptors, ab as mergeIf, ac as uid, ad as debounce, ae as retinaScale, af as clearCanvas, ag as setsEqual, ah as _elementsEqual, ai as _isClickEvent, aj as _isBetween, ak as _readValueToProps, al as _updateBezierControlPoints, am as _computeSegments, an as _boundSegments, ao as _steppedInterpolation, ap as _bezierInterpolation, aq as _pointInLine, ar as _steppedLineTo, as as _bezierCurveTo, at as drawPoint, au as addRoundedRectPath, av as toTRBL, aw as toTRBLCorners, ax as _boundSegment, ay as _normalizeAngle, az as getRtlAdapter, aA as overrideTextDirection, aB as _textX, aC as restoreTextDirection, aD as drawPointLegend, aE as distanceBetweenPoints, aF as noop, aG as _setMinAndMaxByKey, aH as niceNum, aI as almostWhole, aJ as almostEquals, aK as _decimalPlaces, aL as Ticks, aM as log10, aN as _longestText, aO as _filterBetween, aP as _lookup } from './chunks/helpers.segment.js';\nimport '@kurkle/color';\n\nclass Animator {\n    constructor(){\n        this._request = null;\n        this._charts = new Map();\n        this._running = false;\n        this._lastDate = undefined;\n    }\n _notify(chart, anims, date, type) {\n        const callbacks = anims.listeners[type];\n        const numSteps = anims.duration;\n        callbacks.forEach((fn)=>fn({\n                chart,\n                initial: anims.initial,\n                numSteps,\n                currentStep: Math.min(date - anims.start, numSteps)\n            }));\n    }\n _refresh() {\n        if (this._request) {\n            return;\n        }\n        this._running = true;\n        this._request = requestAnimFrame.call(window, ()=>{\n            this._update();\n            this._request = null;\n            if (this._running) {\n                this._refresh();\n            }\n        });\n    }\n _update(date = Date.now()) {\n        let remaining = 0;\n        this._charts.forEach((anims, chart)=>{\n            if (!anims.running || !anims.items.length) {\n                return;\n            }\n            const items = anims.items;\n            let i = items.length - 1;\n            let draw = false;\n            let item;\n            for(; i >= 0; --i){\n                item = items[i];\n                if (item._active) {\n                    if (item._total > anims.duration) {\n                        anims.duration = item._total;\n                    }\n                    item.tick(date);\n                    draw = true;\n                } else {\n                    items[i] = items[items.length - 1];\n                    items.pop();\n                }\n            }\n            if (draw) {\n                chart.draw();\n                this._notify(chart, anims, date, 'progress');\n            }\n            if (!items.length) {\n                anims.running = false;\n                this._notify(chart, anims, date, 'complete');\n                anims.initial = false;\n            }\n            remaining += items.length;\n        });\n        this._lastDate = date;\n        if (remaining === 0) {\n            this._running = false;\n        }\n    }\n _getAnims(chart) {\n        const charts = this._charts;\n        let anims = charts.get(chart);\n        if (!anims) {\n            anims = {\n                running: false,\n                initial: true,\n                items: [],\n                listeners: {\n                    complete: [],\n                    progress: []\n                }\n            };\n            charts.set(chart, anims);\n        }\n        return anims;\n    }\n listen(chart, event, cb) {\n        this._getAnims(chart).listeners[event].push(cb);\n    }\n add(chart, items) {\n        if (!items || !items.length) {\n            return;\n        }\n        this._getAnims(chart).items.push(...items);\n    }\n has(chart) {\n        return this._getAnims(chart).items.length > 0;\n    }\n start(chart) {\n        const anims = this._charts.get(chart);\n        if (!anims) {\n            return;\n        }\n        anims.running = true;\n        anims.start = Date.now();\n        anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n        this._refresh();\n    }\n    running(chart) {\n        if (!this._running) {\n            return false;\n        }\n        const anims = this._charts.get(chart);\n        if (!anims || !anims.running || !anims.items.length) {\n            return false;\n        }\n        return true;\n    }\n stop(chart) {\n        const anims = this._charts.get(chart);\n        if (!anims || !anims.items.length) {\n            return;\n        }\n        const items = anims.items;\n        let i = items.length - 1;\n        for(; i >= 0; --i){\n            items[i].cancel();\n        }\n        anims.items = [];\n        this._notify(chart, anims, Date.now(), 'complete');\n    }\n remove(chart) {\n        return this._charts.delete(chart);\n    }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n    boolean (from, to, factor) {\n        return factor > 0.5 ? to : from;\n    },\n color (from, to, factor) {\n        const c0 = color(from || transparent);\n        const c1 = c0.valid && color(to || transparent);\n        return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n    },\n    number (from, to, factor) {\n        return from + (to - from) * factor;\n    }\n};\nclass Animation {\n    constructor(cfg, target, prop, to){\n        const currentValue = target[prop];\n        to = resolve([\n            cfg.to,\n            to,\n            currentValue,\n            cfg.from\n        ]);\n        const from = resolve([\n            cfg.from,\n            currentValue,\n            to\n        ]);\n        this._active = true;\n        this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n        this._easing = effects[cfg.easing] || effects.linear;\n        this._start = Math.floor(Date.now() + (cfg.delay || 0));\n        this._duration = this._total = Math.floor(cfg.duration);\n        this._loop = !!cfg.loop;\n        this._target = target;\n        this._prop = prop;\n        this._from = from;\n        this._to = to;\n        this._promises = undefined;\n    }\n    active() {\n        return this._active;\n    }\n    update(cfg, to, date) {\n        if (this._active) {\n            this._notify(false);\n            const currentValue = this._target[this._prop];\n            const elapsed = date - this._start;\n            const remain = this._duration - elapsed;\n            this._start = date;\n            this._duration = Math.floor(Math.max(remain, cfg.duration));\n            this._total += elapsed;\n            this._loop = !!cfg.loop;\n            this._to = resolve([\n                cfg.to,\n                to,\n                currentValue,\n                cfg.from\n            ]);\n            this._from = resolve([\n                cfg.from,\n                currentValue,\n                to\n            ]);\n        }\n    }\n    cancel() {\n        if (this._active) {\n            this.tick(Date.now());\n            this._active = false;\n            this._notify(false);\n        }\n    }\n    tick(date) {\n        const elapsed = date - this._start;\n        const duration = this._duration;\n        const prop = this._prop;\n        const from = this._from;\n        const loop = this._loop;\n        const to = this._to;\n        let factor;\n        this._active = from !== to && (loop || elapsed < duration);\n        if (!this._active) {\n            this._target[prop] = to;\n            this._notify(true);\n            return;\n        }\n        if (elapsed < 0) {\n            this._target[prop] = from;\n            return;\n        }\n        factor = elapsed / duration % 2;\n        factor = loop && factor > 1 ? 2 - factor : factor;\n        factor = this._easing(Math.min(1, Math.max(0, factor)));\n        this._target[prop] = this._fn(from, to, factor);\n    }\n    wait() {\n        const promises = this._promises || (this._promises = []);\n        return new Promise((res, rej)=>{\n            promises.push({\n                res,\n                rej\n            });\n        });\n    }\n    _notify(resolved) {\n        const method = resolved ? 'res' : 'rej';\n        const promises = this._promises || [];\n        for(let i = 0; i < promises.length; i++){\n            promises[i][method]();\n        }\n    }\n}\n\nclass Animations {\n    constructor(chart, config){\n        this._chart = chart;\n        this._properties = new Map();\n        this.configure(config);\n    }\n    configure(config) {\n        if (!isObject(config)) {\n            return;\n        }\n        const animationOptions = Object.keys(defaults.animation);\n        const animatedProps = this._properties;\n        Object.getOwnPropertyNames(config).forEach((key)=>{\n            const cfg = config[key];\n            if (!isObject(cfg)) {\n                return;\n            }\n            const resolved = {};\n            for (const option of animationOptions){\n                resolved[option] = cfg[option];\n            }\n            (isArray(cfg.properties) && cfg.properties || [\n                key\n            ]).forEach((prop)=>{\n                if (prop === key || !animatedProps.has(prop)) {\n                    animatedProps.set(prop, resolved);\n                }\n            });\n        });\n    }\n _animateOptions(target, values) {\n        const newOptions = values.options;\n        const options = resolveTargetOptions(target, newOptions);\n        if (!options) {\n            return [];\n        }\n        const animations = this._createAnimations(options, newOptions);\n        if (newOptions.$shared) {\n            awaitAll(target.options.$animations, newOptions).then(()=>{\n                target.options = newOptions;\n            }, ()=>{\n            });\n        }\n        return animations;\n    }\n _createAnimations(target, values) {\n        const animatedProps = this._properties;\n        const animations = [];\n        const running = target.$animations || (target.$animations = {});\n        const props = Object.keys(values);\n        const date = Date.now();\n        let i;\n        for(i = props.length - 1; i >= 0; --i){\n            const prop = props[i];\n            if (prop.charAt(0) === '$') {\n                continue;\n            }\n            if (prop === 'options') {\n                animations.push(...this._animateOptions(target, values));\n                continue;\n            }\n            const value = values[prop];\n            let animation = running[prop];\n            const cfg = animatedProps.get(prop);\n            if (animation) {\n                if (cfg && animation.active()) {\n                    animation.update(cfg, value, date);\n                    continue;\n                } else {\n                    animation.cancel();\n                }\n            }\n            if (!cfg || !cfg.duration) {\n                target[prop] = value;\n                continue;\n            }\n            running[prop] = animation = new Animation(cfg, target, prop, value);\n            animations.push(animation);\n        }\n        return animations;\n    }\n update(target, values) {\n        if (this._properties.size === 0) {\n            Object.assign(target, values);\n            return;\n        }\n        const animations = this._createAnimations(target, values);\n        if (animations.length) {\n            animator.add(this._chart, animations);\n            return true;\n        }\n    }\n}\nfunction awaitAll(animations, properties) {\n    const running = [];\n    const keys = Object.keys(properties);\n    for(let i = 0; i < keys.length; i++){\n        const anim = animations[keys[i]];\n        if (anim && anim.active()) {\n            running.push(anim.wait());\n        }\n    }\n    return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n    if (!newOptions) {\n        return;\n    }\n    let options = target.options;\n    if (!options) {\n        target.options = newOptions;\n        return;\n    }\n    if (options.$shared) {\n        target.options = options = Object.assign({}, options, {\n            $shared: false,\n            $animations: {}\n        });\n    }\n    return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n    const opts = scale && scale.options || {};\n    const reverse = opts.reverse;\n    const min = opts.min === undefined ? allowedOverflow : 0;\n    const max = opts.max === undefined ? allowedOverflow : 0;\n    return {\n        start: reverse ? max : min,\n        end: reverse ? min : max\n    };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n    if (allowedOverflow === false) {\n        return false;\n    }\n    const x = scaleClip(xScale, allowedOverflow);\n    const y = scaleClip(yScale, allowedOverflow);\n    return {\n        top: y.end,\n        right: x.end,\n        bottom: y.start,\n        left: x.start\n    };\n}\nfunction toClip(value) {\n    let t, r, b, l;\n    if (isObject(value)) {\n        t = value.top;\n        r = value.right;\n        b = value.bottom;\n        l = value.left;\n    } else {\n        t = r = b = l = value;\n    }\n    return {\n        top: t,\n        right: r,\n        bottom: b,\n        left: l,\n        disabled: value === false\n    };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n    const keys = [];\n    const metasets = chart._getSortedDatasetMetas(filterVisible);\n    let i, ilen;\n    for(i = 0, ilen = metasets.length; i < ilen; ++i){\n        keys.push(metasets[i].index);\n    }\n    return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n    const keys = stack.keys;\n    const singleMode = options.mode === 'single';\n    let i, ilen, datasetIndex, otherValue;\n    if (value === null) {\n        return;\n    }\n    for(i = 0, ilen = keys.length; i < ilen; ++i){\n        datasetIndex = +keys[i];\n        if (datasetIndex === dsIndex) {\n            if (options.all) {\n                continue;\n            }\n            break;\n        }\n        otherValue = stack.values[datasetIndex];\n        if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n            value += otherValue;\n        }\n    }\n    return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n    const { iScale , vScale  } = meta;\n    const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n    const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n    const keys = Object.keys(data);\n    const adata = new Array(keys.length);\n    let i, ilen, key;\n    for(i = 0, ilen = keys.length; i < ilen; ++i){\n        key = keys[i];\n        adata[i] = {\n            [iAxisKey]: key,\n            [vAxisKey]: data[key]\n        };\n    }\n    return adata;\n}\nfunction isStacked(scale, meta) {\n    const stacked = scale && scale.options.stacked;\n    return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n    return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n    const { min , max , minDefined , maxDefined  } = scale.getUserBounds();\n    return {\n        min: minDefined ? min : Number.NEGATIVE_INFINITY,\n        max: maxDefined ? max : Number.POSITIVE_INFINITY\n    };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n    const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n    return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n    for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n        const value = stack[meta.index];\n        if (positive && value > 0 || !positive && value < 0) {\n            return meta.index;\n        }\n    }\n    return null;\n}\nfunction updateStacks(controller, parsed) {\n    const { chart , _cachedMeta: meta  } = controller;\n    const stacks = chart._stacks || (chart._stacks = {});\n    const { iScale , vScale , index: datasetIndex  } = meta;\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const key = getStackKey(iScale, vScale, meta);\n    const ilen = parsed.length;\n    let stack;\n    for(let i = 0; i < ilen; ++i){\n        const item = parsed[i];\n        const { [iAxis]: index , [vAxis]: value  } = item;\n        const itemStacks = item._stacks || (item._stacks = {});\n        stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n        stack[datasetIndex] = value;\n        stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n        stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n        const visualValues = stack._visualValues || (stack._visualValues = {});\n        visualValues[datasetIndex] = value;\n    }\n}\nfunction getFirstScaleId(chart, axis) {\n    const scales = chart.scales;\n    return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n    return createContext(parent, {\n        active: false,\n        dataset: undefined,\n        datasetIndex: index,\n        index,\n        mode: 'default',\n        type: 'dataset'\n    });\n}\nfunction createDataContext(parent, index, element) {\n    return createContext(parent, {\n        active: false,\n        dataIndex: index,\n        parsed: undefined,\n        raw: undefined,\n        element,\n        index,\n        mode: 'default',\n        type: 'data'\n    });\n}\nfunction clearStacks(meta, items) {\n    const datasetIndex = meta.controller.index;\n    const axis = meta.vScale && meta.vScale.axis;\n    if (!axis) {\n        return;\n    }\n    items = items || meta._parsed;\n    for (const parsed of items){\n        const stacks = parsed._stacks;\n        if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n            return;\n        }\n        delete stacks[axis][datasetIndex];\n        if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n            delete stacks[axis]._visualValues[datasetIndex];\n        }\n    }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n        keys: getSortedDatasetIndices(chart, true),\n        values: null\n    };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n        this.chart = chart;\n        this._ctx = chart.ctx;\n        this.index = datasetIndex;\n        this._cachedDataOpts = {};\n        this._cachedMeta = this.getMeta();\n        this._type = this._cachedMeta.type;\n        this.options = undefined;\n         this._parsing = false;\n        this._data = undefined;\n        this._objectData = undefined;\n        this._sharedOptions = undefined;\n        this._drawStart = undefined;\n        this._drawCount = undefined;\n        this.enableOptionSharing = false;\n        this.supportsDecimation = false;\n        this.$context = undefined;\n        this._syncList = [];\n        this.datasetElementType = new.target.datasetElementType;\n        this.dataElementType = new.target.dataElementType;\n        this.initialize();\n    }\n    initialize() {\n        const meta = this._cachedMeta;\n        this.configure();\n        this.linkScales();\n        meta._stacked = isStacked(meta.vScale, meta);\n        this.addElements();\n        if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n            console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n        }\n    }\n    updateIndex(datasetIndex) {\n        if (this.index !== datasetIndex) {\n            clearStacks(this._cachedMeta);\n        }\n        this.index = datasetIndex;\n    }\n    linkScales() {\n        const chart = this.chart;\n        const meta = this._cachedMeta;\n        const dataset = this.getDataset();\n        const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n        const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n        const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n        const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n        const indexAxis = meta.indexAxis;\n        const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n        const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n        meta.xScale = this.getScaleForId(xid);\n        meta.yScale = this.getScaleForId(yid);\n        meta.rScale = this.getScaleForId(rid);\n        meta.iScale = this.getScaleForId(iid);\n        meta.vScale = this.getScaleForId(vid);\n    }\n    getDataset() {\n        return this.chart.data.datasets[this.index];\n    }\n    getMeta() {\n        return this.chart.getDatasetMeta(this.index);\n    }\n getScaleForId(scaleID) {\n        return this.chart.scales[scaleID];\n    }\n _getOtherScale(scale) {\n        const meta = this._cachedMeta;\n        return scale === meta.iScale ? meta.vScale : meta.iScale;\n    }\n    reset() {\n        this._update('reset');\n    }\n _destroy() {\n        const meta = this._cachedMeta;\n        if (this._data) {\n            unlistenArrayEvents(this._data, this);\n        }\n        if (meta._stacked) {\n            clearStacks(meta);\n        }\n    }\n _dataCheck() {\n        const dataset = this.getDataset();\n        const data = dataset.data || (dataset.data = []);\n        const _data = this._data;\n        if (isObject(data)) {\n            const meta = this._cachedMeta;\n            this._data = convertObjectDataToArray(data, meta);\n        } else if (_data !== data) {\n            if (_data) {\n                unlistenArrayEvents(_data, this);\n                const meta = this._cachedMeta;\n                clearStacks(meta);\n                meta._parsed = [];\n            }\n            if (data && Object.isExtensible(data)) {\n                listenArrayEvents(data, this);\n            }\n            this._syncList = [];\n            this._data = data;\n        }\n    }\n    addElements() {\n        const meta = this._cachedMeta;\n        this._dataCheck();\n        if (this.datasetElementType) {\n            meta.dataset = new this.datasetElementType();\n        }\n    }\n    buildOrUpdateElements(resetNewElements) {\n        const meta = this._cachedMeta;\n        const dataset = this.getDataset();\n        let stackChanged = false;\n        this._dataCheck();\n        const oldStacked = meta._stacked;\n        meta._stacked = isStacked(meta.vScale, meta);\n        if (meta.stack !== dataset.stack) {\n            stackChanged = true;\n            clearStacks(meta);\n            meta.stack = dataset.stack;\n        }\n        this._resyncElements(resetNewElements);\n        if (stackChanged || oldStacked !== meta._stacked) {\n            updateStacks(this, meta._parsed);\n            meta._stacked = isStacked(meta.vScale, meta);\n        }\n    }\n configure() {\n        const config = this.chart.config;\n        const scopeKeys = config.datasetScopeKeys(this._type);\n        const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n        this.options = config.createResolver(scopes, this.getContext());\n        this._parsing = this.options.parsing;\n        this._cachedDataOpts = {};\n    }\n parse(start, count) {\n        const { _cachedMeta: meta , _data: data  } = this;\n        const { iScale , _stacked  } = meta;\n        const iAxis = iScale.axis;\n        let sorted = start === 0 && count === data.length ? true : meta._sorted;\n        let prev = start > 0 && meta._parsed[start - 1];\n        let i, cur, parsed;\n        if (this._parsing === false) {\n            meta._parsed = data;\n            meta._sorted = true;\n            parsed = data;\n        } else {\n            if (isArray(data[start])) {\n                parsed = this.parseArrayData(meta, data, start, count);\n            } else if (isObject(data[start])) {\n                parsed = this.parseObjectData(meta, data, start, count);\n            } else {\n                parsed = this.parsePrimitiveData(meta, data, start, count);\n            }\n            const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n            for(i = 0; i < count; ++i){\n                meta._parsed[i + start] = cur = parsed[i];\n                if (sorted) {\n                    if (isNotInOrderComparedToPrev()) {\n                        sorted = false;\n                    }\n                    prev = cur;\n                }\n            }\n            meta._sorted = sorted;\n        }\n        if (_stacked) {\n            updateStacks(this, parsed);\n        }\n    }\n parsePrimitiveData(meta, data, start, count) {\n        const { iScale , vScale  } = meta;\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        const labels = iScale.getLabels();\n        const singleScale = iScale === vScale;\n        const parsed = new Array(count);\n        let i, ilen, index;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            index = i + start;\n            parsed[i] = {\n                [iAxis]: singleScale || iScale.parse(labels[index], index),\n                [vAxis]: vScale.parse(data[index], index)\n            };\n        }\n        return parsed;\n    }\n parseArrayData(meta, data, start, count) {\n        const { xScale , yScale  } = meta;\n        const parsed = new Array(count);\n        let i, ilen, index, item;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            index = i + start;\n            item = data[index];\n            parsed[i] = {\n                x: xScale.parse(item[0], index),\n                y: yScale.parse(item[1], index)\n            };\n        }\n        return parsed;\n    }\n parseObjectData(meta, data, start, count) {\n        const { xScale , yScale  } = meta;\n        const { xAxisKey ='x' , yAxisKey ='y'  } = this._parsing;\n        const parsed = new Array(count);\n        let i, ilen, index, item;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            index = i + start;\n            item = data[index];\n            parsed[i] = {\n                x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n                y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n            };\n        }\n        return parsed;\n    }\n getParsed(index) {\n        return this._cachedMeta._parsed[index];\n    }\n getDataElement(index) {\n        return this._cachedMeta.data[index];\n    }\n applyStack(scale, parsed, mode) {\n        const chart = this.chart;\n        const meta = this._cachedMeta;\n        const value = parsed[scale.axis];\n        const stack = {\n            keys: getSortedDatasetIndices(chart, true),\n            values: parsed._stacks[scale.axis]._visualValues\n        };\n        return applyStack(stack, value, meta.index, {\n            mode\n        });\n    }\n updateRangeFromParsed(range, scale, parsed, stack) {\n        const parsedValue = parsed[scale.axis];\n        let value = parsedValue === null ? NaN : parsedValue;\n        const values = stack && parsed._stacks[scale.axis];\n        if (stack && values) {\n            stack.values = values;\n            value = applyStack(stack, parsedValue, this._cachedMeta.index);\n        }\n        range.min = Math.min(range.min, value);\n        range.max = Math.max(range.max, value);\n    }\n getMinMax(scale, canStack) {\n        const meta = this._cachedMeta;\n        const _parsed = meta._parsed;\n        const sorted = meta._sorted && scale === meta.iScale;\n        const ilen = _parsed.length;\n        const otherScale = this._getOtherScale(scale);\n        const stack = createStack(canStack, meta, this.chart);\n        const range = {\n            min: Number.POSITIVE_INFINITY,\n            max: Number.NEGATIVE_INFINITY\n        };\n        const { min: otherMin , max: otherMax  } = getUserBounds(otherScale);\n        let i, parsed;\n        function _skip() {\n            parsed = _parsed[i];\n            const otherValue = parsed[otherScale.axis];\n            return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n        }\n        for(i = 0; i < ilen; ++i){\n            if (_skip()) {\n                continue;\n            }\n            this.updateRangeFromParsed(range, scale, parsed, stack);\n            if (sorted) {\n                break;\n            }\n        }\n        if (sorted) {\n            for(i = ilen - 1; i >= 0; --i){\n                if (_skip()) {\n                    continue;\n                }\n                this.updateRangeFromParsed(range, scale, parsed, stack);\n                break;\n            }\n        }\n        return range;\n    }\n    getAllParsedValues(scale) {\n        const parsed = this._cachedMeta._parsed;\n        const values = [];\n        let i, ilen, value;\n        for(i = 0, ilen = parsed.length; i < ilen; ++i){\n            value = parsed[i][scale.axis];\n            if (isNumberFinite(value)) {\n                values.push(value);\n            }\n        }\n        return values;\n    }\n getMaxOverflow() {\n        return false;\n    }\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const iScale = meta.iScale;\n        const vScale = meta.vScale;\n        const parsed = this.getParsed(index);\n        return {\n            label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n            value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n        };\n    }\n _update(mode) {\n        const meta = this._cachedMeta;\n        this.update(mode || 'default');\n        meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n    }\n update(mode) {}\n    draw() {\n        const ctx = this._ctx;\n        const chart = this.chart;\n        const meta = this._cachedMeta;\n        const elements = meta.data || [];\n        const area = chart.chartArea;\n        const active = [];\n        const start = this._drawStart || 0;\n        const count = this._drawCount || elements.length - start;\n        const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n        let i;\n        if (meta.dataset) {\n            meta.dataset.draw(ctx, area, start, count);\n        }\n        for(i = start; i < start + count; ++i){\n            const element = elements[i];\n            if (element.hidden) {\n                continue;\n            }\n            if (element.active && drawActiveElementsOnTop) {\n                active.push(element);\n            } else {\n                element.draw(ctx, area);\n            }\n        }\n        for(i = 0; i < active.length; ++i){\n            active[i].draw(ctx, area);\n        }\n    }\n getStyle(index, active) {\n        const mode = active ? 'active' : 'default';\n        return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n    }\n getContext(index, active, mode) {\n        const dataset = this.getDataset();\n        let context;\n        if (index >= 0 && index < this._cachedMeta.data.length) {\n            const element = this._cachedMeta.data[index];\n            context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n            context.parsed = this.getParsed(index);\n            context.raw = dataset.data[index];\n            context.index = context.dataIndex = index;\n        } else {\n            context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n            context.dataset = dataset;\n            context.index = context.datasetIndex = this.index;\n        }\n        context.active = !!active;\n        context.mode = mode;\n        return context;\n    }\n resolveDatasetElementOptions(mode) {\n        return this._resolveElementOptions(this.datasetElementType.id, mode);\n    }\n resolveDataElementOptions(index, mode) {\n        return this._resolveElementOptions(this.dataElementType.id, mode, index);\n    }\n _resolveElementOptions(elementType, mode = 'default', index) {\n        const active = mode === 'active';\n        const cache = this._cachedDataOpts;\n        const cacheKey = elementType + '-' + mode;\n        const cached = cache[cacheKey];\n        const sharing = this.enableOptionSharing && defined(index);\n        if (cached) {\n            return cloneIfNotShared(cached, sharing);\n        }\n        const config = this.chart.config;\n        const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n        const prefixes = active ? [\n            `${elementType}Hover`,\n            'hover',\n            elementType,\n            ''\n        ] : [\n            elementType,\n            ''\n        ];\n        const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n        const names = Object.keys(defaults.elements[elementType]);\n        const context = ()=>this.getContext(index, active, mode);\n        const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n        if (values.$shared) {\n            values.$shared = sharing;\n            cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n        }\n        return values;\n    }\n _resolveAnimations(index, transition, active) {\n        const chart = this.chart;\n        const cache = this._cachedDataOpts;\n        const cacheKey = `animation-${transition}`;\n        const cached = cache[cacheKey];\n        if (cached) {\n            return cached;\n        }\n        let options;\n        if (chart.options.animation !== false) {\n            const config = this.chart.config;\n            const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n            const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n            options = config.createResolver(scopes, this.getContext(index, active, transition));\n        }\n        const animations = new Animations(chart, options && options.animations);\n        if (options && options._cacheable) {\n            cache[cacheKey] = Object.freeze(animations);\n        }\n        return animations;\n    }\n getSharedOptions(options) {\n        if (!options.$shared) {\n            return;\n        }\n        return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n    }\n includeOptions(mode, sharedOptions) {\n        return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n    }\n _getSharedOptions(start, mode) {\n        const firstOpts = this.resolveDataElementOptions(start, mode);\n        const previouslySharedOptions = this._sharedOptions;\n        const sharedOptions = this.getSharedOptions(firstOpts);\n        const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n        this.updateSharedOptions(sharedOptions, mode, firstOpts);\n        return {\n            sharedOptions,\n            includeOptions\n        };\n    }\n updateElement(element, index, properties, mode) {\n        if (isDirectUpdateMode(mode)) {\n            Object.assign(element, properties);\n        } else {\n            this._resolveAnimations(index, mode).update(element, properties);\n        }\n    }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n        if (sharedOptions && !isDirectUpdateMode(mode)) {\n            this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n        }\n    }\n _setStyle(element, index, mode, active) {\n        element.active = active;\n        const options = this.getStyle(index, active);\n        this._resolveAnimations(index, mode, active).update(element, {\n            options: !active && this.getSharedOptions(options) || options\n        });\n    }\n    removeHoverStyle(element, datasetIndex, index) {\n        this._setStyle(element, index, 'active', false);\n    }\n    setHoverStyle(element, datasetIndex, index) {\n        this._setStyle(element, index, 'active', true);\n    }\n _removeDatasetHoverStyle() {\n        const element = this._cachedMeta.dataset;\n        if (element) {\n            this._setStyle(element, undefined, 'active', false);\n        }\n    }\n _setDatasetHoverStyle() {\n        const element = this._cachedMeta.dataset;\n        if (element) {\n            this._setStyle(element, undefined, 'active', true);\n        }\n    }\n _resyncElements(resetNewElements) {\n        const data = this._data;\n        const elements = this._cachedMeta.data;\n        for (const [method, arg1, arg2] of this._syncList){\n            this[method](arg1, arg2);\n        }\n        this._syncList = [];\n        const numMeta = elements.length;\n        const numData = data.length;\n        const count = Math.min(numData, numMeta);\n        if (count) {\n            this.parse(0, count);\n        }\n        if (numData > numMeta) {\n            this._insertElements(numMeta, numData - numMeta, resetNewElements);\n        } else if (numData < numMeta) {\n            this._removeElements(numData, numMeta - numData);\n        }\n    }\n _insertElements(start, count, resetNewElements = true) {\n        const meta = this._cachedMeta;\n        const data = meta.data;\n        const end = start + count;\n        let i;\n        const move = (arr)=>{\n            arr.length += count;\n            for(i = arr.length - 1; i >= end; i--){\n                arr[i] = arr[i - count];\n            }\n        };\n        move(data);\n        for(i = start; i < end; ++i){\n            data[i] = new this.dataElementType();\n        }\n        if (this._parsing) {\n            move(meta._parsed);\n        }\n        this.parse(start, count);\n        if (resetNewElements) {\n            this.updateElements(data, start, count, 'reset');\n        }\n    }\n    updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n        const meta = this._cachedMeta;\n        if (this._parsing) {\n            const removed = meta._parsed.splice(start, count);\n            if (meta._stacked) {\n                clearStacks(meta, removed);\n            }\n        }\n        meta.data.splice(start, count);\n    }\n _sync(args) {\n        if (this._parsing) {\n            this._syncList.push(args);\n        } else {\n            const [method, arg1, arg2] = args;\n            this[method](arg1, arg2);\n        }\n        this.chart._dataChanges.push([\n            this.index,\n            ...args\n        ]);\n    }\n    _onDataPush() {\n        const count = arguments.length;\n        this._sync([\n            '_insertElements',\n            this.getDataset().data.length - count,\n            count\n        ]);\n    }\n    _onDataPop() {\n        this._sync([\n            '_removeElements',\n            this._cachedMeta.data.length - 1,\n            1\n        ]);\n    }\n    _onDataShift() {\n        this._sync([\n            '_removeElements',\n            0,\n            1\n        ]);\n    }\n    _onDataSplice(start, count) {\n        if (count) {\n            this._sync([\n                '_removeElements',\n                start,\n                count\n            ]);\n        }\n        const newCount = arguments.length - 2;\n        if (newCount) {\n            this._sync([\n                '_insertElements',\n                start,\n                newCount\n            ]);\n        }\n    }\n    _onDataUnshift() {\n        this._sync([\n            '_insertElements',\n            0,\n            arguments.length\n        ]);\n    }\n}\n\nfunction getAllScaleValues(scale, type) {\n    if (!scale._cache.$bar) {\n        const visibleMetas = scale.getMatchingVisibleMetas(type);\n        let values = [];\n        for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n            values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n        }\n        scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n    }\n    return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n    const scale = meta.iScale;\n    const values = getAllScaleValues(scale, meta.type);\n    let min = scale._length;\n    let i, ilen, curr, prev;\n    const updateMinAndPrev = ()=>{\n        if (curr === 32767 || curr === -32768) {\n            return;\n        }\n        if (defined(prev)) {\n            min = Math.min(min, Math.abs(curr - prev) || min);\n        }\n        prev = curr;\n    };\n    for(i = 0, ilen = values.length; i < ilen; ++i){\n        curr = scale.getPixelForValue(values[i]);\n        updateMinAndPrev();\n    }\n    prev = undefined;\n    for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n        curr = scale.getPixelForTick(i);\n        updateMinAndPrev();\n    }\n    return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n    const thickness = options.barThickness;\n    let size, ratio;\n    if (isNullOrUndef(thickness)) {\n        size = ruler.min * options.categoryPercentage;\n        ratio = options.barPercentage;\n    } else {\n        size = thickness * stackCount;\n        ratio = 1;\n    }\n    return {\n        chunk: size / stackCount,\n        ratio,\n        start: ruler.pixels[index] - size / 2\n    };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n    const pixels = ruler.pixels;\n    const curr = pixels[index];\n    let prev = index > 0 ? pixels[index - 1] : null;\n    let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n    const percent = options.categoryPercentage;\n    if (prev === null) {\n        prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n    }\n    if (next === null) {\n        next = curr + curr - prev;\n    }\n    const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n    const size = Math.abs(next - prev) / 2 * percent;\n    return {\n        chunk: size / stackCount,\n        ratio: options.barPercentage,\n        start\n    };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n    const startValue = vScale.parse(entry[0], i);\n    const endValue = vScale.parse(entry[1], i);\n    const min = Math.min(startValue, endValue);\n    const max = Math.max(startValue, endValue);\n    let barStart = min;\n    let barEnd = max;\n    if (Math.abs(min) > Math.abs(max)) {\n        barStart = max;\n        barEnd = min;\n    }\n    item[vScale.axis] = barEnd;\n    item._custom = {\n        barStart,\n        barEnd,\n        start: startValue,\n        end: endValue,\n        min,\n        max\n    };\n}\nfunction parseValue(entry, item, vScale, i) {\n    if (isArray(entry)) {\n        parseFloatBar(entry, item, vScale, i);\n    } else {\n        item[vScale.axis] = vScale.parse(entry, i);\n    }\n    return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n    const iScale = meta.iScale;\n    const vScale = meta.vScale;\n    const labels = iScale.getLabels();\n    const singleScale = iScale === vScale;\n    const parsed = [];\n    let i, ilen, item, entry;\n    for(i = start, ilen = start + count; i < ilen; ++i){\n        entry = data[i];\n        item = {};\n        item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n        parsed.push(parseValue(entry, item, vScale, i));\n    }\n    return parsed;\n}\nfunction isFloatBar(custom) {\n    return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n    if (size !== 0) {\n        return sign(size);\n    }\n    return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n    let reverse, start, end, top, bottom;\n    if (properties.horizontal) {\n        reverse = properties.base > properties.x;\n        start = 'left';\n        end = 'right';\n    } else {\n        reverse = properties.base < properties.y;\n        start = 'bottom';\n        end = 'top';\n    }\n    if (reverse) {\n        top = 'end';\n        bottom = 'start';\n    } else {\n        top = 'start';\n        bottom = 'end';\n    }\n    return {\n        start,\n        end,\n        reverse,\n        top,\n        bottom\n    };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n    let edge = options.borderSkipped;\n    const res = {};\n    if (!edge) {\n        properties.borderSkipped = res;\n        return;\n    }\n    if (edge === true) {\n        properties.borderSkipped = {\n            top: true,\n            right: true,\n            bottom: true,\n            left: true\n        };\n        return;\n    }\n    const { start , end , reverse , top , bottom  } = borderProps(properties);\n    if (edge === 'middle' && stack) {\n        properties.enableBorderRadius = true;\n        if ((stack._top || 0) === index) {\n            edge = top;\n        } else if ((stack._bottom || 0) === index) {\n            edge = bottom;\n        } else {\n            res[parseEdge(bottom, start, end, reverse)] = true;\n            edge = top;\n        }\n    }\n    res[parseEdge(edge, start, end, reverse)] = true;\n    properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n    if (reverse) {\n        edge = swap(edge, a, b);\n        edge = startEnd(edge, b, a);\n    } else {\n        edge = startEnd(edge, a, b);\n    }\n    return edge;\n}\nfunction swap(orig, v1, v2) {\n    return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n    return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount  }, ratio) {\n    properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n    static id = 'bar';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'bar',\n        categoryPercentage: 0.8,\n        barPercentage: 0.9,\n        grouped: true,\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'base',\n                    'width',\n                    'height'\n                ]\n            }\n        }\n    };\n static overrides = {\n        scales: {\n            _index_: {\n                type: 'category',\n                offset: true,\n                grid: {\n                    offset: true\n                }\n            },\n            _value_: {\n                type: 'linear',\n                beginAtZero: true\n            }\n        }\n    };\n parsePrimitiveData(meta, data, start, count) {\n        return parseArrayOrPrimitive(meta, data, start, count);\n    }\n parseArrayData(meta, data, start, count) {\n        return parseArrayOrPrimitive(meta, data, start, count);\n    }\n parseObjectData(meta, data, start, count) {\n        const { iScale , vScale  } = meta;\n        const { xAxisKey ='x' , yAxisKey ='y'  } = this._parsing;\n        const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n        const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n        const parsed = [];\n        let i, ilen, item, obj;\n        for(i = start, ilen = start + count; i < ilen; ++i){\n            obj = data[i];\n            item = {};\n            item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n            parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n        }\n        return parsed;\n    }\n updateRangeFromParsed(range, scale, parsed, stack) {\n        super.updateRangeFromParsed(range, scale, parsed, stack);\n        const custom = parsed._custom;\n        if (custom && scale === this._cachedMeta.vScale) {\n            range.min = Math.min(range.min, custom.min);\n            range.max = Math.max(range.max, custom.max);\n        }\n    }\n getMaxOverflow() {\n        return 0;\n    }\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const { iScale , vScale  } = meta;\n        const parsed = this.getParsed(index);\n        const custom = parsed._custom;\n        const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n        return {\n            label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n            value\n        };\n    }\n    initialize() {\n        this.enableOptionSharing = true;\n        super.initialize();\n        const meta = this._cachedMeta;\n        meta.stack = this.getDataset().stack;\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        this.updateElements(meta.data, 0, meta.data.length, mode);\n    }\n    updateElements(bars, start, count, mode) {\n        const reset = mode === 'reset';\n        const { index , _cachedMeta: { vScale  }  } = this;\n        const base = vScale.getBasePixel();\n        const horizontal = vScale.isHorizontal();\n        const ruler = this._getRuler();\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        for(let i = start; i < start + count; i++){\n            const parsed = this.getParsed(i);\n            const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n                base,\n                head: base\n            } : this._calculateBarValuePixels(i);\n            const ipixels = this._calculateBarIndexPixels(i, ruler);\n            const stack = (parsed._stacks || {})[vScale.axis];\n            const properties = {\n                horizontal,\n                base: vpixels.base,\n                enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n                x: horizontal ? vpixels.head : ipixels.center,\n                y: horizontal ? ipixels.center : vpixels.head,\n                height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n                width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n            };\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n            }\n            const options = properties.options || bars[i].options;\n            setBorderSkipped(properties, options, stack, index);\n            setInflateAmount(properties, options, ruler.ratio);\n            this.updateElement(bars[i], i, properties, mode);\n        }\n    }\n _getStacks(last, dataIndex) {\n        const { iScale  } = this._cachedMeta;\n        const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n        const stacked = iScale.options.stacked;\n        const stacks = [];\n        const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n        const iScaleValue = currentParsed && currentParsed[iScale.axis];\n        const skipNull = (meta)=>{\n            const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n            const val = parsed && parsed[meta.vScale.axis];\n            if (isNullOrUndef(val) || isNaN(val)) {\n                return true;\n            }\n        };\n        for (const meta of metasets){\n            if (dataIndex !== undefined && skipNull(meta)) {\n                continue;\n            }\n            if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n                stacks.push(meta.stack);\n            }\n            if (meta.index === last) {\n                break;\n            }\n        }\n        if (!stacks.length) {\n            stacks.push(undefined);\n        }\n        return stacks;\n    }\n _getStackCount(index) {\n        return this._getStacks(undefined, index).length;\n    }\n _getStackIndex(datasetIndex, name, dataIndex) {\n        const stacks = this._getStacks(datasetIndex, dataIndex);\n        const index = name !== undefined ? stacks.indexOf(name) : -1;\n        return index === -1 ? stacks.length - 1 : index;\n    }\n _getRuler() {\n        const opts = this.options;\n        const meta = this._cachedMeta;\n        const iScale = meta.iScale;\n        const pixels = [];\n        let i, ilen;\n        for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n            pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n        }\n        const barThickness = opts.barThickness;\n        const min = barThickness || computeMinSampleSize(meta);\n        return {\n            min,\n            pixels,\n            start: iScale._startPixel,\n            end: iScale._endPixel,\n            stackCount: this._getStackCount(),\n            scale: iScale,\n            grouped: opts.grouped,\n            ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n        };\n    }\n _calculateBarValuePixels(index) {\n        const { _cachedMeta: { vScale , _stacked , index: datasetIndex  } , options: { base: baseValue , minBarLength  }  } = this;\n        const actualBase = baseValue || 0;\n        const parsed = this.getParsed(index);\n        const custom = parsed._custom;\n        const floating = isFloatBar(custom);\n        let value = parsed[vScale.axis];\n        let start = 0;\n        let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n        let head, size;\n        if (length !== value) {\n            start = length - value;\n            length = value;\n        }\n        if (floating) {\n            value = custom.barStart;\n            length = custom.barEnd - custom.barStart;\n            if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n                start = 0;\n            }\n            start += value;\n        }\n        const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n        let base = vScale.getPixelForValue(startValue);\n        if (this.chart.getDataVisibility(index)) {\n            head = vScale.getPixelForValue(start + length);\n        } else {\n            head = base;\n        }\n        size = head - base;\n        if (Math.abs(size) < minBarLength) {\n            size = barSign(size, vScale, actualBase) * minBarLength;\n            if (value === actualBase) {\n                base -= size / 2;\n            }\n            const startPixel = vScale.getPixelForDecimal(0);\n            const endPixel = vScale.getPixelForDecimal(1);\n            const min = Math.min(startPixel, endPixel);\n            const max = Math.max(startPixel, endPixel);\n            base = Math.max(Math.min(base, max), min);\n            head = base + size;\n            if (_stacked && !floating) {\n                parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n            }\n        }\n        if (base === vScale.getPixelForValue(actualBase)) {\n            const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n            base += halfGrid;\n            size -= halfGrid;\n        }\n        return {\n            size,\n            base,\n            head,\n            center: head + size / 2\n        };\n    }\n _calculateBarIndexPixels(index, ruler) {\n        const scale = ruler.scale;\n        const options = this.options;\n        const skipNull = options.skipNull;\n        const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n        let center, size;\n        if (ruler.grouped) {\n            const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n            const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);\n            const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n            center = range.start + range.chunk * stackIndex + range.chunk / 2;\n            size = Math.min(maxBarThickness, range.chunk * range.ratio);\n        } else {\n            center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n            size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n        }\n        return {\n            base: center - size / 2,\n            head: center + size / 2,\n            center,\n            size\n        };\n    }\n    draw() {\n        const meta = this._cachedMeta;\n        const vScale = meta.vScale;\n        const rects = meta.data;\n        const ilen = rects.length;\n        let i = 0;\n        for(; i < ilen; ++i){\n            if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n                rects[i].draw(this._ctx);\n            }\n        }\n    }\n}\n\nclass BubbleController extends DatasetController {\n    static id = 'bubble';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'point',\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'borderWidth',\n                    'radius'\n                ]\n            }\n        }\n    };\n static overrides = {\n        scales: {\n            x: {\n                type: 'linear'\n            },\n            y: {\n                type: 'linear'\n            }\n        }\n    };\n    initialize() {\n        this.enableOptionSharing = true;\n        super.initialize();\n    }\n parsePrimitiveData(meta, data, start, count) {\n        const parsed = super.parsePrimitiveData(meta, data, start, count);\n        for(let i = 0; i < parsed.length; i++){\n            parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n        }\n        return parsed;\n    }\n parseArrayData(meta, data, start, count) {\n        const parsed = super.parseArrayData(meta, data, start, count);\n        for(let i = 0; i < parsed.length; i++){\n            const item = data[start + i];\n            parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n        }\n        return parsed;\n    }\n parseObjectData(meta, data, start, count) {\n        const parsed = super.parseObjectData(meta, data, start, count);\n        for(let i = 0; i < parsed.length; i++){\n            const item = data[start + i];\n            parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n        }\n        return parsed;\n    }\n getMaxOverflow() {\n        const data = this._cachedMeta.data;\n        let max = 0;\n        for(let i = data.length - 1; i >= 0; --i){\n            max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n        }\n        return max > 0 && max;\n    }\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const labels = this.chart.data.labels || [];\n        const { xScale , yScale  } = meta;\n        const parsed = this.getParsed(index);\n        const x = xScale.getLabelForValue(parsed.x);\n        const y = yScale.getLabelForValue(parsed.y);\n        const r = parsed._custom;\n        return {\n            label: labels[index] || '',\n            value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n        };\n    }\n    update(mode) {\n        const points = this._cachedMeta.data;\n        this.updateElements(points, 0, points.length, mode);\n    }\n    updateElements(points, start, count, mode) {\n        const reset = mode === 'reset';\n        const { iScale , vScale  } = this._cachedMeta;\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        for(let i = start; i < start + count; i++){\n            const point = points[i];\n            const parsed = !reset && this.getParsed(i);\n            const properties = {};\n            const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n            const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n            properties.skip = isNaN(iPixel) || isNaN(vPixel);\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n                if (reset) {\n                    properties.options.radius = 0;\n                }\n            }\n            this.updateElement(point, i, properties, mode);\n        }\n    }\n resolveDataElementOptions(index, mode) {\n        const parsed = this.getParsed(index);\n        let values = super.resolveDataElementOptions(index, mode);\n        if (values.$shared) {\n            values = Object.assign({}, values, {\n                $shared: false\n            });\n        }\n        const radius = values.radius;\n        if (mode !== 'active') {\n            values.radius = 0;\n        }\n        values.radius += valueOrDefault(parsed && parsed._custom, radius);\n        return values;\n    }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n    let ratioX = 1;\n    let ratioY = 1;\n    let offsetX = 0;\n    let offsetY = 0;\n    if (circumference < TAU) {\n        const startAngle = rotation;\n        const endAngle = startAngle + circumference;\n        const startX = Math.cos(startAngle);\n        const startY = Math.sin(startAngle);\n        const endX = Math.cos(endAngle);\n        const endY = Math.sin(endAngle);\n        const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n        const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n        const maxX = calcMax(0, startX, endX);\n        const maxY = calcMax(HALF_PI, startY, endY);\n        const minX = calcMin(PI, startX, endX);\n        const minY = calcMin(PI + HALF_PI, startY, endY);\n        ratioX = (maxX - minX) / 2;\n        ratioY = (maxY - minY) / 2;\n        offsetX = -(maxX + minX) / 2;\n        offsetY = -(maxY + minY) / 2;\n    }\n    return {\n        ratioX,\n        ratioY,\n        offsetX,\n        offsetY\n    };\n}\nclass DoughnutController extends DatasetController {\n    static id = 'doughnut';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'arc',\n        animation: {\n            animateRotate: true,\n            animateScale: false\n        },\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'circumference',\n                    'endAngle',\n                    'innerRadius',\n                    'outerRadius',\n                    'startAngle',\n                    'x',\n                    'y',\n                    'offset',\n                    'borderWidth',\n                    'spacing'\n                ]\n            }\n        },\n        cutout: '50%',\n        rotation: 0,\n        circumference: 360,\n        radius: '100%',\n        spacing: 0,\n        indexAxis: 'r'\n    };\n    static descriptors = {\n        _scriptable: (name)=>name !== 'spacing',\n        _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n    };\n static overrides = {\n        aspectRatio: 1,\n        plugins: {\n            legend: {\n                labels: {\n                    generateLabels (chart) {\n                        const data = chart.data;\n                        if (data.labels.length && data.datasets.length) {\n                            const { labels: { pointStyle , color  }  } = chart.legend.options;\n                            return data.labels.map((label, i)=>{\n                                const meta = chart.getDatasetMeta(0);\n                                const style = meta.controller.getStyle(i);\n                                return {\n                                    text: label,\n                                    fillStyle: style.backgroundColor,\n                                    strokeStyle: style.borderColor,\n                                    fontColor: color,\n                                    lineWidth: style.borderWidth,\n                                    pointStyle: pointStyle,\n                                    hidden: !chart.getDataVisibility(i),\n                                    index: i\n                                };\n                            });\n                        }\n                        return [];\n                    }\n                },\n                onClick (e, legendItem, legend) {\n                    legend.chart.toggleDataVisibility(legendItem.index);\n                    legend.chart.update();\n                }\n            }\n        }\n    };\n    constructor(chart, datasetIndex){\n        super(chart, datasetIndex);\n        this.enableOptionSharing = true;\n        this.innerRadius = undefined;\n        this.outerRadius = undefined;\n        this.offsetX = undefined;\n        this.offsetY = undefined;\n    }\n    linkScales() {}\n parse(start, count) {\n        const data = this.getDataset().data;\n        const meta = this._cachedMeta;\n        if (this._parsing === false) {\n            meta._parsed = data;\n        } else {\n            let getter = (i)=>+data[i];\n            if (isObject(data[start])) {\n                const { key ='value'  } = this._parsing;\n                getter = (i)=>+resolveObjectKey(data[i], key);\n            }\n            let i, ilen;\n            for(i = start, ilen = start + count; i < ilen; ++i){\n                meta._parsed[i] = getter(i);\n            }\n        }\n    }\n _getRotation() {\n        return toRadians(this.options.rotation - 90);\n    }\n _getCircumference() {\n        return toRadians(this.options.circumference);\n    }\n _getRotationExtents() {\n        let min = TAU;\n        let max = -TAU;\n        for(let i = 0; i < this.chart.data.datasets.length; ++i){\n            if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n                const controller = this.chart.getDatasetMeta(i).controller;\n                const rotation = controller._getRotation();\n                const circumference = controller._getCircumference();\n                min = Math.min(min, rotation);\n                max = Math.max(max, rotation + circumference);\n            }\n        }\n        return {\n            rotation: min,\n            circumference: max - min\n        };\n    }\n update(mode) {\n        const chart = this.chart;\n        const { chartArea  } = chart;\n        const meta = this._cachedMeta;\n        const arcs = meta.data;\n        const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n        const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n        const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n        const chartWeight = this._getRingWeight(this.index);\n        const { circumference , rotation  } = this._getRotationExtents();\n        const { ratioX , ratioY , offsetX , offsetY  } = getRatioAndOffset(rotation, circumference, cutout);\n        const maxWidth = (chartArea.width - spacing) / ratioX;\n        const maxHeight = (chartArea.height - spacing) / ratioY;\n        const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n        const outerRadius = toDimension(this.options.radius, maxRadius);\n        const innerRadius = Math.max(outerRadius * cutout, 0);\n        const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n        this.offsetX = offsetX * outerRadius;\n        this.offsetY = offsetY * outerRadius;\n        meta.total = this.calculateTotal();\n        this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n        this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n        this.updateElements(arcs, 0, arcs.length, mode);\n    }\n _circumference(i, reset) {\n        const opts = this.options;\n        const meta = this._cachedMeta;\n        const circumference = this._getCircumference();\n        if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n            return 0;\n        }\n        return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n    }\n    updateElements(arcs, start, count, mode) {\n        const reset = mode === 'reset';\n        const chart = this.chart;\n        const chartArea = chart.chartArea;\n        const opts = chart.options;\n        const animationOpts = opts.animation;\n        const centerX = (chartArea.left + chartArea.right) / 2;\n        const centerY = (chartArea.top + chartArea.bottom) / 2;\n        const animateScale = reset && animationOpts.animateScale;\n        const innerRadius = animateScale ? 0 : this.innerRadius;\n        const outerRadius = animateScale ? 0 : this.outerRadius;\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        let startAngle = this._getRotation();\n        let i;\n        for(i = 0; i < start; ++i){\n            startAngle += this._circumference(i, reset);\n        }\n        for(i = start; i < start + count; ++i){\n            const circumference = this._circumference(i, reset);\n            const arc = arcs[i];\n            const properties = {\n                x: centerX + this.offsetX,\n                y: centerY + this.offsetY,\n                startAngle,\n                endAngle: startAngle + circumference,\n                circumference,\n                outerRadius,\n                innerRadius\n            };\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n            }\n            startAngle += circumference;\n            this.updateElement(arc, i, properties, mode);\n        }\n    }\n    calculateTotal() {\n        const meta = this._cachedMeta;\n        const metaData = meta.data;\n        let total = 0;\n        let i;\n        for(i = 0; i < metaData.length; i++){\n            const value = meta._parsed[i];\n            if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n                total += Math.abs(value);\n            }\n        }\n        return total;\n    }\n    calculateCircumference(value) {\n        const total = this._cachedMeta.total;\n        if (total > 0 && !isNaN(value)) {\n            return TAU * (Math.abs(value) / total);\n        }\n        return 0;\n    }\n    getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const chart = this.chart;\n        const labels = chart.data.labels || [];\n        const value = formatNumber(meta._parsed[index], chart.options.locale);\n        return {\n            label: labels[index] || '',\n            value\n        };\n    }\n    getMaxBorderWidth(arcs) {\n        let max = 0;\n        const chart = this.chart;\n        let i, ilen, meta, controller, options;\n        if (!arcs) {\n            for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n                if (chart.isDatasetVisible(i)) {\n                    meta = chart.getDatasetMeta(i);\n                    arcs = meta.data;\n                    controller = meta.controller;\n                    break;\n                }\n            }\n        }\n        if (!arcs) {\n            return 0;\n        }\n        for(i = 0, ilen = arcs.length; i < ilen; ++i){\n            options = controller.resolveDataElementOptions(i);\n            if (options.borderAlign !== 'inner') {\n                max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n            }\n        }\n        return max;\n    }\n    getMaxOffset(arcs) {\n        let max = 0;\n        for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n            const options = this.resolveDataElementOptions(i);\n            max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n        }\n        return max;\n    }\n _getRingWeightOffset(datasetIndex) {\n        let ringWeightOffset = 0;\n        for(let i = 0; i < datasetIndex; ++i){\n            if (this.chart.isDatasetVisible(i)) {\n                ringWeightOffset += this._getRingWeight(i);\n            }\n        }\n        return ringWeightOffset;\n    }\n _getRingWeight(datasetIndex) {\n        return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n    }\n _getVisibleDatasetWeightTotal() {\n        return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n    }\n}\n\nclass LineController extends DatasetController {\n    static id = 'line';\n static defaults = {\n        datasetElementType: 'line',\n        dataElementType: 'point',\n        showLine: true,\n        spanGaps: false\n    };\n static overrides = {\n        scales: {\n            _index_: {\n                type: 'category'\n            },\n            _value_: {\n                type: 'linear'\n            }\n        }\n    };\n    initialize() {\n        this.enableOptionSharing = true;\n        this.supportsDecimation = true;\n        super.initialize();\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        const { dataset: line , data: points = [] , _dataset  } = meta;\n        const animationsDisabled = this.chart._animationsDisabled;\n        let { start , count  } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n        this._drawStart = start;\n        this._drawCount = count;\n        if (_scaleRangesChanged(meta)) {\n            start = 0;\n            count = points.length;\n        }\n        line._chart = this.chart;\n        line._datasetIndex = this.index;\n        line._decimated = !!_dataset._decimated;\n        line.points = points;\n        const options = this.resolveDatasetElementOptions(mode);\n        if (!this.options.showLine) {\n            options.borderWidth = 0;\n        }\n        options.segment = this.options.segment;\n        this.updateElement(line, undefined, {\n            animated: !animationsDisabled,\n            options\n        }, mode);\n        this.updateElements(points, start, count, mode);\n    }\n    updateElements(points, start, count, mode) {\n        const reset = mode === 'reset';\n        const { iScale , vScale , _stacked , _dataset  } = this._cachedMeta;\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        const { spanGaps , segment  } = this.options;\n        const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n        const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n        const end = start + count;\n        const pointsCount = points.length;\n        let prevParsed = start > 0 && this.getParsed(start - 1);\n        for(let i = 0; i < pointsCount; ++i){\n            const point = points[i];\n            const properties = directUpdate ? point : {};\n            if (i < start || i >= end) {\n                properties.skip = true;\n                continue;\n            }\n            const parsed = this.getParsed(i);\n            const nullData = isNullOrUndef(parsed[vAxis]);\n            const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n            const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n            properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n            properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n            if (segment) {\n                properties.parsed = parsed;\n                properties.raw = _dataset.data[i];\n            }\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n            }\n            if (!directUpdate) {\n                this.updateElement(point, i, properties, mode);\n            }\n            prevParsed = parsed;\n        }\n    }\n getMaxOverflow() {\n        const meta = this._cachedMeta;\n        const dataset = meta.dataset;\n        const border = dataset.options && dataset.options.borderWidth || 0;\n        const data = meta.data || [];\n        if (!data.length) {\n            return border;\n        }\n        const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n        const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n        return Math.max(border, firstPoint, lastPoint) / 2;\n    }\n    draw() {\n        const meta = this._cachedMeta;\n        meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n        super.draw();\n    }\n}\n\nclass PolarAreaController extends DatasetController {\n    static id = 'polarArea';\n static defaults = {\n        dataElementType: 'arc',\n        animation: {\n            animateRotate: true,\n            animateScale: true\n        },\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'startAngle',\n                    'endAngle',\n                    'innerRadius',\n                    'outerRadius'\n                ]\n            }\n        },\n        indexAxis: 'r',\n        startAngle: 0\n    };\n static overrides = {\n        aspectRatio: 1,\n        plugins: {\n            legend: {\n                labels: {\n                    generateLabels (chart) {\n                        const data = chart.data;\n                        if (data.labels.length && data.datasets.length) {\n                            const { labels: { pointStyle , color  }  } = chart.legend.options;\n                            return data.labels.map((label, i)=>{\n                                const meta = chart.getDatasetMeta(0);\n                                const style = meta.controller.getStyle(i);\n                                return {\n                                    text: label,\n                                    fillStyle: style.backgroundColor,\n                                    strokeStyle: style.borderColor,\n                                    fontColor: color,\n                                    lineWidth: style.borderWidth,\n                                    pointStyle: pointStyle,\n                                    hidden: !chart.getDataVisibility(i),\n                                    index: i\n                                };\n                            });\n                        }\n                        return [];\n                    }\n                },\n                onClick (e, legendItem, legend) {\n                    legend.chart.toggleDataVisibility(legendItem.index);\n                    legend.chart.update();\n                }\n            }\n        },\n        scales: {\n            r: {\n                type: 'radialLinear',\n                angleLines: {\n                    display: false\n                },\n                beginAtZero: true,\n                grid: {\n                    circular: true\n                },\n                pointLabels: {\n                    display: false\n                },\n                startAngle: 0\n            }\n        }\n    };\n    constructor(chart, datasetIndex){\n        super(chart, datasetIndex);\n        this.innerRadius = undefined;\n        this.outerRadius = undefined;\n    }\n    getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const chart = this.chart;\n        const labels = chart.data.labels || [];\n        const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n        return {\n            label: labels[index] || '',\n            value\n        };\n    }\n    parseObjectData(meta, data, start, count) {\n        return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n    }\n    update(mode) {\n        const arcs = this._cachedMeta.data;\n        this._updateRadius();\n        this.updateElements(arcs, 0, arcs.length, mode);\n    }\n getMinMax() {\n        const meta = this._cachedMeta;\n        const range = {\n            min: Number.POSITIVE_INFINITY,\n            max: Number.NEGATIVE_INFINITY\n        };\n        meta.data.forEach((element, index)=>{\n            const parsed = this.getParsed(index).r;\n            if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n                if (parsed < range.min) {\n                    range.min = parsed;\n                }\n                if (parsed > range.max) {\n                    range.max = parsed;\n                }\n            }\n        });\n        return range;\n    }\n _updateRadius() {\n        const chart = this.chart;\n        const chartArea = chart.chartArea;\n        const opts = chart.options;\n        const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n        const outerRadius = Math.max(minSize / 2, 0);\n        const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n        const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n        this.outerRadius = outerRadius - radiusLength * this.index;\n        this.innerRadius = this.outerRadius - radiusLength;\n    }\n    updateElements(arcs, start, count, mode) {\n        const reset = mode === 'reset';\n        const chart = this.chart;\n        const opts = chart.options;\n        const animationOpts = opts.animation;\n        const scale = this._cachedMeta.rScale;\n        const centerX = scale.xCenter;\n        const centerY = scale.yCenter;\n        const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n        let angle = datasetStartAngle;\n        let i;\n        const defaultAngle = 360 / this.countVisibleElements();\n        for(i = 0; i < start; ++i){\n            angle += this._computeAngle(i, mode, defaultAngle);\n        }\n        for(i = start; i < start + count; i++){\n            const arc = arcs[i];\n            let startAngle = angle;\n            let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n            let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n            angle = endAngle;\n            if (reset) {\n                if (animationOpts.animateScale) {\n                    outerRadius = 0;\n                }\n                if (animationOpts.animateRotate) {\n                    startAngle = endAngle = datasetStartAngle;\n                }\n            }\n            const properties = {\n                x: centerX,\n                y: centerY,\n                innerRadius: 0,\n                outerRadius,\n                startAngle,\n                endAngle,\n                options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n            };\n            this.updateElement(arc, i, properties, mode);\n        }\n    }\n    countVisibleElements() {\n        const meta = this._cachedMeta;\n        let count = 0;\n        meta.data.forEach((element, index)=>{\n            if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n                count++;\n            }\n        });\n        return count;\n    }\n _computeAngle(index, mode, defaultAngle) {\n        return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n    }\n}\n\nclass PieController extends DoughnutController {\n    static id = 'pie';\n static defaults = {\n        cutout: 0,\n        rotation: 0,\n        circumference: 360,\n        radius: '100%'\n    };\n}\n\nclass RadarController extends DatasetController {\n    static id = 'radar';\n static defaults = {\n        datasetElementType: 'line',\n        dataElementType: 'point',\n        indexAxis: 'r',\n        showLine: true,\n        elements: {\n            line: {\n                fill: 'start'\n            }\n        }\n    };\n static overrides = {\n        aspectRatio: 1,\n        scales: {\n            r: {\n                type: 'radialLinear'\n            }\n        }\n    };\n getLabelAndValue(index) {\n        const vScale = this._cachedMeta.vScale;\n        const parsed = this.getParsed(index);\n        return {\n            label: vScale.getLabels()[index],\n            value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n        };\n    }\n    parseObjectData(meta, data, start, count) {\n        return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        const line = meta.dataset;\n        const points = meta.data || [];\n        const labels = meta.iScale.getLabels();\n        line.points = points;\n        if (mode !== 'resize') {\n            const options = this.resolveDatasetElementOptions(mode);\n            if (!this.options.showLine) {\n                options.borderWidth = 0;\n            }\n            const properties = {\n                _loop: true,\n                _fullLoop: labels.length === points.length,\n                options\n            };\n            this.updateElement(line, undefined, properties, mode);\n        }\n        this.updateElements(points, 0, points.length, mode);\n    }\n    updateElements(points, start, count, mode) {\n        const scale = this._cachedMeta.rScale;\n        const reset = mode === 'reset';\n        for(let i = start; i < start + count; i++){\n            const point = points[i];\n            const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n            const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n            const x = reset ? scale.xCenter : pointPosition.x;\n            const y = reset ? scale.yCenter : pointPosition.y;\n            const properties = {\n                x,\n                y,\n                angle: pointPosition.angle,\n                skip: isNaN(x) || isNaN(y),\n                options\n            };\n            this.updateElement(point, i, properties, mode);\n        }\n    }\n}\n\nclass ScatterController extends DatasetController {\n    static id = 'scatter';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'point',\n        showLine: false,\n        fill: false\n    };\n static overrides = {\n        interaction: {\n            mode: 'point'\n        },\n        scales: {\n            x: {\n                type: 'linear'\n            },\n            y: {\n                type: 'linear'\n            }\n        }\n    };\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const labels = this.chart.data.labels || [];\n        const { xScale , yScale  } = meta;\n        const parsed = this.getParsed(index);\n        const x = xScale.getLabelForValue(parsed.x);\n        const y = yScale.getLabelForValue(parsed.y);\n        return {\n            label: labels[index] || '',\n            value: '(' + x + ', ' + y + ')'\n        };\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        const { data: points = []  } = meta;\n        const animationsDisabled = this.chart._animationsDisabled;\n        let { start , count  } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n        this._drawStart = start;\n        this._drawCount = count;\n        if (_scaleRangesChanged(meta)) {\n            start = 0;\n            count = points.length;\n        }\n        if (this.options.showLine) {\n            if (!this.datasetElementType) {\n                this.addElements();\n            }\n            const { dataset: line , _dataset  } = meta;\n            line._chart = this.chart;\n            line._datasetIndex = this.index;\n            line._decimated = !!_dataset._decimated;\n            line.points = points;\n            const options = this.resolveDatasetElementOptions(mode);\n            options.segment = this.options.segment;\n            this.updateElement(line, undefined, {\n                animated: !animationsDisabled,\n                options\n            }, mode);\n        } else if (this.datasetElementType) {\n            delete meta.dataset;\n            this.datasetElementType = false;\n        }\n        this.updateElements(points, start, count, mode);\n    }\n    addElements() {\n        const { showLine  } = this.options;\n        if (!this.datasetElementType && showLine) {\n            this.datasetElementType = this.chart.registry.getElement('line');\n        }\n        super.addElements();\n    }\n    updateElements(points, start, count, mode) {\n        const reset = mode === 'reset';\n        const { iScale , vScale , _stacked , _dataset  } = this._cachedMeta;\n        const firstOpts = this.resolveDataElementOptions(start, mode);\n        const sharedOptions = this.getSharedOptions(firstOpts);\n        const includeOptions = this.includeOptions(mode, sharedOptions);\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        const { spanGaps , segment  } = this.options;\n        const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n        const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n        let prevParsed = start > 0 && this.getParsed(start - 1);\n        for(let i = start; i < start + count; ++i){\n            const point = points[i];\n            const parsed = this.getParsed(i);\n            const properties = directUpdate ? point : {};\n            const nullData = isNullOrUndef(parsed[vAxis]);\n            const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n            const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n            properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n            properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n            if (segment) {\n                properties.parsed = parsed;\n                properties.raw = _dataset.data[i];\n            }\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n            }\n            if (!directUpdate) {\n                this.updateElement(point, i, properties, mode);\n            }\n            prevParsed = parsed;\n        }\n        this.updateSharedOptions(sharedOptions, mode, firstOpts);\n    }\n getMaxOverflow() {\n        const meta = this._cachedMeta;\n        const data = meta.data || [];\n        if (!this.options.showLine) {\n            let max = 0;\n            for(let i = data.length - 1; i >= 0; --i){\n                max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n            }\n            return max > 0 && max;\n        }\n        const dataset = meta.dataset;\n        const border = dataset.options && dataset.options.borderWidth || 0;\n        if (!data.length) {\n            return border;\n        }\n        const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n        const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n        return Math.max(border, firstPoint, lastPoint) / 2;\n    }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n    throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n    /**\n   * Override default date adapter methods.\n   * Accepts type parameter to define options type.\n   * @example\n   * Chart._adapters._date.override<{myAdapterOption: string}>({\n   *   init() {\n   *     console.log(this.options.myAdapterOption);\n   *   }\n   * })\n   */ static override(members) {\n        Object.assign(DateAdapterBase.prototype, members);\n    }\n    options;\n    constructor(options){\n        this.options = options || {};\n    }\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    init() {}\n    formats() {\n        return abstract();\n    }\n    parse() {\n        return abstract();\n    }\n    format() {\n        return abstract();\n    }\n    add() {\n        return abstract();\n    }\n    diff() {\n        return abstract();\n    }\n    startOf() {\n        return abstract();\n    }\n    endOf() {\n        return abstract();\n    }\n}\nvar adapters = {\n    _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n    const { controller , data , _sorted  } = metaset;\n    const iScale = controller._cachedMeta.iScale;\n    if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n        const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n        if (!intersect) {\n            return lookupMethod(data, axis, value);\n        } else if (controller._sharedOptions) {\n            const el = data[0];\n            const range = typeof el.getRange === 'function' && el.getRange(axis);\n            if (range) {\n                const start = lookupMethod(data, axis, value - range);\n                const end = lookupMethod(data, axis, value + range);\n                return {\n                    lo: start.lo,\n                    hi: end.hi\n                };\n            }\n        }\n    }\n    return {\n        lo: 0,\n        hi: data.length - 1\n    };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    const value = position[axis];\n    for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n        const { index , data  } = metasets[i];\n        const { lo , hi  } = binarySearch(metasets[i], axis, value, intersect);\n        for(let j = lo; j <= hi; ++j){\n            const element = data[j];\n            if (!element.skip) {\n                handler(element, index, j);\n            }\n        }\n    }\n}\n function getDistanceMetricForAxis(axis) {\n    const useX = axis.indexOf('x') !== -1;\n    const useY = axis.indexOf('y') !== -1;\n    return function(pt1, pt2) {\n        const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n        const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n        return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n    };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n    const items = [];\n    if (!includeInvisible && !chart.isPointInArea(position)) {\n        return items;\n    }\n    const evaluationFunc = function(element, datasetIndex, index) {\n        if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n            return;\n        }\n        if (element.inRange(position.x, position.y, useFinalPosition)) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n        }\n    };\n    evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n    return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n    let items = [];\n    function evaluationFunc(element, datasetIndex, index) {\n        const { startAngle , endAngle  } = element.getProps([\n            'startAngle',\n            'endAngle'\n        ], useFinalPosition);\n        const { angle  } = getAngleFromPoint(element, {\n            x: position.x,\n            y: position.y\n        });\n        if (_angleBetween(angle, startAngle, endAngle)) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n        }\n    }\n    evaluateInteractionItems(chart, axis, position, evaluationFunc);\n    return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n    let items = [];\n    const distanceMetric = getDistanceMetricForAxis(axis);\n    let minDistance = Number.POSITIVE_INFINITY;\n    function evaluationFunc(element, datasetIndex, index) {\n        const inRange = element.inRange(position.x, position.y, useFinalPosition);\n        if (intersect && !inRange) {\n            return;\n        }\n        const center = element.getCenterPoint(useFinalPosition);\n        const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n        if (!pointInArea && !inRange) {\n            return;\n        }\n        const distance = distanceMetric(position, center);\n        if (distance < minDistance) {\n            items = [\n                {\n                    element,\n                    datasetIndex,\n                    index\n                }\n            ];\n            minDistance = distance;\n        } else if (distance === minDistance) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n        }\n    }\n    evaluateInteractionItems(chart, axis, position, evaluationFunc);\n    return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n    if (!includeInvisible && !chart.isPointInArea(position)) {\n        return [];\n    }\n    return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n    const items = [];\n    const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n    let intersectsItem = false;\n    evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n        if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n            intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n        }\n    });\n    if (intersect && !intersectsItem) {\n        return [];\n    }\n    return items;\n}\n var Interaction = {\n    evaluateInteractionItems,\n    modes: {\n index (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'x';\n            const includeInvisible = options.includeInvisible || false;\n            const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n            const elements = [];\n            if (!items.length) {\n                return [];\n            }\n            chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n                const index = items[0].index;\n                const element = meta.data[index];\n                if (element && !element.skip) {\n                    elements.push({\n                        element,\n                        datasetIndex: meta.index,\n                        index\n                    });\n                }\n            });\n            return elements;\n        },\n dataset (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'xy';\n            const includeInvisible = options.includeInvisible || false;\n            let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n            if (items.length > 0) {\n                const datasetIndex = items[0].datasetIndex;\n                const data = chart.getDatasetMeta(datasetIndex).data;\n                items = [];\n                for(let i = 0; i < data.length; ++i){\n                    items.push({\n                        element: data[i],\n                        datasetIndex,\n                        index: i\n                    });\n                }\n            }\n            return items;\n        },\n point (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'xy';\n            const includeInvisible = options.includeInvisible || false;\n            return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n        },\n nearest (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'xy';\n            const includeInvisible = options.includeInvisible || false;\n            return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n        },\n x (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n        },\n y (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n        }\n    }\n};\n\nconst STATIC_POSITIONS = [\n    'left',\n    'top',\n    'right',\n    'bottom'\n];\nfunction filterByPosition(array, position) {\n    return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n    return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n    return array.sort((a, b)=>{\n        const v0 = reverse ? b : a;\n        const v1 = reverse ? a : b;\n        return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n    });\n}\nfunction wrapBoxes(boxes) {\n    const layoutBoxes = [];\n    let i, ilen, box, pos, stack, stackWeight;\n    for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n        box = boxes[i];\n        ({ position: pos , options: { stack , stackWeight =1  }  } = box);\n        layoutBoxes.push({\n            index: i,\n            box,\n            pos,\n            horizontal: box.isHorizontal(),\n            weight: box.weight,\n            stack: stack && pos + stack,\n            stackWeight\n        });\n    }\n    return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n    const stacks = {};\n    for (const wrap of layouts){\n        const { stack , pos , stackWeight  } = wrap;\n        if (!stack || !STATIC_POSITIONS.includes(pos)) {\n            continue;\n        }\n        const _stack = stacks[stack] || (stacks[stack] = {\n            count: 0,\n            placed: 0,\n            weight: 0,\n            size: 0\n        });\n        _stack.count++;\n        _stack.weight += stackWeight;\n    }\n    return stacks;\n}\n function setLayoutDims(layouts, params) {\n    const stacks = buildStacks(layouts);\n    const { vBoxMaxWidth , hBoxMaxHeight  } = params;\n    let i, ilen, layout;\n    for(i = 0, ilen = layouts.length; i < ilen; ++i){\n        layout = layouts[i];\n        const { fullSize  } = layout.box;\n        const stack = stacks[layout.stack];\n        const factor = stack && layout.stackWeight / stack.weight;\n        if (layout.horizontal) {\n            layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n            layout.height = hBoxMaxHeight;\n        } else {\n            layout.width = vBoxMaxWidth;\n            layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n        }\n    }\n    return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n    const layoutBoxes = wrapBoxes(boxes);\n    const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n    const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n    const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n    const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n    const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n    const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n    const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n    return {\n        fullSize,\n        leftAndTop: left.concat(top),\n        rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n        chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n        vertical: left.concat(right).concat(centerVertical),\n        horizontal: top.concat(bottom).concat(centerHorizontal)\n    };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n    return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n    maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n    maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n    maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n    maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n    const { pos , box  } = layout;\n    const maxPadding = chartArea.maxPadding;\n    if (!isObject(pos)) {\n        if (layout.size) {\n            chartArea[pos] -= layout.size;\n        }\n        const stack = stacks[layout.stack] || {\n            size: 0,\n            count: 1\n        };\n        stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n        layout.size = stack.size / stack.count;\n        chartArea[pos] += layout.size;\n    }\n    if (box.getPadding) {\n        updateMaxPadding(maxPadding, box.getPadding());\n    }\n    const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n    const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n    const widthChanged = newWidth !== chartArea.w;\n    const heightChanged = newHeight !== chartArea.h;\n    chartArea.w = newWidth;\n    chartArea.h = newHeight;\n    return layout.horizontal ? {\n        same: widthChanged,\n        other: heightChanged\n    } : {\n        same: heightChanged,\n        other: widthChanged\n    };\n}\nfunction handleMaxPadding(chartArea) {\n    const maxPadding = chartArea.maxPadding;\n    function updatePos(pos) {\n        const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n        chartArea[pos] += change;\n        return change;\n    }\n    chartArea.y += updatePos('top');\n    chartArea.x += updatePos('left');\n    updatePos('right');\n    updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n    const maxPadding = chartArea.maxPadding;\n    function marginForPositions(positions) {\n        const margin = {\n            left: 0,\n            top: 0,\n            right: 0,\n            bottom: 0\n        };\n        positions.forEach((pos)=>{\n            margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n        });\n        return margin;\n    }\n    return horizontal ? marginForPositions([\n        'left',\n        'right'\n    ]) : marginForPositions([\n        'top',\n        'bottom'\n    ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n    const refitBoxes = [];\n    let i, ilen, layout, box, refit, changed;\n    for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n        layout = boxes[i];\n        box = layout.box;\n        box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n        const { same , other  } = updateDims(chartArea, params, layout, stacks);\n        refit |= same && refitBoxes.length;\n        changed = changed || other;\n        if (!box.fullSize) {\n            refitBoxes.push(layout);\n        }\n    }\n    return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n    box.top = top;\n    box.left = left;\n    box.right = left + width;\n    box.bottom = top + height;\n    box.width = width;\n    box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n    const userPadding = params.padding;\n    let { x , y  } = chartArea;\n    for (const layout of boxes){\n        const box = layout.box;\n        const stack = stacks[layout.stack] || {\n            count: 1,\n            placed: 0,\n            weight: 1\n        };\n        const weight = layout.stackWeight / stack.weight || 1;\n        if (layout.horizontal) {\n            const width = chartArea.w * weight;\n            const height = stack.size || box.height;\n            if (defined(stack.start)) {\n                y = stack.start;\n            }\n            if (box.fullSize) {\n                setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n            } else {\n                setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n            }\n            stack.start = y;\n            stack.placed += width;\n            y = box.bottom;\n        } else {\n            const height = chartArea.h * weight;\n            const width = stack.size || box.width;\n            if (defined(stack.start)) {\n                x = stack.start;\n            }\n            if (box.fullSize) {\n                setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n            } else {\n                setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n            }\n            stack.start = x;\n            stack.placed += height;\n            x = box.right;\n        }\n    }\n    chartArea.x = x;\n    chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n        if (!chart.boxes) {\n            chart.boxes = [];\n        }\n        item.fullSize = item.fullSize || false;\n        item.position = item.position || 'top';\n        item.weight = item.weight || 0;\n        item._layers = item._layers || function() {\n            return [\n                {\n                    z: 0,\n                    draw (chartArea) {\n                        item.draw(chartArea);\n                    }\n                }\n            ];\n        };\n        chart.boxes.push(item);\n    },\n removeBox (chart, layoutItem) {\n        const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n        if (index !== -1) {\n            chart.boxes.splice(index, 1);\n        }\n    },\n configure (chart, item, options) {\n        item.fullSize = options.fullSize;\n        item.position = options.position;\n        item.weight = options.weight;\n    },\n update (chart, width, height, minPadding) {\n        if (!chart) {\n            return;\n        }\n        const padding = toPadding(chart.options.layout.padding);\n        const availableWidth = Math.max(width - padding.width, 0);\n        const availableHeight = Math.max(height - padding.height, 0);\n        const boxes = buildLayoutBoxes(chart.boxes);\n        const verticalBoxes = boxes.vertical;\n        const horizontalBoxes = boxes.horizontal;\n        each(chart.boxes, (box)=>{\n            if (typeof box.beforeLayout === 'function') {\n                box.beforeLayout();\n            }\n        });\n        const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n        const params = Object.freeze({\n            outerWidth: width,\n            outerHeight: height,\n            padding,\n            availableWidth,\n            availableHeight,\n            vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n            hBoxMaxHeight: availableHeight / 2\n        });\n        const maxPadding = Object.assign({}, padding);\n        updateMaxPadding(maxPadding, toPadding(minPadding));\n        const chartArea = Object.assign({\n            maxPadding,\n            w: availableWidth,\n            h: availableHeight,\n            x: padding.left,\n            y: padding.top\n        }, padding);\n        const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n        fitBoxes(boxes.fullSize, chartArea, params, stacks);\n        fitBoxes(verticalBoxes, chartArea, params, stacks);\n        if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n            fitBoxes(verticalBoxes, chartArea, params, stacks);\n        }\n        handleMaxPadding(chartArea);\n        placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n        chartArea.x += chartArea.w;\n        chartArea.y += chartArea.h;\n        placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n        chart.chartArea = {\n            left: chartArea.left,\n            top: chartArea.top,\n            right: chartArea.left + chartArea.w,\n            bottom: chartArea.top + chartArea.h,\n            height: chartArea.h,\n            width: chartArea.w\n        };\n        each(boxes.chartArea, (layout)=>{\n            const box = layout.box;\n            Object.assign(box, chart.chartArea);\n            box.update(chartArea.w, chartArea.h, {\n                left: 0,\n                top: 0,\n                right: 0,\n                bottom: 0\n            });\n        });\n    }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n        return false;\n    }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n        return 1;\n    }\n getMaximumSize(element, width, height, aspectRatio) {\n        width = Math.max(0, width || element.width);\n        height = height || element.height;\n        return {\n            width,\n            height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n        };\n    }\n isAttached(canvas) {\n        return true;\n    }\n updateConfig(config) {\n    }\n}\n\nclass BasicPlatform extends BasePlatform {\n    acquireContext(item) {\n        return item && item.getContext && item.getContext('2d') || null;\n    }\n    updateConfig(config) {\n        config.options.animation = false;\n    }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n    touchstart: 'mousedown',\n    touchmove: 'mousemove',\n    touchend: 'mouseup',\n    pointerenter: 'mouseenter',\n    pointerdown: 'mousedown',\n    pointermove: 'mousemove',\n    pointerup: 'mouseup',\n    pointerleave: 'mouseout',\n    pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n    const style = canvas.style;\n    const renderHeight = canvas.getAttribute('height');\n    const renderWidth = canvas.getAttribute('width');\n    canvas[EXPANDO_KEY] = {\n        initial: {\n            height: renderHeight,\n            width: renderWidth,\n            style: {\n                display: style.display,\n                height: style.height,\n                width: style.width\n            }\n        }\n    };\n    style.display = style.display || 'block';\n    style.boxSizing = style.boxSizing || 'border-box';\n    if (isNullOrEmpty(renderWidth)) {\n        const displayWidth = readUsedSize(canvas, 'width');\n        if (displayWidth !== undefined) {\n            canvas.width = displayWidth;\n        }\n    }\n    if (isNullOrEmpty(renderHeight)) {\n        if (canvas.style.height === '') {\n            canvas.height = canvas.width / (aspectRatio || 2);\n        } else {\n            const displayHeight = readUsedSize(canvas, 'height');\n            if (displayHeight !== undefined) {\n                canvas.height = displayHeight;\n            }\n        }\n    }\n    return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n    passive: true\n} : false;\nfunction addListener(node, type, listener) {\n    if (node) {\n        node.addEventListener(type, listener, eventListenerOptions);\n    }\n}\nfunction removeListener(chart, type, listener) {\n    if (chart && chart.canvas) {\n        chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n    }\n}\nfunction fromNativeEvent(event, chart) {\n    const type = EVENT_TYPES[event.type] || event.type;\n    const { x , y  } = getRelativePosition(event, chart);\n    return {\n        type,\n        chart,\n        native: event,\n        x: x !== undefined ? x : null,\n        y: y !== undefined ? y : null\n    };\n}\nfunction nodeListContains(nodeList, canvas) {\n    for (const node of nodeList){\n        if (node === canvas || node.contains(canvas)) {\n            return true;\n        }\n    }\n}\nfunction createAttachObserver(chart, type, listener) {\n    const canvas = chart.canvas;\n    const observer = new MutationObserver((entries)=>{\n        let trigger = false;\n        for (const entry of entries){\n            trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n            trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n        }\n        if (trigger) {\n            listener();\n        }\n    });\n    observer.observe(document, {\n        childList: true,\n        subtree: true\n    });\n    return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n    const canvas = chart.canvas;\n    const observer = new MutationObserver((entries)=>{\n        let trigger = false;\n        for (const entry of entries){\n            trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n            trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n        }\n        if (trigger) {\n            listener();\n        }\n    });\n    observer.observe(document, {\n        childList: true,\n        subtree: true\n    });\n    return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n    const dpr = window.devicePixelRatio;\n    if (dpr === oldDevicePixelRatio) {\n        return;\n    }\n    oldDevicePixelRatio = dpr;\n    drpListeningCharts.forEach((resize, chart)=>{\n        if (chart.currentDevicePixelRatio !== dpr) {\n            resize();\n        }\n    });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n    if (!drpListeningCharts.size) {\n        window.addEventListener('resize', onWindowResize);\n    }\n    drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n    drpListeningCharts.delete(chart);\n    if (!drpListeningCharts.size) {\n        window.removeEventListener('resize', onWindowResize);\n    }\n}\nfunction createResizeObserver(chart, type, listener) {\n    const canvas = chart.canvas;\n    const container = canvas && _getParentNode(canvas);\n    if (!container) {\n        return;\n    }\n    const resize = throttled((width, height)=>{\n        const w = container.clientWidth;\n        listener(width, height);\n        if (w < container.clientWidth) {\n            listener();\n        }\n    }, window);\n    const observer = new ResizeObserver((entries)=>{\n        const entry = entries[0];\n        const width = entry.contentRect.width;\n        const height = entry.contentRect.height;\n        if (width === 0 && height === 0) {\n            return;\n        }\n        resize(width, height);\n    });\n    observer.observe(container);\n    listenDevicePixelRatioChanges(chart, resize);\n    return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n    if (observer) {\n        observer.disconnect();\n    }\n    if (type === 'resize') {\n        unlistenDevicePixelRatioChanges(chart);\n    }\n}\nfunction createProxyAndListen(chart, type, listener) {\n    const canvas = chart.canvas;\n    const proxy = throttled((event)=>{\n        if (chart.ctx !== null) {\n            listener(fromNativeEvent(event, chart));\n        }\n    }, chart);\n    addListener(canvas, type, proxy);\n    return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n        const context = canvas && canvas.getContext && canvas.getContext('2d');\n        if (context && context.canvas === canvas) {\n            initCanvas(canvas, aspectRatio);\n            return context;\n        }\n        return null;\n    }\n releaseContext(context) {\n        const canvas = context.canvas;\n        if (!canvas[EXPANDO_KEY]) {\n            return false;\n        }\n        const initial = canvas[EXPANDO_KEY].initial;\n        [\n            'height',\n            'width'\n        ].forEach((prop)=>{\n            const value = initial[prop];\n            if (isNullOrUndef(value)) {\n                canvas.removeAttribute(prop);\n            } else {\n                canvas.setAttribute(prop, value);\n            }\n        });\n        const style = initial.style || {};\n        Object.keys(style).forEach((key)=>{\n            canvas.style[key] = style[key];\n        });\n        canvas.width = canvas.width;\n        delete canvas[EXPANDO_KEY];\n        return true;\n    }\n addEventListener(chart, type, listener) {\n        this.removeEventListener(chart, type);\n        const proxies = chart.$proxies || (chart.$proxies = {});\n        const handlers = {\n            attach: createAttachObserver,\n            detach: createDetachObserver,\n            resize: createResizeObserver\n        };\n        const handler = handlers[type] || createProxyAndListen;\n        proxies[type] = handler(chart, type, listener);\n    }\n removeEventListener(chart, type) {\n        const proxies = chart.$proxies || (chart.$proxies = {});\n        const proxy = proxies[type];\n        if (!proxy) {\n            return;\n        }\n        const handlers = {\n            attach: releaseObserver,\n            detach: releaseObserver,\n            resize: releaseObserver\n        };\n        const handler = handlers[type] || removeListener;\n        handler(chart, type, proxy);\n        proxies[type] = undefined;\n    }\n    getDevicePixelRatio() {\n        return window.devicePixelRatio;\n    }\n getMaximumSize(canvas, width, height, aspectRatio) {\n        return getMaximumSize(canvas, width, height, aspectRatio);\n    }\n isAttached(canvas) {\n        const container = canvas && _getParentNode(canvas);\n        return !!(container && container.isConnected);\n    }\n}\n\nfunction _detectPlatform(canvas) {\n    if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n        return BasicPlatform;\n    }\n    return DomPlatform;\n}\n\nclass Element {\n    static defaults = {};\n    static defaultRoutes = undefined;\n    x;\n    y;\n    active = false;\n    options;\n    $animations;\n    tooltipPosition(useFinalPosition) {\n        const { x , y  } = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        return {\n            x,\n            y\n        };\n    }\n    hasValue() {\n        return isNumber(this.x) && isNumber(this.y);\n    }\n    getProps(props, final) {\n        const anims = this.$animations;\n        if (!final || !anims) {\n            // let's not create an object, if not needed\n            return this;\n        }\n        const ret = {};\n        props.forEach((prop)=>{\n            ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n        });\n        return ret;\n    }\n}\n\nfunction autoSkip(scale, ticks) {\n    const tickOpts = scale.options.ticks;\n    const determinedMaxTicks = determineMaxTicks(scale);\n    const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n    const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n    const numMajorIndices = majorIndices.length;\n    const first = majorIndices[0];\n    const last = majorIndices[numMajorIndices - 1];\n    const newTicks = [];\n    if (numMajorIndices > ticksLimit) {\n        skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n        return newTicks;\n    }\n    const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n    if (numMajorIndices > 0) {\n        let i, ilen;\n        const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n        skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n        for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n            skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n        }\n        skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n        return newTicks;\n    }\n    skip(ticks, newTicks, spacing);\n    return newTicks;\n}\nfunction determineMaxTicks(scale) {\n    const offset = scale.options.offset;\n    const tickLength = scale._tickSize();\n    const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n    const maxChart = scale._maxLength / tickLength;\n    return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n    const evenMajorSpacing = getEvenSpacing(majorIndices);\n    const spacing = ticks.length / ticksLimit;\n    if (!evenMajorSpacing) {\n        return Math.max(spacing, 1);\n    }\n    const factors = _factorize(evenMajorSpacing);\n    for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n        const factor = factors[i];\n        if (factor > spacing) {\n            return factor;\n        }\n    }\n    return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n    const result = [];\n    let i, ilen;\n    for(i = 0, ilen = ticks.length; i < ilen; i++){\n        if (ticks[i].major) {\n            result.push(i);\n        }\n    }\n    return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n    let count = 0;\n    let next = majorIndices[0];\n    let i;\n    spacing = Math.ceil(spacing);\n    for(i = 0; i < ticks.length; i++){\n        if (i === next) {\n            newTicks.push(ticks[i]);\n            count++;\n            next = majorIndices[count * spacing];\n        }\n    }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n    const start = valueOrDefault(majorStart, 0);\n    const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n    let count = 0;\n    let length, i, next;\n    spacing = Math.ceil(spacing);\n    if (majorEnd) {\n        length = majorEnd - majorStart;\n        spacing = length / Math.floor(length / spacing);\n    }\n    next = start;\n    while(next < 0){\n        count++;\n        next = Math.round(start + count * spacing);\n    }\n    for(i = Math.max(start, 0); i < end; i++){\n        if (i === next) {\n            newTicks.push(ticks[i]);\n            count++;\n            next = Math.round(start + count * spacing);\n        }\n    }\n}\n function getEvenSpacing(arr) {\n    const len = arr.length;\n    let i, diff;\n    if (len < 2) {\n        return false;\n    }\n    for(diff = arr[0], i = 1; i < len; ++i){\n        if (arr[i] - arr[i - 1] !== diff) {\n            return false;\n        }\n    }\n    return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n    const result = [];\n    const increment = arr.length / numItems;\n    const len = arr.length;\n    let i = 0;\n    for(; i < len; i += increment){\n        result.push(arr[Math.floor(i)]);\n    }\n    return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n    const length = scale.ticks.length;\n    const validIndex = Math.min(index, length - 1);\n    const start = scale._startPixel;\n    const end = scale._endPixel;\n    const epsilon = 1e-6;\n    let lineValue = scale.getPixelForTick(validIndex);\n    let offset;\n    if (offsetGridLines) {\n        if (length === 1) {\n            offset = Math.max(lineValue - start, end - lineValue);\n        } else if (index === 0) {\n            offset = (scale.getPixelForTick(1) - lineValue) / 2;\n        } else {\n            offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n        }\n        lineValue += validIndex < index ? offset : -offset;\n        if (lineValue < start - epsilon || lineValue > end + epsilon) {\n            return;\n        }\n    }\n    return lineValue;\n}\n function garbageCollect(caches, length) {\n    each(caches, (cache)=>{\n        const gc = cache.gc;\n        const gcLen = gc.length / 2;\n        let i;\n        if (gcLen > length) {\n            for(i = 0; i < gcLen; ++i){\n                delete cache.data[gc[i]];\n            }\n            gc.splice(0, gcLen);\n        }\n    });\n}\n function getTickMarkLength(options) {\n    return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n    if (!options.display) {\n        return 0;\n    }\n    const font = toFont(options.font, fallback);\n    const padding = toPadding(options.padding);\n    const lines = isArray(options.text) ? options.text.length : 1;\n    return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n    return createContext(parent, {\n        scale,\n        type: 'scale'\n    });\n}\nfunction createTickContext(parent, index, tick) {\n    return createContext(parent, {\n        tick,\n        index,\n        type: 'tick'\n    });\n}\nfunction titleAlign(align, position, reverse) {\n     let ret = _toLeftRightCenter(align);\n    if (reverse && position !== 'right' || !reverse && position === 'right') {\n        ret = reverseAlign(ret);\n    }\n    return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n    const { top , left , bottom , right , chart  } = scale;\n    const { chartArea , scales  } = chart;\n    let rotation = 0;\n    let maxWidth, titleX, titleY;\n    const height = bottom - top;\n    const width = right - left;\n    if (scale.isHorizontal()) {\n        titleX = _alignStartEnd(align, left, right);\n        if (isObject(position)) {\n            const positionAxisID = Object.keys(position)[0];\n            const value = position[positionAxisID];\n            titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n        } else if (position === 'center') {\n            titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n        } else {\n            titleY = offsetFromEdge(scale, position, offset);\n        }\n        maxWidth = right - left;\n    } else {\n        if (isObject(position)) {\n            const positionAxisID = Object.keys(position)[0];\n            const value = position[positionAxisID];\n            titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n        } else if (position === 'center') {\n            titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n        } else {\n            titleX = offsetFromEdge(scale, position, offset);\n        }\n        titleY = _alignStartEnd(align, bottom, top);\n        rotation = position === 'left' ? -HALF_PI : HALF_PI;\n    }\n    return {\n        titleX,\n        titleY,\n        maxWidth,\n        rotation\n    };\n}\nclass Scale extends Element {\n    constructor(cfg){\n        super();\n         this.id = cfg.id;\n         this.type = cfg.type;\n         this.options = undefined;\n         this.ctx = cfg.ctx;\n         this.chart = cfg.chart;\n         this.top = undefined;\n         this.bottom = undefined;\n         this.left = undefined;\n         this.right = undefined;\n         this.width = undefined;\n         this.height = undefined;\n        this._margins = {\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0\n        };\n         this.maxWidth = undefined;\n         this.maxHeight = undefined;\n         this.paddingTop = undefined;\n         this.paddingBottom = undefined;\n         this.paddingLeft = undefined;\n         this.paddingRight = undefined;\n         this.axis = undefined;\n         this.labelRotation = undefined;\n        this.min = undefined;\n        this.max = undefined;\n        this._range = undefined;\n         this.ticks = [];\n         this._gridLineItems = null;\n         this._labelItems = null;\n         this._labelSizes = null;\n        this._length = 0;\n        this._maxLength = 0;\n        this._longestTextCache = {};\n         this._startPixel = undefined;\n         this._endPixel = undefined;\n        this._reversePixels = false;\n        this._userMax = undefined;\n        this._userMin = undefined;\n        this._suggestedMax = undefined;\n        this._suggestedMin = undefined;\n        this._ticksLength = 0;\n        this._borderValue = 0;\n        this._cache = {};\n        this._dataLimitsCached = false;\n        this.$context = undefined;\n    }\n init(options) {\n        this.options = options.setContext(this.getContext());\n        this.axis = options.axis;\n        this._userMin = this.parse(options.min);\n        this._userMax = this.parse(options.max);\n        this._suggestedMin = this.parse(options.suggestedMin);\n        this._suggestedMax = this.parse(options.suggestedMax);\n    }\n parse(raw, index) {\n        return raw;\n    }\n getUserBounds() {\n        let { _userMin , _userMax , _suggestedMin , _suggestedMax  } = this;\n        _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n        _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n        _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n        _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n        return {\n            min: finiteOrDefault(_userMin, _suggestedMin),\n            max: finiteOrDefault(_userMax, _suggestedMax),\n            minDefined: isNumberFinite(_userMin),\n            maxDefined: isNumberFinite(_userMax)\n        };\n    }\n getMinMax(canStack) {\n        let { min , max , minDefined , maxDefined  } = this.getUserBounds();\n        let range;\n        if (minDefined && maxDefined) {\n            return {\n                min,\n                max\n            };\n        }\n        const metas = this.getMatchingVisibleMetas();\n        for(let i = 0, ilen = metas.length; i < ilen; ++i){\n            range = metas[i].controller.getMinMax(this, canStack);\n            if (!minDefined) {\n                min = Math.min(min, range.min);\n            }\n            if (!maxDefined) {\n                max = Math.max(max, range.max);\n            }\n        }\n        min = maxDefined && min > max ? max : min;\n        max = minDefined && min > max ? min : max;\n        return {\n            min: finiteOrDefault(min, finiteOrDefault(max, min)),\n            max: finiteOrDefault(max, finiteOrDefault(min, max))\n        };\n    }\n getPadding() {\n        return {\n            left: this.paddingLeft || 0,\n            top: this.paddingTop || 0,\n            right: this.paddingRight || 0,\n            bottom: this.paddingBottom || 0\n        };\n    }\n getTicks() {\n        return this.ticks;\n    }\n getLabels() {\n        const data = this.chart.data;\n        return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n    }\n getLabelItems(chartArea = this.chart.chartArea) {\n        const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n        return items;\n    }\n    beforeLayout() {\n        this._cache = {};\n        this._dataLimitsCached = false;\n    }\n    beforeUpdate() {\n        callback(this.options.beforeUpdate, [\n            this\n        ]);\n    }\n update(maxWidth, maxHeight, margins) {\n        const { beginAtZero , grace , ticks: tickOpts  } = this.options;\n        const sampleSize = tickOpts.sampleSize;\n        this.beforeUpdate();\n        this.maxWidth = maxWidth;\n        this.maxHeight = maxHeight;\n        this._margins = margins = Object.assign({\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0\n        }, margins);\n        this.ticks = null;\n        this._labelSizes = null;\n        this._gridLineItems = null;\n        this._labelItems = null;\n        this.beforeSetDimensions();\n        this.setDimensions();\n        this.afterSetDimensions();\n        this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n        if (!this._dataLimitsCached) {\n            this.beforeDataLimits();\n            this.determineDataLimits();\n            this.afterDataLimits();\n            this._range = _addGrace(this, grace, beginAtZero);\n            this._dataLimitsCached = true;\n        }\n        this.beforeBuildTicks();\n        this.ticks = this.buildTicks() || [];\n        this.afterBuildTicks();\n        const samplingEnabled = sampleSize < this.ticks.length;\n        this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n        this.configure();\n        this.beforeCalculateLabelRotation();\n        this.calculateLabelRotation();\n        this.afterCalculateLabelRotation();\n        if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n            this.ticks = autoSkip(this, this.ticks);\n            this._labelSizes = null;\n            this.afterAutoSkip();\n        }\n        if (samplingEnabled) {\n            this._convertTicksToLabels(this.ticks);\n        }\n        this.beforeFit();\n        this.fit();\n        this.afterFit();\n        this.afterUpdate();\n    }\n configure() {\n        let reversePixels = this.options.reverse;\n        let startPixel, endPixel;\n        if (this.isHorizontal()) {\n            startPixel = this.left;\n            endPixel = this.right;\n        } else {\n            startPixel = this.top;\n            endPixel = this.bottom;\n            reversePixels = !reversePixels;\n        }\n        this._startPixel = startPixel;\n        this._endPixel = endPixel;\n        this._reversePixels = reversePixels;\n        this._length = endPixel - startPixel;\n        this._alignToPixels = this.options.alignToPixels;\n    }\n    afterUpdate() {\n        callback(this.options.afterUpdate, [\n            this\n        ]);\n    }\n    beforeSetDimensions() {\n        callback(this.options.beforeSetDimensions, [\n            this\n        ]);\n    }\n    setDimensions() {\n        if (this.isHorizontal()) {\n            this.width = this.maxWidth;\n            this.left = 0;\n            this.right = this.width;\n        } else {\n            this.height = this.maxHeight;\n            this.top = 0;\n            this.bottom = this.height;\n        }\n        this.paddingLeft = 0;\n        this.paddingTop = 0;\n        this.paddingRight = 0;\n        this.paddingBottom = 0;\n    }\n    afterSetDimensions() {\n        callback(this.options.afterSetDimensions, [\n            this\n        ]);\n    }\n    _callHooks(name) {\n        this.chart.notifyPlugins(name, this.getContext());\n        callback(this.options[name], [\n            this\n        ]);\n    }\n    beforeDataLimits() {\n        this._callHooks('beforeDataLimits');\n    }\n    determineDataLimits() {}\n    afterDataLimits() {\n        this._callHooks('afterDataLimits');\n    }\n    beforeBuildTicks() {\n        this._callHooks('beforeBuildTicks');\n    }\n buildTicks() {\n        return [];\n    }\n    afterBuildTicks() {\n        this._callHooks('afterBuildTicks');\n    }\n    beforeTickToLabelConversion() {\n        callback(this.options.beforeTickToLabelConversion, [\n            this\n        ]);\n    }\n generateTickLabels(ticks) {\n        const tickOpts = this.options.ticks;\n        let i, ilen, tick;\n        for(i = 0, ilen = ticks.length; i < ilen; i++){\n            tick = ticks[i];\n            tick.label = callback(tickOpts.callback, [\n                tick.value,\n                i,\n                ticks\n            ], this);\n        }\n    }\n    afterTickToLabelConversion() {\n        callback(this.options.afterTickToLabelConversion, [\n            this\n        ]);\n    }\n    beforeCalculateLabelRotation() {\n        callback(this.options.beforeCalculateLabelRotation, [\n            this\n        ]);\n    }\n    calculateLabelRotation() {\n        const options = this.options;\n        const tickOpts = options.ticks;\n        const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n        const minRotation = tickOpts.minRotation || 0;\n        const maxRotation = tickOpts.maxRotation;\n        let labelRotation = minRotation;\n        let tickWidth, maxHeight, maxLabelDiagonal;\n        if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n            this.labelRotation = minRotation;\n            return;\n        }\n        const labelSizes = this._getLabelSizes();\n        const maxLabelWidth = labelSizes.widest.width;\n        const maxLabelHeight = labelSizes.highest.height;\n        const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n        tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n        if (maxLabelWidth + 6 > tickWidth) {\n            tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n            maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n            maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n            labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n            labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n        }\n        this.labelRotation = labelRotation;\n    }\n    afterCalculateLabelRotation() {\n        callback(this.options.afterCalculateLabelRotation, [\n            this\n        ]);\n    }\n    afterAutoSkip() {}\n    beforeFit() {\n        callback(this.options.beforeFit, [\n            this\n        ]);\n    }\n    fit() {\n        const minSize = {\n            width: 0,\n            height: 0\n        };\n        const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts  }  } = this;\n        const display = this._isVisible();\n        const isHorizontal = this.isHorizontal();\n        if (display) {\n            const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n            if (isHorizontal) {\n                minSize.width = this.maxWidth;\n                minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n            } else {\n                minSize.height = this.maxHeight;\n                minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n            }\n            if (tickOpts.display && this.ticks.length) {\n                const { first , last , widest , highest  } = this._getLabelSizes();\n                const tickPadding = tickOpts.padding * 2;\n                const angleRadians = toRadians(this.labelRotation);\n                const cos = Math.cos(angleRadians);\n                const sin = Math.sin(angleRadians);\n                if (isHorizontal) {\n                    const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n                    minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n                } else {\n                    const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n                    minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n                }\n                this._calculatePadding(first, last, sin, cos);\n            }\n        }\n        this._handleMargins();\n        if (isHorizontal) {\n            this.width = this._length = chart.width - this._margins.left - this._margins.right;\n            this.height = minSize.height;\n        } else {\n            this.width = minSize.width;\n            this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n        }\n    }\n    _calculatePadding(first, last, sin, cos) {\n        const { ticks: { align , padding  } , position  } = this.options;\n        const isRotated = this.labelRotation !== 0;\n        const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n        if (this.isHorizontal()) {\n            const offsetLeft = this.getPixelForTick(0) - this.left;\n            const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n            let paddingLeft = 0;\n            let paddingRight = 0;\n            if (isRotated) {\n                if (labelsBelowTicks) {\n                    paddingLeft = cos * first.width;\n                    paddingRight = sin * last.height;\n                } else {\n                    paddingLeft = sin * first.height;\n                    paddingRight = cos * last.width;\n                }\n            } else if (align === 'start') {\n                paddingRight = last.width;\n            } else if (align === 'end') {\n                paddingLeft = first.width;\n            } else if (align !== 'inner') {\n                paddingLeft = first.width / 2;\n                paddingRight = last.width / 2;\n            }\n            this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n            this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n        } else {\n            let paddingTop = last.height / 2;\n            let paddingBottom = first.height / 2;\n            if (align === 'start') {\n                paddingTop = 0;\n                paddingBottom = first.height;\n            } else if (align === 'end') {\n                paddingTop = last.height;\n                paddingBottom = 0;\n            }\n            this.paddingTop = paddingTop + padding;\n            this.paddingBottom = paddingBottom + padding;\n        }\n    }\n _handleMargins() {\n        if (this._margins) {\n            this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n            this._margins.top = Math.max(this.paddingTop, this._margins.top);\n            this._margins.right = Math.max(this.paddingRight, this._margins.right);\n            this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n        }\n    }\n    afterFit() {\n        callback(this.options.afterFit, [\n            this\n        ]);\n    }\n isHorizontal() {\n        const { axis , position  } = this.options;\n        return position === 'top' || position === 'bottom' || axis === 'x';\n    }\n isFullSize() {\n        return this.options.fullSize;\n    }\n _convertTicksToLabels(ticks) {\n        this.beforeTickToLabelConversion();\n        this.generateTickLabels(ticks);\n        let i, ilen;\n        for(i = 0, ilen = ticks.length; i < ilen; i++){\n            if (isNullOrUndef(ticks[i].label)) {\n                ticks.splice(i, 1);\n                ilen--;\n                i--;\n            }\n        }\n        this.afterTickToLabelConversion();\n    }\n _getLabelSizes() {\n        let labelSizes = this._labelSizes;\n        if (!labelSizes) {\n            const sampleSize = this.options.ticks.sampleSize;\n            let ticks = this.ticks;\n            if (sampleSize < ticks.length) {\n                ticks = sample(ticks, sampleSize);\n            }\n            this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n        }\n        return labelSizes;\n    }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n        const { ctx , _longestTextCache: caches  } = this;\n        const widths = [];\n        const heights = [];\n        const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n        let widestLabelSize = 0;\n        let highestLabelSize = 0;\n        let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n        for(i = 0; i < length; i += increment){\n            label = ticks[i].label;\n            tickFont = this._resolveTickFontOptions(i);\n            ctx.font = fontString = tickFont.string;\n            cache = caches[fontString] = caches[fontString] || {\n                data: {},\n                gc: []\n            };\n            lineHeight = tickFont.lineHeight;\n            width = height = 0;\n            if (!isNullOrUndef(label) && !isArray(label)) {\n                width = _measureText(ctx, cache.data, cache.gc, width, label);\n                height = lineHeight;\n            } else if (isArray(label)) {\n                for(j = 0, jlen = label.length; j < jlen; ++j){\n                    nestedLabel =  label[j];\n                    if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n                        width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n                        height += lineHeight;\n                    }\n                }\n            }\n            widths.push(width);\n            heights.push(height);\n            widestLabelSize = Math.max(width, widestLabelSize);\n            highestLabelSize = Math.max(height, highestLabelSize);\n        }\n        garbageCollect(caches, length);\n        const widest = widths.indexOf(widestLabelSize);\n        const highest = heights.indexOf(highestLabelSize);\n        const valueAt = (idx)=>({\n                width: widths[idx] || 0,\n                height: heights[idx] || 0\n            });\n        return {\n            first: valueAt(0),\n            last: valueAt(length - 1),\n            widest: valueAt(widest),\n            highest: valueAt(highest),\n            widths,\n            heights\n        };\n    }\n getLabelForValue(value) {\n        return value;\n    }\n getPixelForValue(value, index) {\n        return NaN;\n    }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n        const ticks = this.ticks;\n        if (index < 0 || index > ticks.length - 1) {\n            return null;\n        }\n        return this.getPixelForValue(ticks[index].value);\n    }\n getPixelForDecimal(decimal) {\n        if (this._reversePixels) {\n            decimal = 1 - decimal;\n        }\n        const pixel = this._startPixel + decimal * this._length;\n        return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n    }\n getDecimalForPixel(pixel) {\n        const decimal = (pixel - this._startPixel) / this._length;\n        return this._reversePixels ? 1 - decimal : decimal;\n    }\n getBasePixel() {\n        return this.getPixelForValue(this.getBaseValue());\n    }\n getBaseValue() {\n        const { min , max  } = this;\n        return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n    }\n getContext(index) {\n        const ticks = this.ticks || [];\n        if (index >= 0 && index < ticks.length) {\n            const tick = ticks[index];\n            return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n        }\n        return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n    }\n _tickSize() {\n        const optionTicks = this.options.ticks;\n        const rot = toRadians(this.labelRotation);\n        const cos = Math.abs(Math.cos(rot));\n        const sin = Math.abs(Math.sin(rot));\n        const labelSizes = this._getLabelSizes();\n        const padding = optionTicks.autoSkipPadding || 0;\n        const w = labelSizes ? labelSizes.widest.width + padding : 0;\n        const h = labelSizes ? labelSizes.highest.height + padding : 0;\n        return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n    }\n _isVisible() {\n        const display = this.options.display;\n        if (display !== 'auto') {\n            return !!display;\n        }\n        return this.getMatchingVisibleMetas().length > 0;\n    }\n _computeGridLineItems(chartArea) {\n        const axis = this.axis;\n        const chart = this.chart;\n        const options = this.options;\n        const { grid , position , border  } = options;\n        const offset = grid.offset;\n        const isHorizontal = this.isHorizontal();\n        const ticks = this.ticks;\n        const ticksLength = ticks.length + (offset ? 1 : 0);\n        const tl = getTickMarkLength(grid);\n        const items = [];\n        const borderOpts = border.setContext(this.getContext());\n        const axisWidth = borderOpts.display ? borderOpts.width : 0;\n        const axisHalfWidth = axisWidth / 2;\n        const alignBorderValue = function(pixel) {\n            return _alignPixel(chart, pixel, axisWidth);\n        };\n        let borderValue, i, lineValue, alignedLineValue;\n        let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n        if (position === 'top') {\n            borderValue = alignBorderValue(this.bottom);\n            ty1 = this.bottom - tl;\n            ty2 = borderValue - axisHalfWidth;\n            y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n            y2 = chartArea.bottom;\n        } else if (position === 'bottom') {\n            borderValue = alignBorderValue(this.top);\n            y1 = chartArea.top;\n            y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n            ty1 = borderValue + axisHalfWidth;\n            ty2 = this.top + tl;\n        } else if (position === 'left') {\n            borderValue = alignBorderValue(this.right);\n            tx1 = this.right - tl;\n            tx2 = borderValue - axisHalfWidth;\n            x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n            x2 = chartArea.right;\n        } else if (position === 'right') {\n            borderValue = alignBorderValue(this.left);\n            x1 = chartArea.left;\n            x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n            tx1 = borderValue + axisHalfWidth;\n            tx2 = this.left + tl;\n        } else if (axis === 'x') {\n            if (position === 'center') {\n                borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n            }\n            y1 = chartArea.top;\n            y2 = chartArea.bottom;\n            ty1 = borderValue + axisHalfWidth;\n            ty2 = ty1 + tl;\n        } else if (axis === 'y') {\n            if (position === 'center') {\n                borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n            }\n            tx1 = borderValue - axisHalfWidth;\n            tx2 = tx1 - tl;\n            x1 = chartArea.left;\n            x2 = chartArea.right;\n        }\n        const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n        const step = Math.max(1, Math.ceil(ticksLength / limit));\n        for(i = 0; i < ticksLength; i += step){\n            const context = this.getContext(i);\n            const optsAtIndex = grid.setContext(context);\n            const optsAtIndexBorder = border.setContext(context);\n            const lineWidth = optsAtIndex.lineWidth;\n            const lineColor = optsAtIndex.color;\n            const borderDash = optsAtIndexBorder.dash || [];\n            const borderDashOffset = optsAtIndexBorder.dashOffset;\n            const tickWidth = optsAtIndex.tickWidth;\n            const tickColor = optsAtIndex.tickColor;\n            const tickBorderDash = optsAtIndex.tickBorderDash || [];\n            const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n            lineValue = getPixelForGridLine(this, i, offset);\n            if (lineValue === undefined) {\n                continue;\n            }\n            alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n            if (isHorizontal) {\n                tx1 = tx2 = x1 = x2 = alignedLineValue;\n            } else {\n                ty1 = ty2 = y1 = y2 = alignedLineValue;\n            }\n            items.push({\n                tx1,\n                ty1,\n                tx2,\n                ty2,\n                x1,\n                y1,\n                x2,\n                y2,\n                width: lineWidth,\n                color: lineColor,\n                borderDash,\n                borderDashOffset,\n                tickWidth,\n                tickColor,\n                tickBorderDash,\n                tickBorderDashOffset\n            });\n        }\n        this._ticksLength = ticksLength;\n        this._borderValue = borderValue;\n        return items;\n    }\n _computeLabelItems(chartArea) {\n        const axis = this.axis;\n        const options = this.options;\n        const { position , ticks: optionTicks  } = options;\n        const isHorizontal = this.isHorizontal();\n        const ticks = this.ticks;\n        const { align , crossAlign , padding , mirror  } = optionTicks;\n        const tl = getTickMarkLength(options.grid);\n        const tickAndPadding = tl + padding;\n        const hTickAndPadding = mirror ? -padding : tickAndPadding;\n        const rotation = -toRadians(this.labelRotation);\n        const items = [];\n        let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n        let textBaseline = 'middle';\n        if (position === 'top') {\n            y = this.bottom - hTickAndPadding;\n            textAlign = this._getXAxisLabelAlignment();\n        } else if (position === 'bottom') {\n            y = this.top + hTickAndPadding;\n            textAlign = this._getXAxisLabelAlignment();\n        } else if (position === 'left') {\n            const ret = this._getYAxisLabelAlignment(tl);\n            textAlign = ret.textAlign;\n            x = ret.x;\n        } else if (position === 'right') {\n            const ret = this._getYAxisLabelAlignment(tl);\n            textAlign = ret.textAlign;\n            x = ret.x;\n        } else if (axis === 'x') {\n            if (position === 'center') {\n                y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n            }\n            textAlign = this._getXAxisLabelAlignment();\n        } else if (axis === 'y') {\n            if (position === 'center') {\n                x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                x = this.chart.scales[positionAxisID].getPixelForValue(value);\n            }\n            textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n        }\n        if (axis === 'y') {\n            if (align === 'start') {\n                textBaseline = 'top';\n            } else if (align === 'end') {\n                textBaseline = 'bottom';\n            }\n        }\n        const labelSizes = this._getLabelSizes();\n        for(i = 0, ilen = ticks.length; i < ilen; ++i){\n            tick = ticks[i];\n            label = tick.label;\n            const optsAtIndex = optionTicks.setContext(this.getContext(i));\n            pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n            font = this._resolveTickFontOptions(i);\n            lineHeight = font.lineHeight;\n            lineCount = isArray(label) ? label.length : 1;\n            const halfCount = lineCount / 2;\n            const color = optsAtIndex.color;\n            const strokeColor = optsAtIndex.textStrokeColor;\n            const strokeWidth = optsAtIndex.textStrokeWidth;\n            let tickTextAlign = textAlign;\n            if (isHorizontal) {\n                x = pixel;\n                if (textAlign === 'inner') {\n                    if (i === ilen - 1) {\n                        tickTextAlign = !this.options.reverse ? 'right' : 'left';\n                    } else if (i === 0) {\n                        tickTextAlign = !this.options.reverse ? 'left' : 'right';\n                    } else {\n                        tickTextAlign = 'center';\n                    }\n                }\n                if (position === 'top') {\n                    if (crossAlign === 'near' || rotation !== 0) {\n                        textOffset = -lineCount * lineHeight + lineHeight / 2;\n                    } else if (crossAlign === 'center') {\n                        textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n                    } else {\n                        textOffset = -labelSizes.highest.height + lineHeight / 2;\n                    }\n                } else {\n                    if (crossAlign === 'near' || rotation !== 0) {\n                        textOffset = lineHeight / 2;\n                    } else if (crossAlign === 'center') {\n                        textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n                    } else {\n                        textOffset = labelSizes.highest.height - lineCount * lineHeight;\n                    }\n                }\n                if (mirror) {\n                    textOffset *= -1;\n                }\n                if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n                    x += lineHeight / 2 * Math.sin(rotation);\n                }\n            } else {\n                y = pixel;\n                textOffset = (1 - lineCount) * lineHeight / 2;\n            }\n            let backdrop;\n            if (optsAtIndex.showLabelBackdrop) {\n                const labelPadding = toPadding(optsAtIndex.backdropPadding);\n                const height = labelSizes.heights[i];\n                const width = labelSizes.widths[i];\n                let top = textOffset - labelPadding.top;\n                let left = 0 - labelPadding.left;\n                switch(textBaseline){\n                    case 'middle':\n                        top -= height / 2;\n                        break;\n                    case 'bottom':\n                        top -= height;\n                        break;\n                }\n                switch(textAlign){\n                    case 'center':\n                        left -= width / 2;\n                        break;\n                    case 'right':\n                        left -= width;\n                        break;\n                    case 'inner':\n                        if (i === ilen - 1) {\n                            left -= width;\n                        } else if (i > 0) {\n                            left -= width / 2;\n                        }\n                        break;\n                }\n                backdrop = {\n                    left,\n                    top,\n                    width: width + labelPadding.width,\n                    height: height + labelPadding.height,\n                    color: optsAtIndex.backdropColor\n                };\n            }\n            items.push({\n                label,\n                font,\n                textOffset,\n                options: {\n                    rotation,\n                    color,\n                    strokeColor,\n                    strokeWidth,\n                    textAlign: tickTextAlign,\n                    textBaseline,\n                    translation: [\n                        x,\n                        y\n                    ],\n                    backdrop\n                }\n            });\n        }\n        return items;\n    }\n    _getXAxisLabelAlignment() {\n        const { position , ticks  } = this.options;\n        const rotation = -toRadians(this.labelRotation);\n        if (rotation) {\n            return position === 'top' ? 'left' : 'right';\n        }\n        let align = 'center';\n        if (ticks.align === 'start') {\n            align = 'left';\n        } else if (ticks.align === 'end') {\n            align = 'right';\n        } else if (ticks.align === 'inner') {\n            align = 'inner';\n        }\n        return align;\n    }\n    _getYAxisLabelAlignment(tl) {\n        const { position , ticks: { crossAlign , mirror , padding  }  } = this.options;\n        const labelSizes = this._getLabelSizes();\n        const tickAndPadding = tl + padding;\n        const widest = labelSizes.widest.width;\n        let textAlign;\n        let x;\n        if (position === 'left') {\n            if (mirror) {\n                x = this.right + padding;\n                if (crossAlign === 'near') {\n                    textAlign = 'left';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x += widest / 2;\n                } else {\n                    textAlign = 'right';\n                    x += widest;\n                }\n            } else {\n                x = this.right - tickAndPadding;\n                if (crossAlign === 'near') {\n                    textAlign = 'right';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x -= widest / 2;\n                } else {\n                    textAlign = 'left';\n                    x = this.left;\n                }\n            }\n        } else if (position === 'right') {\n            if (mirror) {\n                x = this.left + padding;\n                if (crossAlign === 'near') {\n                    textAlign = 'right';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x -= widest / 2;\n                } else {\n                    textAlign = 'left';\n                    x -= widest;\n                }\n            } else {\n                x = this.left + tickAndPadding;\n                if (crossAlign === 'near') {\n                    textAlign = 'left';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x += widest / 2;\n                } else {\n                    textAlign = 'right';\n                    x = this.right;\n                }\n            }\n        } else {\n            textAlign = 'right';\n        }\n        return {\n            textAlign,\n            x\n        };\n    }\n _computeLabelArea() {\n        if (this.options.ticks.mirror) {\n            return;\n        }\n        const chart = this.chart;\n        const position = this.options.position;\n        if (position === 'left' || position === 'right') {\n            return {\n                top: 0,\n                left: this.left,\n                bottom: chart.height,\n                right: this.right\n            };\n        }\n        if (position === 'top' || position === 'bottom') {\n            return {\n                top: this.top,\n                left: 0,\n                bottom: this.bottom,\n                right: chart.width\n            };\n        }\n    }\n drawBackground() {\n        const { ctx , options: { backgroundColor  } , left , top , width , height  } = this;\n        if (backgroundColor) {\n            ctx.save();\n            ctx.fillStyle = backgroundColor;\n            ctx.fillRect(left, top, width, height);\n            ctx.restore();\n        }\n    }\n    getLineWidthForValue(value) {\n        const grid = this.options.grid;\n        if (!this._isVisible() || !grid.display) {\n            return 0;\n        }\n        const ticks = this.ticks;\n        const index = ticks.findIndex((t)=>t.value === value);\n        if (index >= 0) {\n            const opts = grid.setContext(this.getContext(index));\n            return opts.lineWidth;\n        }\n        return 0;\n    }\n drawGrid(chartArea) {\n        const grid = this.options.grid;\n        const ctx = this.ctx;\n        const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n        let i, ilen;\n        const drawLine = (p1, p2, style)=>{\n            if (!style.width || !style.color) {\n                return;\n            }\n            ctx.save();\n            ctx.lineWidth = style.width;\n            ctx.strokeStyle = style.color;\n            ctx.setLineDash(style.borderDash || []);\n            ctx.lineDashOffset = style.borderDashOffset;\n            ctx.beginPath();\n            ctx.moveTo(p1.x, p1.y);\n            ctx.lineTo(p2.x, p2.y);\n            ctx.stroke();\n            ctx.restore();\n        };\n        if (grid.display) {\n            for(i = 0, ilen = items.length; i < ilen; ++i){\n                const item = items[i];\n                if (grid.drawOnChartArea) {\n                    drawLine({\n                        x: item.x1,\n                        y: item.y1\n                    }, {\n                        x: item.x2,\n                        y: item.y2\n                    }, item);\n                }\n                if (grid.drawTicks) {\n                    drawLine({\n                        x: item.tx1,\n                        y: item.ty1\n                    }, {\n                        x: item.tx2,\n                        y: item.ty2\n                    }, {\n                        color: item.tickColor,\n                        width: item.tickWidth,\n                        borderDash: item.tickBorderDash,\n                        borderDashOffset: item.tickBorderDashOffset\n                    });\n                }\n            }\n        }\n    }\n drawBorder() {\n        const { chart , ctx , options: { border , grid  }  } = this;\n        const borderOpts = border.setContext(this.getContext());\n        const axisWidth = border.display ? borderOpts.width : 0;\n        if (!axisWidth) {\n            return;\n        }\n        const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n        const borderValue = this._borderValue;\n        let x1, x2, y1, y2;\n        if (this.isHorizontal()) {\n            x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n            x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n            y1 = y2 = borderValue;\n        } else {\n            y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n            y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n            x1 = x2 = borderValue;\n        }\n        ctx.save();\n        ctx.lineWidth = borderOpts.width;\n        ctx.strokeStyle = borderOpts.color;\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        ctx.restore();\n    }\n drawLabels(chartArea) {\n        const optionTicks = this.options.ticks;\n        if (!optionTicks.display) {\n            return;\n        }\n        const ctx = this.ctx;\n        const area = this._computeLabelArea();\n        if (area) {\n            clipArea(ctx, area);\n        }\n        const items = this.getLabelItems(chartArea);\n        for (const item of items){\n            const renderTextOptions = item.options;\n            const tickFont = item.font;\n            const label = item.label;\n            const y = item.textOffset;\n            renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n        }\n        if (area) {\n            unclipArea(ctx);\n        }\n    }\n drawTitle() {\n        const { ctx , options: { position , title , reverse  }  } = this;\n        if (!title.display) {\n            return;\n        }\n        const font = toFont(title.font);\n        const padding = toPadding(title.padding);\n        const align = title.align;\n        let offset = font.lineHeight / 2;\n        if (position === 'bottom' || position === 'center' || isObject(position)) {\n            offset += padding.bottom;\n            if (isArray(title.text)) {\n                offset += font.lineHeight * (title.text.length - 1);\n            }\n        } else {\n            offset += padding.top;\n        }\n        const { titleX , titleY , maxWidth , rotation  } = titleArgs(this, offset, position, align);\n        renderText(ctx, title.text, 0, 0, font, {\n            color: title.color,\n            maxWidth,\n            rotation,\n            textAlign: titleAlign(align, position, reverse),\n            textBaseline: 'middle',\n            translation: [\n                titleX,\n                titleY\n            ]\n        });\n    }\n    draw(chartArea) {\n        if (!this._isVisible()) {\n            return;\n        }\n        this.drawBackground();\n        this.drawGrid(chartArea);\n        this.drawBorder();\n        this.drawTitle();\n        this.drawLabels(chartArea);\n    }\n _layers() {\n        const opts = this.options;\n        const tz = opts.ticks && opts.ticks.z || 0;\n        const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n        const bz = valueOrDefault(opts.border && opts.border.z, 0);\n        if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n            return [\n                {\n                    z: tz,\n                    draw: (chartArea)=>{\n                        this.draw(chartArea);\n                    }\n                }\n            ];\n        }\n        return [\n            {\n                z: gz,\n                draw: (chartArea)=>{\n                    this.drawBackground();\n                    this.drawGrid(chartArea);\n                    this.drawTitle();\n                }\n            },\n            {\n                z: bz,\n                draw: ()=>{\n                    this.drawBorder();\n                }\n            },\n            {\n                z: tz,\n                draw: (chartArea)=>{\n                    this.drawLabels(chartArea);\n                }\n            }\n        ];\n    }\n getMatchingVisibleMetas(type) {\n        const metas = this.chart.getSortedVisibleDatasetMetas();\n        const axisID = this.axis + 'AxisID';\n        const result = [];\n        let i, ilen;\n        for(i = 0, ilen = metas.length; i < ilen; ++i){\n            const meta = metas[i];\n            if (meta[axisID] === this.id && (!type || meta.type === type)) {\n                result.push(meta);\n            }\n        }\n        return result;\n    }\n _resolveTickFontOptions(index) {\n        const opts = this.options.ticks.setContext(this.getContext(index));\n        return toFont(opts.font);\n    }\n _maxDigits() {\n        const fontSize = this._resolveTickFontOptions(0).lineHeight;\n        return (this.isHorizontal() ? this.width : this.height) / fontSize;\n    }\n}\n\nclass TypedRegistry {\n    constructor(type, scope, override){\n        this.type = type;\n        this.scope = scope;\n        this.override = override;\n        this.items = Object.create(null);\n    }\n    isForType(type) {\n        return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n    }\n register(item) {\n        const proto = Object.getPrototypeOf(item);\n        let parentScope;\n        if (isIChartComponent(proto)) {\n            parentScope = this.register(proto);\n        }\n        const items = this.items;\n        const id = item.id;\n        const scope = this.scope + '.' + id;\n        if (!id) {\n            throw new Error('class does not have id: ' + item);\n        }\n        if (id in items) {\n            return scope;\n        }\n        items[id] = item;\n        registerDefaults(item, scope, parentScope);\n        if (this.override) {\n            defaults.override(item.id, item.overrides);\n        }\n        return scope;\n    }\n get(id) {\n        return this.items[id];\n    }\n unregister(item) {\n        const items = this.items;\n        const id = item.id;\n        const scope = this.scope;\n        if (id in items) {\n            delete items[id];\n        }\n        if (scope && id in defaults[scope]) {\n            delete defaults[scope][id];\n            if (this.override) {\n                delete overrides[id];\n            }\n        }\n    }\n}\nfunction registerDefaults(item, scope, parentScope) {\n    const itemDefaults = merge(Object.create(null), [\n        parentScope ? defaults.get(parentScope) : {},\n        defaults.get(scope),\n        item.defaults\n    ]);\n    defaults.set(scope, itemDefaults);\n    if (item.defaultRoutes) {\n        routeDefaults(scope, item.defaultRoutes);\n    }\n    if (item.descriptors) {\n        defaults.describe(scope, item.descriptors);\n    }\n}\nfunction routeDefaults(scope, routes) {\n    Object.keys(routes).forEach((property)=>{\n        const propertyParts = property.split('.');\n        const sourceName = propertyParts.pop();\n        const sourceScope = [\n            scope\n        ].concat(propertyParts).join('.');\n        const parts = routes[property].split('.');\n        const targetName = parts.pop();\n        const targetScope = parts.join('.');\n        defaults.route(sourceScope, sourceName, targetScope, targetName);\n    });\n}\nfunction isIChartComponent(proto) {\n    return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n    constructor(){\n        this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n        this.elements = new TypedRegistry(Element, 'elements');\n        this.plugins = new TypedRegistry(Object, 'plugins');\n        this.scales = new TypedRegistry(Scale, 'scales');\n        this._typedRegistries = [\n            this.controllers,\n            this.scales,\n            this.elements\n        ];\n    }\n add(...args) {\n        this._each('register', args);\n    }\n    remove(...args) {\n        this._each('unregister', args);\n    }\n addControllers(...args) {\n        this._each('register', args, this.controllers);\n    }\n addElements(...args) {\n        this._each('register', args, this.elements);\n    }\n addPlugins(...args) {\n        this._each('register', args, this.plugins);\n    }\n addScales(...args) {\n        this._each('register', args, this.scales);\n    }\n getController(id) {\n        return this._get(id, this.controllers, 'controller');\n    }\n getElement(id) {\n        return this._get(id, this.elements, 'element');\n    }\n getPlugin(id) {\n        return this._get(id, this.plugins, 'plugin');\n    }\n getScale(id) {\n        return this._get(id, this.scales, 'scale');\n    }\n removeControllers(...args) {\n        this._each('unregister', args, this.controllers);\n    }\n removeElements(...args) {\n        this._each('unregister', args, this.elements);\n    }\n removePlugins(...args) {\n        this._each('unregister', args, this.plugins);\n    }\n removeScales(...args) {\n        this._each('unregister', args, this.scales);\n    }\n _each(method, args, typedRegistry) {\n        [\n            ...args\n        ].forEach((arg)=>{\n            const reg = typedRegistry || this._getRegistryForType(arg);\n            if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n                this._exec(method, reg, arg);\n            } else {\n                each(arg, (item)=>{\n                    const itemReg = typedRegistry || this._getRegistryForType(item);\n                    this._exec(method, itemReg, item);\n                });\n            }\n        });\n    }\n _exec(method, registry, component) {\n        const camelMethod = _capitalize(method);\n        callback(component['before' + camelMethod], [], component);\n        registry[method](component);\n        callback(component['after' + camelMethod], [], component);\n    }\n _getRegistryForType(type) {\n        for(let i = 0; i < this._typedRegistries.length; i++){\n            const reg = this._typedRegistries[i];\n            if (reg.isForType(type)) {\n                return reg;\n            }\n        }\n        return this.plugins;\n    }\n _get(id, typedRegistry, type) {\n        const item = typedRegistry.get(id);\n        if (item === undefined) {\n            throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n        }\n        return item;\n    }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n    constructor(){\n        this._init = [];\n    }\n notify(chart, hook, args, filter) {\n        if (hook === 'beforeInit') {\n            this._init = this._createDescriptors(chart, true);\n            this._notify(this._init, chart, 'install');\n        }\n        const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n        const result = this._notify(descriptors, chart, hook, args);\n        if (hook === 'afterDestroy') {\n            this._notify(descriptors, chart, 'stop');\n            this._notify(this._init, chart, 'uninstall');\n        }\n        return result;\n    }\n _notify(descriptors, chart, hook, args) {\n        args = args || {};\n        for (const descriptor of descriptors){\n            const plugin = descriptor.plugin;\n            const method = plugin[hook];\n            const params = [\n                chart,\n                args,\n                descriptor.options\n            ];\n            if (callback(method, params, plugin) === false && args.cancelable) {\n                return false;\n            }\n        }\n        return true;\n    }\n    invalidate() {\n        if (!isNullOrUndef(this._cache)) {\n            this._oldCache = this._cache;\n            this._cache = undefined;\n        }\n    }\n _descriptors(chart) {\n        if (this._cache) {\n            return this._cache;\n        }\n        const descriptors = this._cache = this._createDescriptors(chart);\n        this._notifyStateChanges(chart);\n        return descriptors;\n    }\n    _createDescriptors(chart, all) {\n        const config = chart && chart.config;\n        const options = valueOrDefault(config.options && config.options.plugins, {});\n        const plugins = allPlugins(config);\n        return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n    }\n _notifyStateChanges(chart) {\n        const previousDescriptors = this._oldCache || [];\n        const descriptors = this._cache;\n        const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n        this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n        this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n    }\n}\n function allPlugins(config) {\n    const localIds = {};\n    const plugins = [];\n    const keys = Object.keys(registry.plugins.items);\n    for(let i = 0; i < keys.length; i++){\n        plugins.push(registry.getPlugin(keys[i]));\n    }\n    const local = config.plugins || [];\n    for(let i = 0; i < local.length; i++){\n        const plugin = local[i];\n        if (plugins.indexOf(plugin) === -1) {\n            plugins.push(plugin);\n            localIds[plugin.id] = true;\n        }\n    }\n    return {\n        plugins,\n        localIds\n    };\n}\nfunction getOpts(options, all) {\n    if (!all && options === false) {\n        return null;\n    }\n    if (options === true) {\n        return {};\n    }\n    return options;\n}\nfunction createDescriptors(chart, { plugins , localIds  }, options, all) {\n    const result = [];\n    const context = chart.getContext();\n    for (const plugin of plugins){\n        const id = plugin.id;\n        const opts = getOpts(options[id], all);\n        if (opts === null) {\n            continue;\n        }\n        result.push({\n            plugin,\n            options: pluginOpts(chart.config, {\n                plugin,\n                local: localIds[id]\n            }, opts, context)\n        });\n    }\n    return result;\n}\nfunction pluginOpts(config, { plugin , local  }, opts, context) {\n    const keys = config.pluginScopeKeys(plugin);\n    const scopes = config.getOptionScopes(opts, keys);\n    if (local && plugin.defaults) {\n        scopes.push(plugin.defaults);\n    }\n    return config.createResolver(scopes, context, [\n        ''\n    ], {\n        scriptable: false,\n        indexable: false,\n        allKeys: true\n    });\n}\n\nfunction getIndexAxis(type, options) {\n    const datasetDefaults = defaults.datasets[type] || {};\n    const datasetOptions = (options.datasets || {})[type] || {};\n    return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n    let axis = id;\n    if (id === '_index_') {\n        axis = indexAxis;\n    } else if (id === '_value_') {\n        axis = indexAxis === 'x' ? 'y' : 'x';\n    }\n    return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n    return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n    if (id === 'x' || id === 'y' || id === 'r') {\n        return id;\n    }\n}\nfunction axisFromPosition(position) {\n    if (position === 'top' || position === 'bottom') {\n        return 'x';\n    }\n    if (position === 'left' || position === 'right') {\n        return 'y';\n    }\n}\nfunction determineAxis(id, ...scaleOptions) {\n    if (idMatchesAxis(id)) {\n        return id;\n    }\n    for (const opts of scaleOptions){\n        const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n        if (axis) {\n            return axis;\n        }\n    }\n    throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n    if (dataset[axis + 'AxisID'] === id) {\n        return {\n            axis\n        };\n    }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n    if (config.data && config.data.datasets) {\n        const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n        if (boundDs.length) {\n            return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n        }\n    }\n    return {};\n}\nfunction mergeScaleConfig(config, options) {\n    const chartDefaults = overrides[config.type] || {\n        scales: {}\n    };\n    const configScales = options.scales || {};\n    const chartIndexAxis = getIndexAxis(config.type, options);\n    const scales = Object.create(null);\n    Object.keys(configScales).forEach((id)=>{\n        const scaleConf = configScales[id];\n        if (!isObject(scaleConf)) {\n            return console.error(`Invalid scale configuration for scale: ${id}`);\n        }\n        if (scaleConf._proxy) {\n            return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n        }\n        const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n        const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n        const defaultScaleOptions = chartDefaults.scales || {};\n        scales[id] = mergeIf(Object.create(null), [\n            {\n                axis\n            },\n            scaleConf,\n            defaultScaleOptions[axis],\n            defaultScaleOptions[defaultId]\n        ]);\n    });\n    config.data.datasets.forEach((dataset)=>{\n        const type = dataset.type || config.type;\n        const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n        const datasetDefaults = overrides[type] || {};\n        const defaultScaleOptions = datasetDefaults.scales || {};\n        Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n            const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n            const id = dataset[axis + 'AxisID'] || axis;\n            scales[id] = scales[id] || Object.create(null);\n            mergeIf(scales[id], [\n                {\n                    axis\n                },\n                configScales[id],\n                defaultScaleOptions[defaultID]\n            ]);\n        });\n    });\n    Object.keys(scales).forEach((key)=>{\n        const scale = scales[key];\n        mergeIf(scale, [\n            defaults.scales[scale.type],\n            defaults.scale\n        ]);\n    });\n    return scales;\n}\nfunction initOptions(config) {\n    const options = config.options || (config.options = {});\n    options.plugins = valueOrDefault(options.plugins, {});\n    options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n    data = data || {};\n    data.datasets = data.datasets || [];\n    data.labels = data.labels || [];\n    return data;\n}\nfunction initConfig(config) {\n    config = config || {};\n    config.data = initData(config.data);\n    initOptions(config);\n    return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n    let keys = keyCache.get(cacheKey);\n    if (!keys) {\n        keys = generate();\n        keyCache.set(cacheKey, keys);\n        keysCached.add(keys);\n    }\n    return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n    const opts = resolveObjectKey(obj, key);\n    if (opts !== undefined) {\n        set.add(opts);\n    }\n};\nclass Config {\n    constructor(config){\n        this._config = initConfig(config);\n        this._scopeCache = new Map();\n        this._resolverCache = new Map();\n    }\n    get platform() {\n        return this._config.platform;\n    }\n    get type() {\n        return this._config.type;\n    }\n    set type(type) {\n        this._config.type = type;\n    }\n    get data() {\n        return this._config.data;\n    }\n    set data(data) {\n        this._config.data = initData(data);\n    }\n    get options() {\n        return this._config.options;\n    }\n    set options(options) {\n        this._config.options = options;\n    }\n    get plugins() {\n        return this._config.plugins;\n    }\n    update() {\n        const config = this._config;\n        this.clearCache();\n        initOptions(config);\n    }\n    clearCache() {\n        this._scopeCache.clear();\n        this._resolverCache.clear();\n    }\n datasetScopeKeys(datasetType) {\n        return cachedKeys(datasetType, ()=>[\n                [\n                    `datasets.${datasetType}`,\n                    ''\n                ]\n            ]);\n    }\n datasetAnimationScopeKeys(datasetType, transition) {\n        return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n                [\n                    `datasets.${datasetType}.transitions.${transition}`,\n                    `transitions.${transition}`\n                ],\n                [\n                    `datasets.${datasetType}`,\n                    ''\n                ]\n            ]);\n    }\n datasetElementScopeKeys(datasetType, elementType) {\n        return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n                [\n                    `datasets.${datasetType}.elements.${elementType}`,\n                    `datasets.${datasetType}`,\n                    `elements.${elementType}`,\n                    ''\n                ]\n            ]);\n    }\n pluginScopeKeys(plugin) {\n        const id = plugin.id;\n        const type = this.type;\n        return cachedKeys(`${type}-plugin-${id}`, ()=>[\n                [\n                    `plugins.${id}`,\n                    ...plugin.additionalOptionScopes || []\n                ]\n            ]);\n    }\n _cachedScopes(mainScope, resetCache) {\n        const _scopeCache = this._scopeCache;\n        let cache = _scopeCache.get(mainScope);\n        if (!cache || resetCache) {\n            cache = new Map();\n            _scopeCache.set(mainScope, cache);\n        }\n        return cache;\n    }\n getOptionScopes(mainScope, keyLists, resetCache) {\n        const { options , type  } = this;\n        const cache = this._cachedScopes(mainScope, resetCache);\n        const cached = cache.get(keyLists);\n        if (cached) {\n            return cached;\n        }\n        const scopes = new Set();\n        keyLists.forEach((keys)=>{\n            if (mainScope) {\n                scopes.add(mainScope);\n                keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n            }\n            keys.forEach((key)=>addIfFound(scopes, options, key));\n            keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n            keys.forEach((key)=>addIfFound(scopes, defaults, key));\n            keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n        });\n        const array = Array.from(scopes);\n        if (array.length === 0) {\n            array.push(Object.create(null));\n        }\n        if (keysCached.has(keyLists)) {\n            cache.set(keyLists, array);\n        }\n        return array;\n    }\n chartOptionScopes() {\n        const { options , type  } = this;\n        return [\n            options,\n            overrides[type] || {},\n            defaults.datasets[type] || {},\n            {\n                type\n            },\n            defaults,\n            descriptors\n        ];\n    }\n resolveNamedOptions(scopes, names, context, prefixes = [\n        ''\n    ]) {\n        const result = {\n            $shared: true\n        };\n        const { resolver , subPrefixes  } = getResolver(this._resolverCache, scopes, prefixes);\n        let options = resolver;\n        if (needContext(resolver, names)) {\n            result.$shared = false;\n            context = isFunction(context) ? context() : context;\n            const subResolver = this.createResolver(scopes, context, subPrefixes);\n            options = _attachContext(resolver, context, subResolver);\n        }\n        for (const prop of names){\n            result[prop] = options[prop];\n        }\n        return result;\n    }\n createResolver(scopes, context, prefixes = [\n        ''\n    ], descriptorDefaults) {\n        const { resolver  } = getResolver(this._resolverCache, scopes, prefixes);\n        return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n    }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n    let cache = resolverCache.get(scopes);\n    if (!cache) {\n        cache = new Map();\n        resolverCache.set(scopes, cache);\n    }\n    const cacheKey = prefixes.join();\n    let cached = cache.get(cacheKey);\n    if (!cached) {\n        const resolver = _createResolver(scopes, prefixes);\n        cached = {\n            resolver,\n            subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n        };\n        cache.set(cacheKey, cached);\n    }\n    return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));\nfunction needContext(proxy, names) {\n    const { isScriptable , isIndexable  } = _descriptors(proxy);\n    for (const prop of names){\n        const scriptable = isScriptable(prop);\n        const indexable = isIndexable(prop);\n        const value = (indexable || scriptable) && proxy[prop];\n        if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar version = \"4.4.5\";\n\nconst KNOWN_POSITIONS = [\n    'top',\n    'bottom',\n    'left',\n    'right',\n    'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n    return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n    return function(a, b) {\n        return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n    };\n}\nfunction onAnimationsComplete(context) {\n    const chart = context.chart;\n    const animationOptions = chart.options.animation;\n    chart.notifyPlugins('afterRender');\n    callback(animationOptions && animationOptions.onComplete, [\n        context\n    ], chart);\n}\nfunction onAnimationProgress(context) {\n    const chart = context.chart;\n    const animationOptions = chart.options.animation;\n    callback(animationOptions && animationOptions.onProgress, [\n        context\n    ], chart);\n}\n function getCanvas(item) {\n    if (_isDomSupported() && typeof item === 'string') {\n        item = document.getElementById(item);\n    } else if (item && item.length) {\n        item = item[0];\n    }\n    if (item && item.canvas) {\n        item = item.canvas;\n    }\n    return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n    const canvas = getCanvas(key);\n    return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n    const keys = Object.keys(obj);\n    for (const key of keys){\n        const intKey = +key;\n        if (intKey >= start) {\n            const value = obj[key];\n            delete obj[key];\n            if (move > 0 || intKey > start) {\n                obj[intKey + move] = value;\n            }\n        }\n    }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n    if (!inChartArea || e.type === 'mouseout') {\n        return null;\n    }\n    if (isClick) {\n        return lastEvent;\n    }\n    return e;\n}\nfunction getSizeForArea(scale, chartArea, field) {\n    return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n    const { xScale , yScale  } = meta;\n    if (xScale && yScale) {\n        return {\n            left: getSizeForArea(xScale, chartArea, 'left'),\n            right: getSizeForArea(xScale, chartArea, 'right'),\n            top: getSizeForArea(yScale, chartArea, 'top'),\n            bottom: getSizeForArea(yScale, chartArea, 'bottom')\n        };\n    }\n    return chartArea;\n}\nclass Chart {\n    static defaults = defaults;\n    static instances = instances;\n    static overrides = overrides;\n    static registry = registry;\n    static version = version;\n    static getChart = getChart;\n    static register(...items) {\n        registry.add(...items);\n        invalidatePlugins();\n    }\n    static unregister(...items) {\n        registry.remove(...items);\n        invalidatePlugins();\n    }\n    constructor(item, userConfig){\n        const config = this.config = new Config(userConfig);\n        const initialCanvas = getCanvas(item);\n        const existingChart = getChart(initialCanvas);\n        if (existingChart) {\n            throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n        }\n        const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n        this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n        this.platform.updateConfig(config);\n        const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n        const canvas = context && context.canvas;\n        const height = canvas && canvas.height;\n        const width = canvas && canvas.width;\n        this.id = uid();\n        this.ctx = context;\n        this.canvas = canvas;\n        this.width = width;\n        this.height = height;\n        this._options = options;\n        this._aspectRatio = this.aspectRatio;\n        this._layers = [];\n        this._metasets = [];\n        this._stacks = undefined;\n        this.boxes = [];\n        this.currentDevicePixelRatio = undefined;\n        this.chartArea = undefined;\n        this._active = [];\n        this._lastEvent = undefined;\n        this._listeners = {};\n         this._responsiveListeners = undefined;\n        this._sortedMetasets = [];\n        this.scales = {};\n        this._plugins = new PluginService();\n        this.$proxies = {};\n        this._hiddenIndices = {};\n        this.attached = false;\n        this._animationsDisabled = undefined;\n        this.$context = undefined;\n        this._doResize = debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n        this._dataChanges = [];\n        instances[this.id] = this;\n        if (!context || !canvas) {\n            console.error(\"Failed to create chart: can't acquire context from the given item\");\n            return;\n        }\n        animator.listen(this, 'complete', onAnimationsComplete);\n        animator.listen(this, 'progress', onAnimationProgress);\n        this._initialize();\n        if (this.attached) {\n            this.update();\n        }\n    }\n    get aspectRatio() {\n        const { options: { aspectRatio , maintainAspectRatio  } , width , height , _aspectRatio  } = this;\n        if (!isNullOrUndef(aspectRatio)) {\n            return aspectRatio;\n        }\n        if (maintainAspectRatio && _aspectRatio) {\n            return _aspectRatio;\n        }\n        return height ? width / height : null;\n    }\n    get data() {\n        return this.config.data;\n    }\n    set data(data) {\n        this.config.data = data;\n    }\n    get options() {\n        return this._options;\n    }\n    set options(options) {\n        this.config.options = options;\n    }\n    get registry() {\n        return registry;\n    }\n _initialize() {\n        this.notifyPlugins('beforeInit');\n        if (this.options.responsive) {\n            this.resize();\n        } else {\n            retinaScale(this, this.options.devicePixelRatio);\n        }\n        this.bindEvents();\n        this.notifyPlugins('afterInit');\n        return this;\n    }\n    clear() {\n        clearCanvas(this.canvas, this.ctx);\n        return this;\n    }\n    stop() {\n        animator.stop(this);\n        return this;\n    }\n resize(width, height) {\n        if (!animator.running(this)) {\n            this._resize(width, height);\n        } else {\n            this._resizeBeforeDraw = {\n                width,\n                height\n            };\n        }\n    }\n    _resize(width, height) {\n        const options = this.options;\n        const canvas = this.canvas;\n        const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n        const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n        const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n        const mode = this.width ? 'resize' : 'attach';\n        this.width = newSize.width;\n        this.height = newSize.height;\n        this._aspectRatio = this.aspectRatio;\n        if (!retinaScale(this, newRatio, true)) {\n            return;\n        }\n        this.notifyPlugins('resize', {\n            size: newSize\n        });\n        callback(options.onResize, [\n            this,\n            newSize\n        ], this);\n        if (this.attached) {\n            if (this._doResize(mode)) {\n                this.render();\n            }\n        }\n    }\n    ensureScalesHaveIDs() {\n        const options = this.options;\n        const scalesOptions = options.scales || {};\n        each(scalesOptions, (axisOptions, axisID)=>{\n            axisOptions.id = axisID;\n        });\n    }\n buildOrUpdateScales() {\n        const options = this.options;\n        const scaleOpts = options.scales;\n        const scales = this.scales;\n        const updated = Object.keys(scales).reduce((obj, id)=>{\n            obj[id] = false;\n            return obj;\n        }, {});\n        let items = [];\n        if (scaleOpts) {\n            items = items.concat(Object.keys(scaleOpts).map((id)=>{\n                const scaleOptions = scaleOpts[id];\n                const axis = determineAxis(id, scaleOptions);\n                const isRadial = axis === 'r';\n                const isHorizontal = axis === 'x';\n                return {\n                    options: scaleOptions,\n                    dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n                    dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n                };\n            }));\n        }\n        each(items, (item)=>{\n            const scaleOptions = item.options;\n            const id = scaleOptions.id;\n            const axis = determineAxis(id, scaleOptions);\n            const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n            if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n                scaleOptions.position = item.dposition;\n            }\n            updated[id] = true;\n            let scale = null;\n            if (id in scales && scales[id].type === scaleType) {\n                scale = scales[id];\n            } else {\n                const scaleClass = registry.getScale(scaleType);\n                scale = new scaleClass({\n                    id,\n                    type: scaleType,\n                    ctx: this.ctx,\n                    chart: this\n                });\n                scales[scale.id] = scale;\n            }\n            scale.init(scaleOptions, options);\n        });\n        each(updated, (hasUpdated, id)=>{\n            if (!hasUpdated) {\n                delete scales[id];\n            }\n        });\n        each(scales, (scale)=>{\n            layouts.configure(this, scale, scale.options);\n            layouts.addBox(this, scale);\n        });\n    }\n _updateMetasets() {\n        const metasets = this._metasets;\n        const numData = this.data.datasets.length;\n        const numMeta = metasets.length;\n        metasets.sort((a, b)=>a.index - b.index);\n        if (numMeta > numData) {\n            for(let i = numData; i < numMeta; ++i){\n                this._destroyDatasetMeta(i);\n            }\n            metasets.splice(numData, numMeta - numData);\n        }\n        this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n    }\n _removeUnreferencedMetasets() {\n        const { _metasets: metasets , data: { datasets  }  } = this;\n        if (metasets.length > datasets.length) {\n            delete this._stacks;\n        }\n        metasets.forEach((meta, index)=>{\n            if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n                this._destroyDatasetMeta(index);\n            }\n        });\n    }\n    buildOrUpdateControllers() {\n        const newControllers = [];\n        const datasets = this.data.datasets;\n        let i, ilen;\n        this._removeUnreferencedMetasets();\n        for(i = 0, ilen = datasets.length; i < ilen; i++){\n            const dataset = datasets[i];\n            let meta = this.getDatasetMeta(i);\n            const type = dataset.type || this.config.type;\n            if (meta.type && meta.type !== type) {\n                this._destroyDatasetMeta(i);\n                meta = this.getDatasetMeta(i);\n            }\n            meta.type = type;\n            meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n            meta.order = dataset.order || 0;\n            meta.index = i;\n            meta.label = '' + dataset.label;\n            meta.visible = this.isDatasetVisible(i);\n            if (meta.controller) {\n                meta.controller.updateIndex(i);\n                meta.controller.linkScales();\n            } else {\n                const ControllerClass = registry.getController(type);\n                const { datasetElementType , dataElementType  } = defaults.datasets[type];\n                Object.assign(ControllerClass, {\n                    dataElementType: registry.getElement(dataElementType),\n                    datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n                });\n                meta.controller = new ControllerClass(this, i);\n                newControllers.push(meta.controller);\n            }\n        }\n        this._updateMetasets();\n        return newControllers;\n    }\n _resetElements() {\n        each(this.data.datasets, (dataset, datasetIndex)=>{\n            this.getDatasetMeta(datasetIndex).controller.reset();\n        }, this);\n    }\n reset() {\n        this._resetElements();\n        this.notifyPlugins('reset');\n    }\n    update(mode) {\n        const config = this.config;\n        config.update();\n        const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n        const animsDisabled = this._animationsDisabled = !options.animation;\n        this._updateScales();\n        this._checkEventBindings();\n        this._updateHiddenIndices();\n        this._plugins.invalidate();\n        if (this.notifyPlugins('beforeUpdate', {\n            mode,\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        const newControllers = this.buildOrUpdateControllers();\n        this.notifyPlugins('beforeElementsUpdate');\n        let minPadding = 0;\n        for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n            const { controller  } = this.getDatasetMeta(i);\n            const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n            controller.buildOrUpdateElements(reset);\n            minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n        }\n        minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n        this._updateLayout(minPadding);\n        if (!animsDisabled) {\n            each(newControllers, (controller)=>{\n                controller.reset();\n            });\n        }\n        this._updateDatasets(mode);\n        this.notifyPlugins('afterUpdate', {\n            mode\n        });\n        this._layers.sort(compare2Level('z', '_idx'));\n        const { _active , _lastEvent  } = this;\n        if (_lastEvent) {\n            this._eventHandler(_lastEvent, true);\n        } else if (_active.length) {\n            this._updateHoverStyles(_active, _active, true);\n        }\n        this.render();\n    }\n _updateScales() {\n        each(this.scales, (scale)=>{\n            layouts.removeBox(this, scale);\n        });\n        this.ensureScalesHaveIDs();\n        this.buildOrUpdateScales();\n    }\n _checkEventBindings() {\n        const options = this.options;\n        const existingEvents = new Set(Object.keys(this._listeners));\n        const newEvents = new Set(options.events);\n        if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n            this.unbindEvents();\n            this.bindEvents();\n        }\n    }\n _updateHiddenIndices() {\n        const { _hiddenIndices  } = this;\n        const changes = this._getUniformDataChanges() || [];\n        for (const { method , start , count  } of changes){\n            const move = method === '_removeElements' ? -count : count;\n            moveNumericKeys(_hiddenIndices, start, move);\n        }\n    }\n _getUniformDataChanges() {\n        const _dataChanges = this._dataChanges;\n        if (!_dataChanges || !_dataChanges.length) {\n            return;\n        }\n        this._dataChanges = [];\n        const datasetCount = this.data.datasets.length;\n        const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n        const changeSet = makeSet(0);\n        for(let i = 1; i < datasetCount; i++){\n            if (!setsEqual(changeSet, makeSet(i))) {\n                return;\n            }\n        }\n        return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n                method: a[1],\n                start: +a[2],\n                count: +a[3]\n            }));\n    }\n _updateLayout(minPadding) {\n        if (this.notifyPlugins('beforeLayout', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        layouts.update(this, this.width, this.height, minPadding);\n        const area = this.chartArea;\n        const noArea = area.width <= 0 || area.height <= 0;\n        this._layers = [];\n        each(this.boxes, (box)=>{\n            if (noArea && box.position === 'chartArea') {\n                return;\n            }\n            if (box.configure) {\n                box.configure();\n            }\n            this._layers.push(...box._layers());\n        }, this);\n        this._layers.forEach((item, index)=>{\n            item._idx = index;\n        });\n        this.notifyPlugins('afterLayout');\n    }\n _updateDatasets(mode) {\n        if (this.notifyPlugins('beforeDatasetsUpdate', {\n            mode,\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n            this.getDatasetMeta(i).controller.configure();\n        }\n        for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n            this._updateDataset(i, isFunction(mode) ? mode({\n                datasetIndex: i\n            }) : mode);\n        }\n        this.notifyPlugins('afterDatasetsUpdate', {\n            mode\n        });\n    }\n _updateDataset(index, mode) {\n        const meta = this.getDatasetMeta(index);\n        const args = {\n            meta,\n            index,\n            mode,\n            cancelable: true\n        };\n        if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n            return;\n        }\n        meta.controller._update(mode);\n        args.cancelable = false;\n        this.notifyPlugins('afterDatasetUpdate', args);\n    }\n    render() {\n        if (this.notifyPlugins('beforeRender', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        if (animator.has(this)) {\n            if (this.attached && !animator.running(this)) {\n                animator.start(this);\n            }\n        } else {\n            this.draw();\n            onAnimationsComplete({\n                chart: this\n            });\n        }\n    }\n    draw() {\n        let i;\n        if (this._resizeBeforeDraw) {\n            const { width , height  } = this._resizeBeforeDraw;\n            this._resizeBeforeDraw = null;\n            this._resize(width, height);\n        }\n        this.clear();\n        if (this.width <= 0 || this.height <= 0) {\n            return;\n        }\n        if (this.notifyPlugins('beforeDraw', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        const layers = this._layers;\n        for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n            layers[i].draw(this.chartArea);\n        }\n        this._drawDatasets();\n        for(; i < layers.length; ++i){\n            layers[i].draw(this.chartArea);\n        }\n        this.notifyPlugins('afterDraw');\n    }\n _getSortedDatasetMetas(filterVisible) {\n        const metasets = this._sortedMetasets;\n        const result = [];\n        let i, ilen;\n        for(i = 0, ilen = metasets.length; i < ilen; ++i){\n            const meta = metasets[i];\n            if (!filterVisible || meta.visible) {\n                result.push(meta);\n            }\n        }\n        return result;\n    }\n getSortedVisibleDatasetMetas() {\n        return this._getSortedDatasetMetas(true);\n    }\n _drawDatasets() {\n        if (this.notifyPlugins('beforeDatasetsDraw', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        const metasets = this.getSortedVisibleDatasetMetas();\n        for(let i = metasets.length - 1; i >= 0; --i){\n            this._drawDataset(metasets[i]);\n        }\n        this.notifyPlugins('afterDatasetsDraw');\n    }\n _drawDataset(meta) {\n        const ctx = this.ctx;\n        const clip = meta._clip;\n        const useClip = !clip.disabled;\n        const area = getDatasetArea(meta, this.chartArea);\n        const args = {\n            meta,\n            index: meta.index,\n            cancelable: true\n        };\n        if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n            return;\n        }\n        if (useClip) {\n            clipArea(ctx, {\n                left: clip.left === false ? 0 : area.left - clip.left,\n                right: clip.right === false ? this.width : area.right + clip.right,\n                top: clip.top === false ? 0 : area.top - clip.top,\n                bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n            });\n        }\n        meta.controller.draw();\n        if (useClip) {\n            unclipArea(ctx);\n        }\n        args.cancelable = false;\n        this.notifyPlugins('afterDatasetDraw', args);\n    }\n isPointInArea(point) {\n        return _isPointInArea(point, this.chartArea, this._minPadding);\n    }\n    getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n        const method = Interaction.modes[mode];\n        if (typeof method === 'function') {\n            return method(this, e, options, useFinalPosition);\n        }\n        return [];\n    }\n    getDatasetMeta(datasetIndex) {\n        const dataset = this.data.datasets[datasetIndex];\n        const metasets = this._metasets;\n        let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n        if (!meta) {\n            meta = {\n                type: null,\n                data: [],\n                dataset: null,\n                controller: null,\n                hidden: null,\n                xAxisID: null,\n                yAxisID: null,\n                order: dataset && dataset.order || 0,\n                index: datasetIndex,\n                _dataset: dataset,\n                _parsed: [],\n                _sorted: false\n            };\n            metasets.push(meta);\n        }\n        return meta;\n    }\n    getContext() {\n        return this.$context || (this.$context = createContext(null, {\n            chart: this,\n            type: 'chart'\n        }));\n    }\n    getVisibleDatasetCount() {\n        return this.getSortedVisibleDatasetMetas().length;\n    }\n    isDatasetVisible(datasetIndex) {\n        const dataset = this.data.datasets[datasetIndex];\n        if (!dataset) {\n            return false;\n        }\n        const meta = this.getDatasetMeta(datasetIndex);\n        return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n    }\n    setDatasetVisibility(datasetIndex, visible) {\n        const meta = this.getDatasetMeta(datasetIndex);\n        meta.hidden = !visible;\n    }\n    toggleDataVisibility(index) {\n        this._hiddenIndices[index] = !this._hiddenIndices[index];\n    }\n    getDataVisibility(index) {\n        return !this._hiddenIndices[index];\n    }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n        const mode = visible ? 'show' : 'hide';\n        const meta = this.getDatasetMeta(datasetIndex);\n        const anims = meta.controller._resolveAnimations(undefined, mode);\n        if (defined(dataIndex)) {\n            meta.data[dataIndex].hidden = !visible;\n            this.update();\n        } else {\n            this.setDatasetVisibility(datasetIndex, visible);\n            anims.update(meta, {\n                visible\n            });\n            this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n        }\n    }\n    hide(datasetIndex, dataIndex) {\n        this._updateVisibility(datasetIndex, dataIndex, false);\n    }\n    show(datasetIndex, dataIndex) {\n        this._updateVisibility(datasetIndex, dataIndex, true);\n    }\n _destroyDatasetMeta(datasetIndex) {\n        const meta = this._metasets[datasetIndex];\n        if (meta && meta.controller) {\n            meta.controller._destroy();\n        }\n        delete this._metasets[datasetIndex];\n    }\n    _stop() {\n        let i, ilen;\n        this.stop();\n        animator.remove(this);\n        for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n            this._destroyDatasetMeta(i);\n        }\n    }\n    destroy() {\n        this.notifyPlugins('beforeDestroy');\n        const { canvas , ctx  } = this;\n        this._stop();\n        this.config.clearCache();\n        if (canvas) {\n            this.unbindEvents();\n            clearCanvas(canvas, ctx);\n            this.platform.releaseContext(ctx);\n            this.canvas = null;\n            this.ctx = null;\n        }\n        delete instances[this.id];\n        this.notifyPlugins('afterDestroy');\n    }\n    toBase64Image(...args) {\n        return this.canvas.toDataURL(...args);\n    }\n bindEvents() {\n        this.bindUserEvents();\n        if (this.options.responsive) {\n            this.bindResponsiveEvents();\n        } else {\n            this.attached = true;\n        }\n    }\n bindUserEvents() {\n        const listeners = this._listeners;\n        const platform = this.platform;\n        const _add = (type, listener)=>{\n            platform.addEventListener(this, type, listener);\n            listeners[type] = listener;\n        };\n        const listener = (e, x, y)=>{\n            e.offsetX = x;\n            e.offsetY = y;\n            this._eventHandler(e);\n        };\n        each(this.options.events, (type)=>_add(type, listener));\n    }\n bindResponsiveEvents() {\n        if (!this._responsiveListeners) {\n            this._responsiveListeners = {};\n        }\n        const listeners = this._responsiveListeners;\n        const platform = this.platform;\n        const _add = (type, listener)=>{\n            platform.addEventListener(this, type, listener);\n            listeners[type] = listener;\n        };\n        const _remove = (type, listener)=>{\n            if (listeners[type]) {\n                platform.removeEventListener(this, type, listener);\n                delete listeners[type];\n            }\n        };\n        const listener = (width, height)=>{\n            if (this.canvas) {\n                this.resize(width, height);\n            }\n        };\n        let detached;\n        const attached = ()=>{\n            _remove('attach', attached);\n            this.attached = true;\n            this.resize();\n            _add('resize', listener);\n            _add('detach', detached);\n        };\n        detached = ()=>{\n            this.attached = false;\n            _remove('resize', listener);\n            this._stop();\n            this._resize(0, 0);\n            _add('attach', attached);\n        };\n        if (platform.isAttached(this.canvas)) {\n            attached();\n        } else {\n            detached();\n        }\n    }\n unbindEvents() {\n        each(this._listeners, (listener, type)=>{\n            this.platform.removeEventListener(this, type, listener);\n        });\n        this._listeners = {};\n        each(this._responsiveListeners, (listener, type)=>{\n            this.platform.removeEventListener(this, type, listener);\n        });\n        this._responsiveListeners = undefined;\n    }\n    updateHoverStyle(items, mode, enabled) {\n        const prefix = enabled ? 'set' : 'remove';\n        let meta, item, i, ilen;\n        if (mode === 'dataset') {\n            meta = this.getDatasetMeta(items[0].datasetIndex);\n            meta.controller['_' + prefix + 'DatasetHoverStyle']();\n        }\n        for(i = 0, ilen = items.length; i < ilen; ++i){\n            item = items[i];\n            const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n            if (controller) {\n                controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n            }\n        }\n    }\n getActiveElements() {\n        return this._active || [];\n    }\n setActiveElements(activeElements) {\n        const lastActive = this._active || [];\n        const active = activeElements.map(({ datasetIndex , index  })=>{\n            const meta = this.getDatasetMeta(datasetIndex);\n            if (!meta) {\n                throw new Error('No dataset found at index ' + datasetIndex);\n            }\n            return {\n                datasetIndex,\n                element: meta.data[index],\n                index\n            };\n        });\n        const changed = !_elementsEqual(active, lastActive);\n        if (changed) {\n            this._active = active;\n            this._lastEvent = null;\n            this._updateHoverStyles(active, lastActive);\n        }\n    }\n notifyPlugins(hook, args, filter) {\n        return this._plugins.notify(this, hook, args, filter);\n    }\n isPluginEnabled(pluginId) {\n        return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n    }\n _updateHoverStyles(active, lastActive, replay) {\n        const hoverOptions = this.options.hover;\n        const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n        const deactivated = diff(lastActive, active);\n        const activated = replay ? active : diff(active, lastActive);\n        if (deactivated.length) {\n            this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n        }\n        if (activated.length && hoverOptions.mode) {\n            this.updateHoverStyle(activated, hoverOptions.mode, true);\n        }\n    }\n _eventHandler(e, replay) {\n        const args = {\n            event: e,\n            replay,\n            cancelable: true,\n            inChartArea: this.isPointInArea(e)\n        };\n        const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n        if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n            return;\n        }\n        const changed = this._handleEvent(e, replay, args.inChartArea);\n        args.cancelable = false;\n        this.notifyPlugins('afterEvent', args, eventFilter);\n        if (changed || args.changed) {\n            this.render();\n        }\n        return this;\n    }\n _handleEvent(e, replay, inChartArea) {\n        const { _active: lastActive = [] , options  } = this;\n        const useFinalPosition = replay;\n        const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n        const isClick = _isClickEvent(e);\n        const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n        if (inChartArea) {\n            this._lastEvent = null;\n            callback(options.onHover, [\n                e,\n                active,\n                this\n            ], this);\n            if (isClick) {\n                callback(options.onClick, [\n                    e,\n                    active,\n                    this\n                ], this);\n            }\n        }\n        const changed = !_elementsEqual(active, lastActive);\n        if (changed || replay) {\n            this._active = active;\n            this._updateHoverStyles(active, lastActive, replay);\n        }\n        this._lastEvent = lastEvent;\n        return changed;\n    }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n        if (e.type === 'mouseout') {\n            return [];\n        }\n        if (!inChartArea) {\n            return lastActive;\n        }\n        const hoverOptions = this.options.hover;\n        return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n    }\n}\nfunction invalidatePlugins() {\n    return each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipArc(ctx, element, endAngle) {\n    const { startAngle , pixelMargin , x , y , outerRadius , innerRadius  } = element;\n    let angleMargin = pixelMargin / outerRadius;\n    // Draw an inner border by clipping the arc and drawing a double-width border\n    // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n    ctx.beginPath();\n    ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n    if (innerRadius > pixelMargin) {\n        angleMargin = pixelMargin / innerRadius;\n        ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n    } else {\n        ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n    }\n    ctx.closePath();\n    ctx.clip();\n}\nfunction toRadiusCorners(value) {\n    return _readValueToProps(value, [\n        'outerStart',\n        'outerEnd',\n        'innerStart',\n        'innerEnd'\n    ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n    const o = toRadiusCorners(arc.options.borderRadius);\n    const halfThickness = (outerRadius - innerRadius) / 2;\n    const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n    // Outer limits are complicated. We want to compute the available angular distance at\n    // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n    // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n    //\n    // If the borderRadius is large, that value can become negative.\n    // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n    // we know that the thickness term will dominate and compute the limits at that point\n    const computeOuterLimit = (val)=>{\n        const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n        return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n    };\n    return {\n        outerStart: computeOuterLimit(o.outerStart),\n        outerEnd: computeOuterLimit(o.outerEnd),\n        innerStart: _limitValue(o.innerStart, 0, innerLimit),\n        innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n    };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n    return {\n        x: x + r * Math.cos(theta),\n        y: y + r * Math.sin(theta)\n    };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n *   Start      End\n *\n *    1--->a--->2    Outer\n *   /           \\\n *   8           3\n *   |           |\n *   |           |\n *   7           4\n *   \\           /\n *    6<---b<---5    Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n    const { x , y , startAngle: start , pixelMargin , innerRadius: innerR  } = element;\n    const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n    const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n    let spacingOffset = 0;\n    const alpha = end - start;\n    if (spacing) {\n        // When spacing is present, it is the same for all items\n        // So we adjust the start and end angle of the arc such that\n        // the distance is the same as it would be without the spacing\n        const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n        const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n        const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n        const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n        spacingOffset = (alpha - adjustedAngle) / 2;\n    }\n    const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n    const angleOffset = (alpha - beta) / 2;\n    const startAngle = start + angleOffset + spacingOffset;\n    const endAngle = end - angleOffset - spacingOffset;\n    const { outerStart , outerEnd , innerStart , innerEnd  } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n    const outerStartAdjustedRadius = outerRadius - outerStart;\n    const outerEndAdjustedRadius = outerRadius - outerEnd;\n    const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n    const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n    const innerStartAdjustedRadius = innerRadius + innerStart;\n    const innerEndAdjustedRadius = innerRadius + innerEnd;\n    const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n    const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n    ctx.beginPath();\n    if (circular) {\n        // The first arc segments from point 1 to point a to point 2\n        const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n        ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n        ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n        // The corner segment from point 2 to point 3\n        if (outerEnd > 0) {\n            const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n        }\n        // The line from point 3 to point 4\n        const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n        ctx.lineTo(p4.x, p4.y);\n        // The corner segment from point 4 to point 5\n        if (innerEnd > 0) {\n            const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n        }\n        // The inner arc from point 5 to point b to point 6\n        const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n        ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n        ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n        // The corner segment from point 6 to point 7\n        if (innerStart > 0) {\n            const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n        }\n        // The line from point 7 to point 8\n        const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n        ctx.lineTo(p8.x, p8.y);\n        // The corner segment from point 8 to point 1\n        if (outerStart > 0) {\n            const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n        }\n    } else {\n        ctx.moveTo(x, y);\n        const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n        const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n        ctx.lineTo(outerStartX, outerStartY);\n        const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n        const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n        ctx.lineTo(outerEndX, outerEndY);\n    }\n    ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n    const { fullCircles , startAngle , circumference  } = element;\n    let endAngle = element.endAngle;\n    if (fullCircles) {\n        pathArc(ctx, element, offset, spacing, endAngle, circular);\n        for(let i = 0; i < fullCircles; ++i){\n            ctx.fill();\n        }\n        if (!isNaN(circumference)) {\n            endAngle = startAngle + (circumference % TAU || TAU);\n        }\n    }\n    pathArc(ctx, element, offset, spacing, endAngle, circular);\n    ctx.fill();\n    return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n    const { fullCircles , startAngle , circumference , options  } = element;\n    const { borderWidth , borderJoinStyle , borderDash , borderDashOffset  } = options;\n    const inner = options.borderAlign === 'inner';\n    if (!borderWidth) {\n        return;\n    }\n    ctx.setLineDash(borderDash || []);\n    ctx.lineDashOffset = borderDashOffset;\n    if (inner) {\n        ctx.lineWidth = borderWidth * 2;\n        ctx.lineJoin = borderJoinStyle || 'round';\n    } else {\n        ctx.lineWidth = borderWidth;\n        ctx.lineJoin = borderJoinStyle || 'bevel';\n    }\n    let endAngle = element.endAngle;\n    if (fullCircles) {\n        pathArc(ctx, element, offset, spacing, endAngle, circular);\n        for(let i = 0; i < fullCircles; ++i){\n            ctx.stroke();\n        }\n        if (!isNaN(circumference)) {\n            endAngle = startAngle + (circumference % TAU || TAU);\n        }\n    }\n    if (inner) {\n        clipArc(ctx, element, endAngle);\n    }\n    if (!fullCircles) {\n        pathArc(ctx, element, offset, spacing, endAngle, circular);\n        ctx.stroke();\n    }\n}\nclass ArcElement extends Element {\n    static id = 'arc';\n    static defaults = {\n        borderAlign: 'center',\n        borderColor: '#fff',\n        borderDash: [],\n        borderDashOffset: 0,\n        borderJoinStyle: undefined,\n        borderRadius: 0,\n        borderWidth: 2,\n        offset: 0,\n        spacing: 0,\n        angle: undefined,\n        circular: true\n    };\n    static defaultRoutes = {\n        backgroundColor: 'backgroundColor'\n    };\n    static descriptors = {\n        _scriptable: true,\n        _indexable: (name)=>name !== 'borderDash'\n    };\n    circumference;\n    endAngle;\n    fullCircles;\n    innerRadius;\n    outerRadius;\n    pixelMargin;\n    startAngle;\n    constructor(cfg){\n        super();\n        this.options = undefined;\n        this.circumference = undefined;\n        this.startAngle = undefined;\n        this.endAngle = undefined;\n        this.innerRadius = undefined;\n        this.outerRadius = undefined;\n        this.pixelMargin = 0;\n        this.fullCircles = 0;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    inRange(chartX, chartY, useFinalPosition) {\n        const point = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        const { angle , distance  } = getAngleFromPoint(point, {\n            x: chartX,\n            y: chartY\n        });\n        const { startAngle , endAngle , innerRadius , outerRadius , circumference  } = this.getProps([\n            'startAngle',\n            'endAngle',\n            'innerRadius',\n            'outerRadius',\n            'circumference'\n        ], useFinalPosition);\n        const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n        const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n        const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n        const betweenAngles = _circumference >= TAU || nonZeroBetween;\n        const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n        return betweenAngles && withinRadius;\n    }\n    getCenterPoint(useFinalPosition) {\n        const { x , y , startAngle , endAngle , innerRadius , outerRadius  } = this.getProps([\n            'x',\n            'y',\n            'startAngle',\n            'endAngle',\n            'innerRadius',\n            'outerRadius'\n        ], useFinalPosition);\n        const { offset , spacing  } = this.options;\n        const halfAngle = (startAngle + endAngle) / 2;\n        const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n        return {\n            x: x + Math.cos(halfAngle) * halfRadius,\n            y: y + Math.sin(halfAngle) * halfRadius\n        };\n    }\n    tooltipPosition(useFinalPosition) {\n        return this.getCenterPoint(useFinalPosition);\n    }\n    draw(ctx) {\n        const { options , circumference  } = this;\n        const offset = (options.offset || 0) / 4;\n        const spacing = (options.spacing || 0) / 2;\n        const circular = options.circular;\n        this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n        this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n        if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n            return;\n        }\n        ctx.save();\n        const halfAngle = (this.startAngle + this.endAngle) / 2;\n        ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n        const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n        const radiusOffset = offset * fix;\n        ctx.fillStyle = options.backgroundColor;\n        ctx.strokeStyle = options.borderColor;\n        drawArc(ctx, this, radiusOffset, spacing, circular);\n        drawBorder(ctx, this, radiusOffset, spacing, circular);\n        ctx.restore();\n    }\n}\n\nfunction setStyle(ctx, options, style = options) {\n    ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n    ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n    ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n    ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n    ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n    ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n    ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n    if (options.stepped) {\n        return _steppedLineTo;\n    }\n    if (options.tension || options.cubicInterpolationMode === 'monotone') {\n        return _bezierCurveTo;\n    }\n    return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n    const count = points.length;\n    const { start: paramsStart = 0 , end: paramsEnd = count - 1  } = params;\n    const { start: segmentStart , end: segmentEnd  } = segment;\n    const start = Math.max(paramsStart, segmentStart);\n    const end = Math.min(paramsEnd, segmentEnd);\n    const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n    return {\n        count,\n        start,\n        loop: segment.loop,\n        ilen: end < start && !outside ? count + end - start : end - start\n    };\n}\n function pathSegment(ctx, line, segment, params) {\n    const { points , options  } = line;\n    const { count , start , loop , ilen  } = pathVars(points, segment, params);\n    const lineMethod = getLineMethod(options);\n    let { move =true , reverse  } = params || {};\n    let i, point, prev;\n    for(i = 0; i <= ilen; ++i){\n        point = points[(start + (reverse ? ilen - i : i)) % count];\n        if (point.skip) {\n            continue;\n        } else if (move) {\n            ctx.moveTo(point.x, point.y);\n            move = false;\n        } else {\n            lineMethod(ctx, prev, point, reverse, options.stepped);\n        }\n        prev = point;\n    }\n    if (loop) {\n        point = points[(start + (reverse ? ilen : 0)) % count];\n        lineMethod(ctx, prev, point, reverse, options.stepped);\n    }\n    return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n    const points = line.points;\n    const { count , start , ilen  } = pathVars(points, segment, params);\n    const { move =true , reverse  } = params || {};\n    let avgX = 0;\n    let countX = 0;\n    let i, point, prevX, minY, maxY, lastY;\n    const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n    const drawX = ()=>{\n        if (minY !== maxY) {\n            ctx.lineTo(avgX, maxY);\n            ctx.lineTo(avgX, minY);\n            ctx.lineTo(avgX, lastY);\n        }\n    };\n    if (move) {\n        point = points[pointIndex(0)];\n        ctx.moveTo(point.x, point.y);\n    }\n    for(i = 0; i <= ilen; ++i){\n        point = points[pointIndex(i)];\n        if (point.skip) {\n            continue;\n        }\n        const x = point.x;\n        const y = point.y;\n        const truncX = x | 0;\n        if (truncX === prevX) {\n            if (y < minY) {\n                minY = y;\n            } else if (y > maxY) {\n                maxY = y;\n            }\n            avgX = (countX * avgX + x) / ++countX;\n        } else {\n            drawX();\n            ctx.lineTo(x, y);\n            prevX = truncX;\n            countX = 0;\n            minY = maxY = y;\n        }\n        lastY = y;\n    }\n    drawX();\n}\n function _getSegmentMethod(line) {\n    const opts = line.options;\n    const borderDash = opts.borderDash && opts.borderDash.length;\n    const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n    return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n    if (options.stepped) {\n        return _steppedInterpolation;\n    }\n    if (options.tension || options.cubicInterpolationMode === 'monotone') {\n        return _bezierInterpolation;\n    }\n    return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n    let path = line._path;\n    if (!path) {\n        path = line._path = new Path2D();\n        if (line.path(path, start, count)) {\n            path.closePath();\n        }\n    }\n    setStyle(ctx, line.options);\n    ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n    const { segments , options  } = line;\n    const segmentMethod = _getSegmentMethod(line);\n    for (const segment of segments){\n        setStyle(ctx, options, segment.style);\n        ctx.beginPath();\n        if (segmentMethod(ctx, line, segment, {\n            start,\n            end: start + count - 1\n        })) {\n            ctx.closePath();\n        }\n        ctx.stroke();\n    }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n    if (usePath2D && !line.options.segment) {\n        strokePathWithCache(ctx, line, start, count);\n    } else {\n        strokePathDirect(ctx, line, start, count);\n    }\n}\nclass LineElement extends Element {\n    static id = 'line';\n static defaults = {\n        borderCapStyle: 'butt',\n        borderDash: [],\n        borderDashOffset: 0,\n        borderJoinStyle: 'miter',\n        borderWidth: 3,\n        capBezierPoints: true,\n        cubicInterpolationMode: 'default',\n        fill: false,\n        spanGaps: false,\n        stepped: false,\n        tension: 0\n    };\n static defaultRoutes = {\n        backgroundColor: 'backgroundColor',\n        borderColor: 'borderColor'\n    };\n    static descriptors = {\n        _scriptable: true,\n        _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n    };\n    constructor(cfg){\n        super();\n        this.animated = true;\n        this.options = undefined;\n        this._chart = undefined;\n        this._loop = undefined;\n        this._fullLoop = undefined;\n        this._path = undefined;\n        this._points = undefined;\n        this._segments = undefined;\n        this._decimated = false;\n        this._pointsUpdated = false;\n        this._datasetIndex = undefined;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    updateControlPoints(chartArea, indexAxis) {\n        const options = this.options;\n        if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n            const loop = options.spanGaps ? this._loop : this._fullLoop;\n            _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n            this._pointsUpdated = true;\n        }\n    }\n    set points(points) {\n        this._points = points;\n        delete this._segments;\n        delete this._path;\n        this._pointsUpdated = false;\n    }\n    get points() {\n        return this._points;\n    }\n    get segments() {\n        return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n    }\n first() {\n        const segments = this.segments;\n        const points = this.points;\n        return segments.length && points[segments[0].start];\n    }\n last() {\n        const segments = this.segments;\n        const points = this.points;\n        const count = segments.length;\n        return count && points[segments[count - 1].end];\n    }\n interpolate(point, property) {\n        const options = this.options;\n        const value = point[property];\n        const points = this.points;\n        const segments = _boundSegments(this, {\n            property,\n            start: value,\n            end: value\n        });\n        if (!segments.length) {\n            return;\n        }\n        const result = [];\n        const _interpolate = _getInterpolationMethod(options);\n        let i, ilen;\n        for(i = 0, ilen = segments.length; i < ilen; ++i){\n            const { start , end  } = segments[i];\n            const p1 = points[start];\n            const p2 = points[end];\n            if (p1 === p2) {\n                result.push(p1);\n                continue;\n            }\n            const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n            const interpolated = _interpolate(p1, p2, t, options.stepped);\n            interpolated[property] = point[property];\n            result.push(interpolated);\n        }\n        return result.length === 1 ? result[0] : result;\n    }\n pathSegment(ctx, segment, params) {\n        const segmentMethod = _getSegmentMethod(this);\n        return segmentMethod(ctx, this, segment, params);\n    }\n path(ctx, start, count) {\n        const segments = this.segments;\n        const segmentMethod = _getSegmentMethod(this);\n        let loop = this._loop;\n        start = start || 0;\n        count = count || this.points.length - start;\n        for (const segment of segments){\n            loop &= segmentMethod(ctx, this, segment, {\n                start,\n                end: start + count - 1\n            });\n        }\n        return !!loop;\n    }\n draw(ctx, chartArea, start, count) {\n        const options = this.options || {};\n        const points = this.points || [];\n        if (points.length && options.borderWidth) {\n            ctx.save();\n            draw(ctx, this, start, count);\n            ctx.restore();\n        }\n        if (this.animated) {\n            this._pointsUpdated = false;\n            this._path = undefined;\n        }\n    }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n    const options = el.options;\n    const { [axis]: value  } = el.getProps([\n        axis\n    ], useFinalPosition);\n    return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n    static id = 'point';\n    parsed;\n    skip;\n    stop;\n    /**\n   * @type {any}\n   */ static defaults = {\n        borderWidth: 1,\n        hitRadius: 1,\n        hoverBorderWidth: 1,\n        hoverRadius: 4,\n        pointStyle: 'circle',\n        radius: 3,\n        rotation: 0\n    };\n    /**\n   * @type {any}\n   */ static defaultRoutes = {\n        backgroundColor: 'backgroundColor',\n        borderColor: 'borderColor'\n    };\n    constructor(cfg){\n        super();\n        this.options = undefined;\n        this.parsed = undefined;\n        this.skip = undefined;\n        this.stop = undefined;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    inRange(mouseX, mouseY, useFinalPosition) {\n        const options = this.options;\n        const { x , y  } = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n    }\n    inXRange(mouseX, useFinalPosition) {\n        return inRange$1(this, mouseX, 'x', useFinalPosition);\n    }\n    inYRange(mouseY, useFinalPosition) {\n        return inRange$1(this, mouseY, 'y', useFinalPosition);\n    }\n    getCenterPoint(useFinalPosition) {\n        const { x , y  } = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        return {\n            x,\n            y\n        };\n    }\n    size(options) {\n        options = options || this.options || {};\n        let radius = options.radius || 0;\n        radius = Math.max(radius, radius && options.hoverRadius || 0);\n        const borderWidth = radius && options.borderWidth || 0;\n        return (radius + borderWidth) * 2;\n    }\n    draw(ctx, area) {\n        const options = this.options;\n        if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n            return;\n        }\n        ctx.strokeStyle = options.borderColor;\n        ctx.lineWidth = options.borderWidth;\n        ctx.fillStyle = options.backgroundColor;\n        drawPoint(ctx, options, this.x, this.y);\n    }\n    getRange() {\n        const options = this.options || {};\n        // @ts-expect-error Fallbacks should never be hit in practice\n        return options.radius + options.hitRadius;\n    }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n    const { x , y , base , width , height  } =  bar.getProps([\n        'x',\n        'y',\n        'base',\n        'width',\n        'height'\n    ], useFinalPosition);\n    let left, right, top, bottom, half;\n    if (bar.horizontal) {\n        half = height / 2;\n        left = Math.min(x, base);\n        right = Math.max(x, base);\n        top = y - half;\n        bottom = y + half;\n    } else {\n        half = width / 2;\n        left = x - half;\n        right = x + half;\n        top = Math.min(y, base);\n        bottom = Math.max(y, base);\n    }\n    return {\n        left,\n        top,\n        right,\n        bottom\n    };\n}\nfunction skipOrLimit(skip, value, min, max) {\n    return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n    const value = bar.options.borderWidth;\n    const skip = bar.borderSkipped;\n    const o = toTRBL(value);\n    return {\n        t: skipOrLimit(skip.top, o.top, 0, maxH),\n        r: skipOrLimit(skip.right, o.right, 0, maxW),\n        b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n        l: skipOrLimit(skip.left, o.left, 0, maxW)\n    };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n    const { enableBorderRadius  } = bar.getProps([\n        'enableBorderRadius'\n    ]);\n    const value = bar.options.borderRadius;\n    const o = toTRBLCorners(value);\n    const maxR = Math.min(maxW, maxH);\n    const skip = bar.borderSkipped;\n    const enableBorder = enableBorderRadius || isObject(value);\n    return {\n        topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n        topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n        bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n        bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n    };\n}\nfunction boundingRects(bar) {\n    const bounds = getBarBounds(bar);\n    const width = bounds.right - bounds.left;\n    const height = bounds.bottom - bounds.top;\n    const border = parseBorderWidth(bar, width / 2, height / 2);\n    const radius = parseBorderRadius(bar, width / 2, height / 2);\n    return {\n        outer: {\n            x: bounds.left,\n            y: bounds.top,\n            w: width,\n            h: height,\n            radius\n        },\n        inner: {\n            x: bounds.left + border.l,\n            y: bounds.top + border.t,\n            w: width - border.l - border.r,\n            h: height - border.t - border.b,\n            radius: {\n                topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n                topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n                bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n                bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n            }\n        }\n    };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n    const skipX = x === null;\n    const skipY = y === null;\n    const skipBoth = skipX && skipY;\n    const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n    return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n    return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n    ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n    const x = rect.x !== refRect.x ? -amount : 0;\n    const y = rect.y !== refRect.y ? -amount : 0;\n    const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n    const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n    return {\n        x: rect.x + x,\n        y: rect.y + y,\n        w: rect.w + w,\n        h: rect.h + h,\n        radius: rect.radius\n    };\n}\nclass BarElement extends Element {\n    static id = 'bar';\n static defaults = {\n        borderSkipped: 'start',\n        borderWidth: 0,\n        borderRadius: 0,\n        inflateAmount: 'auto',\n        pointStyle: undefined\n    };\n static defaultRoutes = {\n        backgroundColor: 'backgroundColor',\n        borderColor: 'borderColor'\n    };\n    constructor(cfg){\n        super();\n        this.options = undefined;\n        this.horizontal = undefined;\n        this.base = undefined;\n        this.width = undefined;\n        this.height = undefined;\n        this.inflateAmount = undefined;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    draw(ctx) {\n        const { inflateAmount , options: { borderColor , backgroundColor  }  } = this;\n        const { inner , outer  } = boundingRects(this);\n        const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n        ctx.save();\n        if (outer.w !== inner.w || outer.h !== inner.h) {\n            ctx.beginPath();\n            addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n            ctx.clip();\n            addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n            ctx.fillStyle = borderColor;\n            ctx.fill('evenodd');\n        }\n        ctx.beginPath();\n        addRectPath(ctx, inflateRect(inner, inflateAmount));\n        ctx.fillStyle = backgroundColor;\n        ctx.fill();\n        ctx.restore();\n    }\n    inRange(mouseX, mouseY, useFinalPosition) {\n        return inRange(this, mouseX, mouseY, useFinalPosition);\n    }\n    inXRange(mouseX, useFinalPosition) {\n        return inRange(this, mouseX, null, useFinalPosition);\n    }\n    inYRange(mouseY, useFinalPosition) {\n        return inRange(this, null, mouseY, useFinalPosition);\n    }\n    getCenterPoint(useFinalPosition) {\n        const { x , y , base , horizontal  } =  this.getProps([\n            'x',\n            'y',\n            'base',\n            'horizontal'\n        ], useFinalPosition);\n        return {\n            x: horizontal ? (x + base) / 2 : x,\n            y: horizontal ? y : (y + base) / 2\n        };\n    }\n    getRange(axis) {\n        return axis === 'x' ? this.width / 2 : this.height / 2;\n    }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n    'rgb(54, 162, 235)',\n    'rgb(255, 99, 132)',\n    'rgb(255, 159, 64)',\n    'rgb(255, 205, 86)',\n    'rgb(75, 192, 192)',\n    'rgb(153, 102, 255)',\n    'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n    return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n    return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n    dataset.borderColor = getBorderColor(i);\n    dataset.backgroundColor = getBackgroundColor(i);\n    return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n    dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n    return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n    dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n    return i;\n}\nfunction getColorizer(chart) {\n    let i = 0;\n    return (dataset, datasetIndex)=>{\n        const controller = chart.getDatasetMeta(datasetIndex).controller;\n        if (controller instanceof DoughnutController) {\n            i = colorizeDoughnutDataset(dataset, i);\n        } else if (controller instanceof PolarAreaController) {\n            i = colorizePolarAreaDataset(dataset, i);\n        } else if (controller) {\n            i = colorizeDefaultDataset(dataset, i);\n        }\n    };\n}\nfunction containsColorsDefinitions(descriptors) {\n    let k;\n    for(k in descriptors){\n        if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction containsColorsDefinition(descriptor) {\n    return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n    return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n    id: 'colors',\n    defaults: {\n        enabled: true,\n        forceOverride: false\n    },\n    beforeLayout (chart, _args, options) {\n        if (!options.enabled) {\n            return;\n        }\n        const { data: { datasets  } , options: chartOptions  } = chart.config;\n        const { elements  } = chartOptions;\n        const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n        if (!options.forceOverride && containsColorDefenition) {\n            return;\n        }\n        const colorizer = getColorizer(chart);\n        datasets.forEach(colorizer);\n    }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n    if (samples >= count) {\n        return data.slice(start, start + count);\n    }\n    const decimated = [];\n    const bucketWidth = (count - 2) / (samples - 2);\n    let sampledIndex = 0;\n    const endIndex = start + count - 1;\n    let a = start;\n    let i, maxAreaPoint, maxArea, area, nextA;\n    decimated[sampledIndex++] = data[a];\n    for(i = 0; i < samples - 2; i++){\n        let avgX = 0;\n        let avgY = 0;\n        let j;\n        const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n        const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n        const avgRangeLength = avgRangeEnd - avgRangeStart;\n        for(j = avgRangeStart; j < avgRangeEnd; j++){\n            avgX += data[j].x;\n            avgY += data[j].y;\n        }\n        avgX /= avgRangeLength;\n        avgY /= avgRangeLength;\n        const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n        const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n        const { x: pointAx , y: pointAy  } = data[a];\n        maxArea = area = -1;\n        for(j = rangeOffs; j < rangeTo; j++){\n            area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n            if (area > maxArea) {\n                maxArea = area;\n                maxAreaPoint = data[j];\n                nextA = j;\n            }\n        }\n        decimated[sampledIndex++] = maxAreaPoint;\n        a = nextA;\n    }\n    decimated[sampledIndex++] = data[endIndex];\n    return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n    let avgX = 0;\n    let countX = 0;\n    let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n    const decimated = [];\n    const endIndex = start + count - 1;\n    const xMin = data[start].x;\n    const xMax = data[endIndex].x;\n    const dx = xMax - xMin;\n    for(i = start; i < start + count; ++i){\n        point = data[i];\n        x = (point.x - xMin) / dx * availableWidth;\n        y = point.y;\n        const truncX = x | 0;\n        if (truncX === prevX) {\n            if (y < minY) {\n                minY = y;\n                minIndex = i;\n            } else if (y > maxY) {\n                maxY = y;\n                maxIndex = i;\n            }\n            avgX = (countX * avgX + point.x) / ++countX;\n        } else {\n            const lastIndex = i - 1;\n            if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n                const intermediateIndex1 = Math.min(minIndex, maxIndex);\n                const intermediateIndex2 = Math.max(minIndex, maxIndex);\n                if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n                    decimated.push({\n                        ...data[intermediateIndex1],\n                        x: avgX\n                    });\n                }\n                if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n                    decimated.push({\n                        ...data[intermediateIndex2],\n                        x: avgX\n                    });\n                }\n            }\n            if (i > 0 && lastIndex !== startIndex) {\n                decimated.push(data[lastIndex]);\n            }\n            decimated.push(point);\n            prevX = truncX;\n            countX = 0;\n            minY = maxY = y;\n            minIndex = maxIndex = startIndex = i;\n        }\n    }\n    return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n    if (dataset._decimated) {\n        const data = dataset._data;\n        delete dataset._decimated;\n        delete dataset._data;\n        Object.defineProperty(dataset, 'data', {\n            configurable: true,\n            enumerable: true,\n            writable: true,\n            value: data\n        });\n    }\n}\nfunction cleanDecimatedData(chart) {\n    chart.data.datasets.forEach((dataset)=>{\n        cleanDecimatedDataset(dataset);\n    });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n    const pointCount = points.length;\n    let start = 0;\n    let count;\n    const { iScale  } = meta;\n    const { min , max , minDefined , maxDefined  } = iScale.getUserBounds();\n    if (minDefined) {\n        start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n    }\n    if (maxDefined) {\n        count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n    } else {\n        count = pointCount - start;\n    }\n    return {\n        start,\n        count\n    };\n}\nvar plugin_decimation = {\n    id: 'decimation',\n    defaults: {\n        algorithm: 'min-max',\n        enabled: false\n    },\n    beforeElementsUpdate: (chart, args, options)=>{\n        if (!options.enabled) {\n            cleanDecimatedData(chart);\n            return;\n        }\n        const availableWidth = chart.width;\n        chart.data.datasets.forEach((dataset, datasetIndex)=>{\n            const { _data , indexAxis  } = dataset;\n            const meta = chart.getDatasetMeta(datasetIndex);\n            const data = _data || dataset.data;\n            if (resolve([\n                indexAxis,\n                chart.options.indexAxis\n            ]) === 'y') {\n                return;\n            }\n            if (!meta.controller.supportsDecimation) {\n                return;\n            }\n            const xAxis = chart.scales[meta.xAxisID];\n            if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n                return;\n            }\n            if (chart.options.parsing) {\n                return;\n            }\n            let { start , count  } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n            const threshold = options.threshold || 4 * availableWidth;\n            if (count <= threshold) {\n                cleanDecimatedDataset(dataset);\n                return;\n            }\n            if (isNullOrUndef(_data)) {\n                dataset._data = data;\n                delete dataset.data;\n                Object.defineProperty(dataset, 'data', {\n                    configurable: true,\n                    enumerable: true,\n                    get: function() {\n                        return this._decimated;\n                    },\n                    set: function(d) {\n                        this._data = d;\n                    }\n                });\n            }\n            let decimated;\n            switch(options.algorithm){\n                case 'lttb':\n                    decimated = lttbDecimation(data, start, count, availableWidth, options);\n                    break;\n                case 'min-max':\n                    decimated = minMaxDecimation(data, start, count, availableWidth);\n                    break;\n                default:\n                    throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n            }\n            dataset._decimated = decimated;\n        });\n    },\n    destroy (chart) {\n        cleanDecimatedData(chart);\n    }\n};\n\nfunction _segments(line, target, property) {\n    const segments = line.segments;\n    const points = line.points;\n    const tpoints = target.points;\n    const parts = [];\n    for (const segment of segments){\n        let { start , end  } = segment;\n        end = _findSegmentEnd(start, end, points);\n        const bounds = _getBounds(property, points[start], points[end], segment.loop);\n        if (!target.segments) {\n            parts.push({\n                source: segment,\n                target: bounds,\n                start: points[start],\n                end: points[end]\n            });\n            continue;\n        }\n        const targetSegments = _boundSegments(target, bounds);\n        for (const tgt of targetSegments){\n            const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n            const fillSources = _boundSegment(segment, points, subBounds);\n            for (const fillSource of fillSources){\n                parts.push({\n                    source: fillSource,\n                    target: tgt,\n                    start: {\n                        [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n                    },\n                    end: {\n                        [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n                    }\n                });\n            }\n        }\n    }\n    return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n    if (loop) {\n        return;\n    }\n    let start = first[property];\n    let end = last[property];\n    if (property === 'angle') {\n        start = _normalizeAngle(start);\n        end = _normalizeAngle(end);\n    }\n    return {\n        property,\n        start,\n        end\n    };\n}\nfunction _pointsFromSegments(boundary, line) {\n    const { x =null , y =null  } = boundary || {};\n    const linePoints = line.points;\n    const points = [];\n    line.segments.forEach(({ start , end  })=>{\n        end = _findSegmentEnd(start, end, linePoints);\n        const first = linePoints[start];\n        const last = linePoints[end];\n        if (y !== null) {\n            points.push({\n                x: first.x,\n                y\n            });\n            points.push({\n                x: last.x,\n                y\n            });\n        } else if (x !== null) {\n            points.push({\n                x,\n                y: first.y\n            });\n            points.push({\n                x,\n                y: last.y\n            });\n        }\n    });\n    return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n    for(; end > start; end--){\n        const point = points[end];\n        if (!isNaN(point.x) && !isNaN(point.y)) {\n            break;\n        }\n    }\n    return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n    if (a && b) {\n        return fn(a[prop], b[prop]);\n    }\n    return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n    let points = [];\n    let _loop = false;\n    if (isArray(boundary)) {\n        _loop = true;\n        points = boundary;\n    } else {\n        points = _pointsFromSegments(boundary, line);\n    }\n    return points.length ? new LineElement({\n        points,\n        options: {\n            tension: 0\n        },\n        _loop,\n        _fullLoop: _loop\n    }) : null;\n}\nfunction _shouldApplyFill(source) {\n    return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n    const source = sources[index];\n    let fill = source.fill;\n    const visited = [\n        index\n    ];\n    let target;\n    if (!propagate) {\n        return fill;\n    }\n    while(fill !== false && visited.indexOf(fill) === -1){\n        if (!isNumberFinite(fill)) {\n            return fill;\n        }\n        target = sources[fill];\n        if (!target) {\n            return false;\n        }\n        if (target.visible) {\n            return fill;\n        }\n        visited.push(fill);\n        fill = target.fill;\n    }\n    return false;\n}\n function _decodeFill(line, index, count) {\n     const fill = parseFillOption(line);\n    if (isObject(fill)) {\n        return isNaN(fill.value) ? false : fill;\n    }\n    let target = parseFloat(fill);\n    if (isNumberFinite(target) && Math.floor(target) === target) {\n        return decodeTargetIndex(fill[0], index, target, count);\n    }\n    return [\n        'origin',\n        'start',\n        'end',\n        'stack',\n        'shape'\n    ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n    if (firstCh === '-' || firstCh === '+') {\n        target = index + target;\n    }\n    if (target === index || target < 0 || target >= count) {\n        return false;\n    }\n    return target;\n}\n function _getTargetPixel(fill, scale) {\n    let pixel = null;\n    if (fill === 'start') {\n        pixel = scale.bottom;\n    } else if (fill === 'end') {\n        pixel = scale.top;\n    } else if (isObject(fill)) {\n        pixel = scale.getPixelForValue(fill.value);\n    } else if (scale.getBasePixel) {\n        pixel = scale.getBasePixel();\n    }\n    return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n    let value;\n    if (fill === 'start') {\n        value = startValue;\n    } else if (fill === 'end') {\n        value = scale.options.reverse ? scale.min : scale.max;\n    } else if (isObject(fill)) {\n        value = fill.value;\n    } else {\n        value = scale.getBaseValue();\n    }\n    return value;\n}\n function parseFillOption(line) {\n    const options = line.options;\n    const fillOption = options.fill;\n    let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n    if (fill === undefined) {\n        fill = !!options.backgroundColor;\n    }\n    if (fill === false || fill === null) {\n        return false;\n    }\n    if (fill === true) {\n        return 'origin';\n    }\n    return fill;\n}\n\nfunction _buildStackLine(source) {\n    const { scale , index , line  } = source;\n    const points = [];\n    const segments = line.segments;\n    const sourcePoints = line.points;\n    const linesBelow = getLinesBelow(scale, index);\n    linesBelow.push(_createBoundaryLine({\n        x: null,\n        y: scale.bottom\n    }, line));\n    for(let i = 0; i < segments.length; i++){\n        const segment = segments[i];\n        for(let j = segment.start; j <= segment.end; j++){\n            addPointsBelow(points, sourcePoints[j], linesBelow);\n        }\n    }\n    return new LineElement({\n        points,\n        options: {}\n    });\n}\n function getLinesBelow(scale, index) {\n    const below = [];\n    const metas = scale.getMatchingVisibleMetas('line');\n    for(let i = 0; i < metas.length; i++){\n        const meta = metas[i];\n        if (meta.index === index) {\n            break;\n        }\n        if (!meta.hidden) {\n            below.unshift(meta.dataset);\n        }\n    }\n    return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n    const postponed = [];\n    for(let j = 0; j < linesBelow.length; j++){\n        const line = linesBelow[j];\n        const { first , last , point  } = findPoint(line, sourcePoint, 'x');\n        if (!point || first && last) {\n            continue;\n        }\n        if (first) {\n            postponed.unshift(point);\n        } else {\n            points.push(point);\n            if (!last) {\n                break;\n            }\n        }\n    }\n    points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n    const point = line.interpolate(sourcePoint, property);\n    if (!point) {\n        return {};\n    }\n    const pointValue = point[property];\n    const segments = line.segments;\n    const linePoints = line.points;\n    let first = false;\n    let last = false;\n    for(let i = 0; i < segments.length; i++){\n        const segment = segments[i];\n        const firstValue = linePoints[segment.start][property];\n        const lastValue = linePoints[segment.end][property];\n        if (_isBetween(pointValue, firstValue, lastValue)) {\n            first = pointValue === firstValue;\n            last = pointValue === lastValue;\n            break;\n        }\n    }\n    return {\n        first,\n        last,\n        point\n    };\n}\n\nclass simpleArc {\n    constructor(opts){\n        this.x = opts.x;\n        this.y = opts.y;\n        this.radius = opts.radius;\n    }\n    pathSegment(ctx, bounds, opts) {\n        const { x , y , radius  } = this;\n        bounds = bounds || {\n            start: 0,\n            end: TAU\n        };\n        ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n        return !opts.bounds;\n    }\n    interpolate(point) {\n        const { x , y , radius  } = this;\n        const angle = point.angle;\n        return {\n            x: x + Math.cos(angle) * radius,\n            y: y + Math.sin(angle) * radius,\n            angle\n        };\n    }\n}\n\nfunction _getTarget(source) {\n    const { chart , fill , line  } = source;\n    if (isNumberFinite(fill)) {\n        return getLineByIndex(chart, fill);\n    }\n    if (fill === 'stack') {\n        return _buildStackLine(source);\n    }\n    if (fill === 'shape') {\n        return true;\n    }\n    const boundary = computeBoundary(source);\n    if (boundary instanceof simpleArc) {\n        return boundary;\n    }\n    return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n    const meta = chart.getDatasetMeta(index);\n    const visible = meta && chart.isDatasetVisible(index);\n    return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n    const scale = source.scale || {};\n    if (scale.getPointPositionForValue) {\n        return computeCircularBoundary(source);\n    }\n    return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n    const { scale ={} , fill  } = source;\n    const pixel = _getTargetPixel(fill, scale);\n    if (isNumberFinite(pixel)) {\n        const horizontal = scale.isHorizontal();\n        return {\n            x: horizontal ? pixel : null,\n            y: horizontal ? null : pixel\n        };\n    }\n    return null;\n}\nfunction computeCircularBoundary(source) {\n    const { scale , fill  } = source;\n    const options = scale.options;\n    const length = scale.getLabels().length;\n    const start = options.reverse ? scale.max : scale.min;\n    const value = _getTargetValue(fill, scale, start);\n    const target = [];\n    if (options.grid.circular) {\n        const center = scale.getPointPositionForValue(0, start);\n        return new simpleArc({\n            x: center.x,\n            y: center.y,\n            radius: scale.getDistanceFromCenterForValue(value)\n        });\n    }\n    for(let i = 0; i < length; ++i){\n        target.push(scale.getPointPositionForValue(i, value));\n    }\n    return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n    const target = _getTarget(source);\n    const { line , scale , axis  } = source;\n    const lineOpts = line.options;\n    const fillOption = lineOpts.fill;\n    const color = lineOpts.backgroundColor;\n    const { above =color , below =color  } = fillOption || {};\n    if (target && line.points.length) {\n        clipArea(ctx, area);\n        doFill(ctx, {\n            line,\n            target,\n            above,\n            below,\n            area,\n            scale,\n            axis\n        });\n        unclipArea(ctx);\n    }\n}\nfunction doFill(ctx, cfg) {\n    const { line , target , above , below , area , scale  } = cfg;\n    const property = line._loop ? 'angle' : cfg.axis;\n    ctx.save();\n    if (property === 'x' && below !== above) {\n        clipVertical(ctx, target, area.top);\n        fill(ctx, {\n            line,\n            target,\n            color: above,\n            scale,\n            property\n        });\n        ctx.restore();\n        ctx.save();\n        clipVertical(ctx, target, area.bottom);\n    }\n    fill(ctx, {\n        line,\n        target,\n        color: below,\n        scale,\n        property\n    });\n    ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n    const { segments , points  } = target;\n    let first = true;\n    let lineLoop = false;\n    ctx.beginPath();\n    for (const segment of segments){\n        const { start , end  } = segment;\n        const firstPoint = points[start];\n        const lastPoint = points[_findSegmentEnd(start, end, points)];\n        if (first) {\n            ctx.moveTo(firstPoint.x, firstPoint.y);\n            first = false;\n        } else {\n            ctx.lineTo(firstPoint.x, clipY);\n            ctx.lineTo(firstPoint.x, firstPoint.y);\n        }\n        lineLoop = !!target.pathSegment(ctx, segment, {\n            move: lineLoop\n        });\n        if (lineLoop) {\n            ctx.closePath();\n        } else {\n            ctx.lineTo(lastPoint.x, clipY);\n        }\n    }\n    ctx.lineTo(target.first().x, clipY);\n    ctx.closePath();\n    ctx.clip();\n}\nfunction fill(ctx, cfg) {\n    const { line , target , property , color , scale  } = cfg;\n    const segments = _segments(line, target, property);\n    for (const { source: src , target: tgt , start , end  } of segments){\n        const { style: { backgroundColor =color  } = {}  } = src;\n        const notShape = target !== true;\n        ctx.save();\n        ctx.fillStyle = backgroundColor;\n        clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n        ctx.beginPath();\n        const lineLoop = !!line.pathSegment(ctx, src);\n        let loop;\n        if (notShape) {\n            if (lineLoop) {\n                ctx.closePath();\n            } else {\n                interpolatedLineTo(ctx, target, end, property);\n            }\n            const targetLoop = !!target.pathSegment(ctx, tgt, {\n                move: lineLoop,\n                reverse: true\n            });\n            loop = lineLoop && targetLoop;\n            if (!loop) {\n                interpolatedLineTo(ctx, target, start, property);\n            }\n        }\n        ctx.closePath();\n        ctx.fill(loop ? 'evenodd' : 'nonzero');\n        ctx.restore();\n    }\n}\nfunction clipBounds(ctx, scale, bounds) {\n    const { top , bottom  } = scale.chart.chartArea;\n    const { property , start , end  } = bounds || {};\n    if (property === 'x') {\n        ctx.beginPath();\n        ctx.rect(start, top, end - start, bottom - top);\n        ctx.clip();\n    }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n    const interpolatedPoint = target.interpolate(point, property);\n    if (interpolatedPoint) {\n        ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n    }\n}\n\nvar index = {\n    id: 'filler',\n    afterDatasetsUpdate (chart, _args, options) {\n        const count = (chart.data.datasets || []).length;\n        const sources = [];\n        let meta, i, line, source;\n        for(i = 0; i < count; ++i){\n            meta = chart.getDatasetMeta(i);\n            line = meta.dataset;\n            source = null;\n            if (line && line.options && line instanceof LineElement) {\n                source = {\n                    visible: chart.isDatasetVisible(i),\n                    index: i,\n                    fill: _decodeFill(line, i, count),\n                    chart,\n                    axis: meta.controller.options.indexAxis,\n                    scale: meta.vScale,\n                    line\n                };\n            }\n            meta.$filler = source;\n            sources.push(source);\n        }\n        for(i = 0; i < count; ++i){\n            source = sources[i];\n            if (!source || source.fill === false) {\n                continue;\n            }\n            source.fill = _resolveTarget(sources, i, options.propagate);\n        }\n    },\n    beforeDraw (chart, _args, options) {\n        const draw = options.drawTime === 'beforeDraw';\n        const metasets = chart.getSortedVisibleDatasetMetas();\n        const area = chart.chartArea;\n        for(let i = metasets.length - 1; i >= 0; --i){\n            const source = metasets[i].$filler;\n            if (!source) {\n                continue;\n            }\n            source.line.updateControlPoints(area, source.axis);\n            if (draw && source.fill) {\n                _drawfill(chart.ctx, source, area);\n            }\n        }\n    },\n    beforeDatasetsDraw (chart, _args, options) {\n        if (options.drawTime !== 'beforeDatasetsDraw') {\n            return;\n        }\n        const metasets = chart.getSortedVisibleDatasetMetas();\n        for(let i = metasets.length - 1; i >= 0; --i){\n            const source = metasets[i].$filler;\n            if (_shouldApplyFill(source)) {\n                _drawfill(chart.ctx, source, chart.chartArea);\n            }\n        }\n    },\n    beforeDatasetDraw (chart, args, options) {\n        const source = args.meta.$filler;\n        if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n            return;\n        }\n        _drawfill(chart.ctx, source, chart.chartArea);\n    },\n    defaults: {\n        propagate: true,\n        drawTime: 'beforeDatasetDraw'\n    }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n    let { boxHeight =fontSize , boxWidth =fontSize  } = labelOpts;\n    if (labelOpts.usePointStyle) {\n        boxHeight = Math.min(boxHeight, fontSize);\n        boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n    }\n    return {\n        boxWidth,\n        boxHeight,\n        itemHeight: Math.max(fontSize, boxHeight)\n    };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n        super();\n        this._added = false;\n        this.legendHitBoxes = [];\n this._hoveredItem = null;\n        this.doughnutMode = false;\n        this.chart = config.chart;\n        this.options = config.options;\n        this.ctx = config.ctx;\n        this.legendItems = undefined;\n        this.columnSizes = undefined;\n        this.lineWidths = undefined;\n        this.maxHeight = undefined;\n        this.maxWidth = undefined;\n        this.top = undefined;\n        this.bottom = undefined;\n        this.left = undefined;\n        this.right = undefined;\n        this.height = undefined;\n        this.width = undefined;\n        this._margins = undefined;\n        this.position = undefined;\n        this.weight = undefined;\n        this.fullSize = undefined;\n    }\n    update(maxWidth, maxHeight, margins) {\n        this.maxWidth = maxWidth;\n        this.maxHeight = maxHeight;\n        this._margins = margins;\n        this.setDimensions();\n        this.buildLabels();\n        this.fit();\n    }\n    setDimensions() {\n        if (this.isHorizontal()) {\n            this.width = this.maxWidth;\n            this.left = this._margins.left;\n            this.right = this.width;\n        } else {\n            this.height = this.maxHeight;\n            this.top = this._margins.top;\n            this.bottom = this.height;\n        }\n    }\n    buildLabels() {\n        const labelOpts = this.options.labels || {};\n        let legendItems = callback(labelOpts.generateLabels, [\n            this.chart\n        ], this) || [];\n        if (labelOpts.filter) {\n            legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n        }\n        if (labelOpts.sort) {\n            legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n        }\n        if (this.options.reverse) {\n            legendItems.reverse();\n        }\n        this.legendItems = legendItems;\n    }\n    fit() {\n        const { options , ctx  } = this;\n        if (!options.display) {\n            this.width = this.height = 0;\n            return;\n        }\n        const labelOpts = options.labels;\n        const labelFont = toFont(labelOpts.font);\n        const fontSize = labelFont.size;\n        const titleHeight = this._computeTitleHeight();\n        const { boxWidth , itemHeight  } = getBoxSize(labelOpts, fontSize);\n        let width, height;\n        ctx.font = labelFont.string;\n        if (this.isHorizontal()) {\n            width = this.maxWidth;\n            height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n        } else {\n            height = this.maxHeight;\n            width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n        }\n        this.width = Math.min(width, options.maxWidth || this.maxWidth);\n        this.height = Math.min(height, options.maxHeight || this.maxHeight);\n    }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n        const { ctx , maxWidth , options: { labels: { padding  }  }  } = this;\n        const hitboxes = this.legendHitBoxes = [];\n        const lineWidths = this.lineWidths = [\n            0\n        ];\n        const lineHeight = itemHeight + padding;\n        let totalHeight = titleHeight;\n        ctx.textAlign = 'left';\n        ctx.textBaseline = 'middle';\n        let row = -1;\n        let top = -lineHeight;\n        this.legendItems.forEach((legendItem, i)=>{\n            const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n            if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n                totalHeight += lineHeight;\n                lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n                top += lineHeight;\n                row++;\n            }\n            hitboxes[i] = {\n                left: 0,\n                top,\n                row,\n                width: itemWidth,\n                height: itemHeight\n            };\n            lineWidths[lineWidths.length - 1] += itemWidth + padding;\n        });\n        return totalHeight;\n    }\n    _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n        const { ctx , maxHeight , options: { labels: { padding  }  }  } = this;\n        const hitboxes = this.legendHitBoxes = [];\n        const columnSizes = this.columnSizes = [];\n        const heightLimit = maxHeight - titleHeight;\n        let totalWidth = padding;\n        let currentColWidth = 0;\n        let currentColHeight = 0;\n        let left = 0;\n        let col = 0;\n        this.legendItems.forEach((legendItem, i)=>{\n            const { itemWidth , itemHeight  } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n            if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n                totalWidth += currentColWidth + padding;\n                columnSizes.push({\n                    width: currentColWidth,\n                    height: currentColHeight\n                });\n                left += currentColWidth + padding;\n                col++;\n                currentColWidth = currentColHeight = 0;\n            }\n            hitboxes[i] = {\n                left,\n                top: currentColHeight,\n                col,\n                width: itemWidth,\n                height: itemHeight\n            };\n            currentColWidth = Math.max(currentColWidth, itemWidth);\n            currentColHeight += itemHeight + padding;\n        });\n        totalWidth += currentColWidth;\n        columnSizes.push({\n            width: currentColWidth,\n            height: currentColHeight\n        });\n        return totalWidth;\n    }\n    adjustHitBoxes() {\n        if (!this.options.display) {\n            return;\n        }\n        const titleHeight = this._computeTitleHeight();\n        const { legendHitBoxes: hitboxes , options: { align , labels: { padding  } , rtl  }  } = this;\n        const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n        if (this.isHorizontal()) {\n            let row = 0;\n            let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n            for (const hitbox of hitboxes){\n                if (row !== hitbox.row) {\n                    row = hitbox.row;\n                    left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n                }\n                hitbox.top += this.top + titleHeight + padding;\n                hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n                left += hitbox.width + padding;\n            }\n        } else {\n            let col = 0;\n            let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n            for (const hitbox of hitboxes){\n                if (hitbox.col !== col) {\n                    col = hitbox.col;\n                    top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n                }\n                hitbox.top = top;\n                hitbox.left += this.left + padding;\n                hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n                top += hitbox.height + padding;\n            }\n        }\n    }\n    isHorizontal() {\n        return this.options.position === 'top' || this.options.position === 'bottom';\n    }\n    draw() {\n        if (this.options.display) {\n            const ctx = this.ctx;\n            clipArea(ctx, this);\n            this._draw();\n            unclipArea(ctx);\n        }\n    }\n _draw() {\n        const { options: opts , columnSizes , lineWidths , ctx  } = this;\n        const { align , labels: labelOpts  } = opts;\n        const defaultColor = defaults.color;\n        const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n        const labelFont = toFont(labelOpts.font);\n        const { padding  } = labelOpts;\n        const fontSize = labelFont.size;\n        const halfFontSize = fontSize / 2;\n        let cursor;\n        this.drawTitle();\n        ctx.textAlign = rtlHelper.textAlign('left');\n        ctx.textBaseline = 'middle';\n        ctx.lineWidth = 0.5;\n        ctx.font = labelFont.string;\n        const { boxWidth , boxHeight , itemHeight  } = getBoxSize(labelOpts, fontSize);\n        const drawLegendBox = function(x, y, legendItem) {\n            if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n                return;\n            }\n            ctx.save();\n            const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n            ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n            ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n            ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n            ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n            ctx.lineWidth = lineWidth;\n            ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n            ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n            if (labelOpts.usePointStyle) {\n                const drawOptions = {\n                    radius: boxHeight * Math.SQRT2 / 2,\n                    pointStyle: legendItem.pointStyle,\n                    rotation: legendItem.rotation,\n                    borderWidth: lineWidth\n                };\n                const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n                const centerY = y + halfFontSize;\n                drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n            } else {\n                const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n                const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n                const borderRadius = toTRBLCorners(legendItem.borderRadius);\n                ctx.beginPath();\n                if (Object.values(borderRadius).some((v)=>v !== 0)) {\n                    addRoundedRectPath(ctx, {\n                        x: xBoxLeft,\n                        y: yBoxTop,\n                        w: boxWidth,\n                        h: boxHeight,\n                        radius: borderRadius\n                    });\n                } else {\n                    ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n                }\n                ctx.fill();\n                if (lineWidth !== 0) {\n                    ctx.stroke();\n                }\n            }\n            ctx.restore();\n        };\n        const fillText = function(x, y, legendItem) {\n            renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n                strikethrough: legendItem.hidden,\n                textAlign: rtlHelper.textAlign(legendItem.textAlign)\n            });\n        };\n        const isHorizontal = this.isHorizontal();\n        const titleHeight = this._computeTitleHeight();\n        if (isHorizontal) {\n            cursor = {\n                x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n                y: this.top + padding + titleHeight,\n                line: 0\n            };\n        } else {\n            cursor = {\n                x: this.left + padding,\n                y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n                line: 0\n            };\n        }\n        overrideTextDirection(this.ctx, opts.textDirection);\n        const lineHeight = itemHeight + padding;\n        this.legendItems.forEach((legendItem, i)=>{\n            ctx.strokeStyle = legendItem.fontColor;\n            ctx.fillStyle = legendItem.fontColor;\n            const textWidth = ctx.measureText(legendItem.text).width;\n            const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n            const width = boxWidth + halfFontSize + textWidth;\n            let x = cursor.x;\n            let y = cursor.y;\n            rtlHelper.setWidth(this.width);\n            if (isHorizontal) {\n                if (i > 0 && x + width + padding > this.right) {\n                    y = cursor.y += lineHeight;\n                    cursor.line++;\n                    x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n                }\n            } else if (i > 0 && y + lineHeight > this.bottom) {\n                x = cursor.x = x + columnSizes[cursor.line].width + padding;\n                cursor.line++;\n                y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n            }\n            const realX = rtlHelper.x(x);\n            drawLegendBox(realX, y, legendItem);\n            x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n            fillText(rtlHelper.x(x), y, legendItem);\n            if (isHorizontal) {\n                cursor.x += width + padding;\n            } else if (typeof legendItem.text !== 'string') {\n                const fontLineHeight = labelFont.lineHeight;\n                cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n            } else {\n                cursor.y += lineHeight;\n            }\n        });\n        restoreTextDirection(this.ctx, opts.textDirection);\n    }\n drawTitle() {\n        const opts = this.options;\n        const titleOpts = opts.title;\n        const titleFont = toFont(titleOpts.font);\n        const titlePadding = toPadding(titleOpts.padding);\n        if (!titleOpts.display) {\n            return;\n        }\n        const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n        const ctx = this.ctx;\n        const position = titleOpts.position;\n        const halfFontSize = titleFont.size / 2;\n        const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n        let y;\n        let left = this.left;\n        let maxWidth = this.width;\n        if (this.isHorizontal()) {\n            maxWidth = Math.max(...this.lineWidths);\n            y = this.top + topPaddingPlusHalfFontSize;\n            left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n        } else {\n            const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n            y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n        }\n        const x = _alignStartEnd(position, left, left + maxWidth);\n        ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n        ctx.textBaseline = 'middle';\n        ctx.strokeStyle = titleOpts.color;\n        ctx.fillStyle = titleOpts.color;\n        ctx.font = titleFont.string;\n        renderText(ctx, titleOpts.text, x, y, titleFont);\n    }\n _computeTitleHeight() {\n        const titleOpts = this.options.title;\n        const titleFont = toFont(titleOpts.font);\n        const titlePadding = toPadding(titleOpts.padding);\n        return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n    }\n _getLegendItemAt(x, y) {\n        let i, hitBox, lh;\n        if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n            lh = this.legendHitBoxes;\n            for(i = 0; i < lh.length; ++i){\n                hitBox = lh[i];\n                if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n                    return this.legendItems[i];\n                }\n            }\n        }\n        return null;\n    }\n handleEvent(e) {\n        const opts = this.options;\n        if (!isListened(e.type, opts)) {\n            return;\n        }\n        const hoveredItem = this._getLegendItemAt(e.x, e.y);\n        if (e.type === 'mousemove' || e.type === 'mouseout') {\n            const previous = this._hoveredItem;\n            const sameItem = itemsEqual(previous, hoveredItem);\n            if (previous && !sameItem) {\n                callback(opts.onLeave, [\n                    e,\n                    previous,\n                    this\n                ], this);\n            }\n            this._hoveredItem = hoveredItem;\n            if (hoveredItem && !sameItem) {\n                callback(opts.onHover, [\n                    e,\n                    hoveredItem,\n                    this\n                ], this);\n            }\n        } else if (hoveredItem) {\n            callback(opts.onClick, [\n                e,\n                hoveredItem,\n                this\n            ], this);\n        }\n    }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n    const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n    const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n    return {\n        itemWidth,\n        itemHeight\n    };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n    let legendItemText = legendItem.text;\n    if (legendItemText && typeof legendItemText !== 'string') {\n        legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n    }\n    return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n    let itemHeight = _itemHeight;\n    if (typeof legendItem.text !== 'string') {\n        itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n    }\n    return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n    const labelHeight = legendItem.text ? legendItem.text.length : 0;\n    return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n    if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n        return true;\n    }\n    if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n        return true;\n    }\n    return false;\n}\nvar plugin_legend = {\n    id: 'legend',\n _element: Legend,\n    start (chart, _args, options) {\n        const legend = chart.legend = new Legend({\n            ctx: chart.ctx,\n            options,\n            chart\n        });\n        layouts.configure(chart, legend, options);\n        layouts.addBox(chart, legend);\n    },\n    stop (chart) {\n        layouts.removeBox(chart, chart.legend);\n        delete chart.legend;\n    },\n    beforeUpdate (chart, _args, options) {\n        const legend = chart.legend;\n        layouts.configure(chart, legend, options);\n        legend.options = options;\n    },\n    afterUpdate (chart) {\n        const legend = chart.legend;\n        legend.buildLabels();\n        legend.adjustHitBoxes();\n    },\n    afterEvent (chart, args) {\n        if (!args.replay) {\n            chart.legend.handleEvent(args.event);\n        }\n    },\n    defaults: {\n        display: true,\n        position: 'top',\n        align: 'center',\n        fullSize: true,\n        reverse: false,\n        weight: 1000,\n        onClick (e, legendItem, legend) {\n            const index = legendItem.datasetIndex;\n            const ci = legend.chart;\n            if (ci.isDatasetVisible(index)) {\n                ci.hide(index);\n                legendItem.hidden = true;\n            } else {\n                ci.show(index);\n                legendItem.hidden = false;\n            }\n        },\n        onHover: null,\n        onLeave: null,\n        labels: {\n            color: (ctx)=>ctx.chart.options.color,\n            boxWidth: 40,\n            padding: 10,\n            generateLabels (chart) {\n                const datasets = chart.data.datasets;\n                const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius  }  } = chart.legend.options;\n                return chart._getSortedDatasetMetas().map((meta)=>{\n                    const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n                    const borderWidth = toPadding(style.borderWidth);\n                    return {\n                        text: datasets[meta.index].label,\n                        fillStyle: style.backgroundColor,\n                        fontColor: color,\n                        hidden: !meta.visible,\n                        lineCap: style.borderCapStyle,\n                        lineDash: style.borderDash,\n                        lineDashOffset: style.borderDashOffset,\n                        lineJoin: style.borderJoinStyle,\n                        lineWidth: (borderWidth.width + borderWidth.height) / 4,\n                        strokeStyle: style.borderColor,\n                        pointStyle: pointStyle || style.pointStyle,\n                        rotation: style.rotation,\n                        textAlign: textAlign || style.textAlign,\n                        borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n                        datasetIndex: meta.index\n                    };\n                }, this);\n            }\n        },\n        title: {\n            color: (ctx)=>ctx.chart.options.color,\n            display: false,\n            position: 'center',\n            text: ''\n        }\n    },\n    descriptors: {\n        _scriptable: (name)=>!name.startsWith('on'),\n        labels: {\n            _scriptable: (name)=>![\n                    'generateLabels',\n                    'filter',\n                    'sort'\n                ].includes(name)\n        }\n    }\n};\n\nclass Title extends Element {\n constructor(config){\n        super();\n        this.chart = config.chart;\n        this.options = config.options;\n        this.ctx = config.ctx;\n        this._padding = undefined;\n        this.top = undefined;\n        this.bottom = undefined;\n        this.left = undefined;\n        this.right = undefined;\n        this.width = undefined;\n        this.height = undefined;\n        this.position = undefined;\n        this.weight = undefined;\n        this.fullSize = undefined;\n    }\n    update(maxWidth, maxHeight) {\n        const opts = this.options;\n        this.left = 0;\n        this.top = 0;\n        if (!opts.display) {\n            this.width = this.height = this.right = this.bottom = 0;\n            return;\n        }\n        this.width = this.right = maxWidth;\n        this.height = this.bottom = maxHeight;\n        const lineCount = isArray(opts.text) ? opts.text.length : 1;\n        this._padding = toPadding(opts.padding);\n        const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n        if (this.isHorizontal()) {\n            this.height = textSize;\n        } else {\n            this.width = textSize;\n        }\n    }\n    isHorizontal() {\n        const pos = this.options.position;\n        return pos === 'top' || pos === 'bottom';\n    }\n    _drawArgs(offset) {\n        const { top , left , bottom , right , options  } = this;\n        const align = options.align;\n        let rotation = 0;\n        let maxWidth, titleX, titleY;\n        if (this.isHorizontal()) {\n            titleX = _alignStartEnd(align, left, right);\n            titleY = top + offset;\n            maxWidth = right - left;\n        } else {\n            if (options.position === 'left') {\n                titleX = left + offset;\n                titleY = _alignStartEnd(align, bottom, top);\n                rotation = PI * -0.5;\n            } else {\n                titleX = right - offset;\n                titleY = _alignStartEnd(align, top, bottom);\n                rotation = PI * 0.5;\n            }\n            maxWidth = bottom - top;\n        }\n        return {\n            titleX,\n            titleY,\n            maxWidth,\n            rotation\n        };\n    }\n    draw() {\n        const ctx = this.ctx;\n        const opts = this.options;\n        if (!opts.display) {\n            return;\n        }\n        const fontOpts = toFont(opts.font);\n        const lineHeight = fontOpts.lineHeight;\n        const offset = lineHeight / 2 + this._padding.top;\n        const { titleX , titleY , maxWidth , rotation  } = this._drawArgs(offset);\n        renderText(ctx, opts.text, 0, 0, fontOpts, {\n            color: opts.color,\n            maxWidth,\n            rotation,\n            textAlign: _toLeftRightCenter(opts.align),\n            textBaseline: 'middle',\n            translation: [\n                titleX,\n                titleY\n            ]\n        });\n    }\n}\nfunction createTitle(chart, titleOpts) {\n    const title = new Title({\n        ctx: chart.ctx,\n        options: titleOpts,\n        chart\n    });\n    layouts.configure(chart, title, titleOpts);\n    layouts.addBox(chart, title);\n    chart.titleBlock = title;\n}\nvar plugin_title = {\n    id: 'title',\n _element: Title,\n    start (chart, _args, options) {\n        createTitle(chart, options);\n    },\n    stop (chart) {\n        const titleBlock = chart.titleBlock;\n        layouts.removeBox(chart, titleBlock);\n        delete chart.titleBlock;\n    },\n    beforeUpdate (chart, _args, options) {\n        const title = chart.titleBlock;\n        layouts.configure(chart, title, options);\n        title.options = options;\n    },\n    defaults: {\n        align: 'center',\n        display: false,\n        font: {\n            weight: 'bold'\n        },\n        fullSize: true,\n        padding: 10,\n        position: 'top',\n        text: '',\n        weight: 2000\n    },\n    defaultRoutes: {\n        color: 'color'\n    },\n    descriptors: {\n        _scriptable: true,\n        _indexable: false\n    }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n    id: 'subtitle',\n    start (chart, _args, options) {\n        const title = new Title({\n            ctx: chart.ctx,\n            options,\n            chart\n        });\n        layouts.configure(chart, title, options);\n        layouts.addBox(chart, title);\n        map.set(chart, title);\n    },\n    stop (chart) {\n        layouts.removeBox(chart, map.get(chart));\n        map.delete(chart);\n    },\n    beforeUpdate (chart, _args, options) {\n        const title = map.get(chart);\n        layouts.configure(chart, title, options);\n        title.options = options;\n    },\n    defaults: {\n        align: 'center',\n        display: false,\n        font: {\n            weight: 'normal'\n        },\n        fullSize: true,\n        padding: 0,\n        position: 'top',\n        text: '',\n        weight: 1500\n    },\n    defaultRoutes: {\n        color: 'color'\n    },\n    descriptors: {\n        _scriptable: true,\n        _indexable: false\n    }\n};\n\nconst positioners = {\n average (items) {\n        if (!items.length) {\n            return false;\n        }\n        let i, len;\n        let xSet = new Set();\n        let y = 0;\n        let count = 0;\n        for(i = 0, len = items.length; i < len; ++i){\n            const el = items[i].element;\n            if (el && el.hasValue()) {\n                const pos = el.tooltipPosition();\n                xSet.add(pos.x);\n                y += pos.y;\n                ++count;\n            }\n        }\n        if (count === 0 || xSet.size === 0) {\n            return false;\n        }\n        const xAverage = [\n            ...xSet\n        ].reduce((a, b)=>a + b) / xSet.size;\n        return {\n            x: xAverage,\n            y: y / count\n        };\n    },\n nearest (items, eventPosition) {\n        if (!items.length) {\n            return false;\n        }\n        let x = eventPosition.x;\n        let y = eventPosition.y;\n        let minDistance = Number.POSITIVE_INFINITY;\n        let i, len, nearestElement;\n        for(i = 0, len = items.length; i < len; ++i){\n            const el = items[i].element;\n            if (el && el.hasValue()) {\n                const center = el.getCenterPoint();\n                const d = distanceBetweenPoints(eventPosition, center);\n                if (d < minDistance) {\n                    minDistance = d;\n                    nearestElement = el;\n                }\n            }\n        }\n        if (nearestElement) {\n            const tp = nearestElement.tooltipPosition();\n            x = tp.x;\n            y = tp.y;\n        }\n        return {\n            x,\n            y\n        };\n    }\n};\nfunction pushOrConcat(base, toPush) {\n    if (toPush) {\n        if (isArray(toPush)) {\n            Array.prototype.push.apply(base, toPush);\n        } else {\n            base.push(toPush);\n        }\n    }\n    return base;\n}\n function splitNewlines(str) {\n    if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n        return str.split('\\n');\n    }\n    return str;\n}\n function createTooltipItem(chart, item) {\n    const { element , datasetIndex , index  } = item;\n    const controller = chart.getDatasetMeta(datasetIndex).controller;\n    const { label , value  } = controller.getLabelAndValue(index);\n    return {\n        chart,\n        label,\n        parsed: controller.getParsed(index),\n        raw: chart.data.datasets[datasetIndex].data[index],\n        formattedValue: value,\n        dataset: controller.getDataset(),\n        dataIndex: index,\n        datasetIndex,\n        element\n    };\n}\n function getTooltipSize(tooltip, options) {\n    const ctx = tooltip.chart.ctx;\n    const { body , footer , title  } = tooltip;\n    const { boxWidth , boxHeight  } = options;\n    const bodyFont = toFont(options.bodyFont);\n    const titleFont = toFont(options.titleFont);\n    const footerFont = toFont(options.footerFont);\n    const titleLineCount = title.length;\n    const footerLineCount = footer.length;\n    const bodyLineItemCount = body.length;\n    const padding = toPadding(options.padding);\n    let height = padding.height;\n    let width = 0;\n    let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n    combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n    if (titleLineCount) {\n        height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n    }\n    if (combinedBodyLength) {\n        const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n        height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n    }\n    if (footerLineCount) {\n        height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n    }\n    let widthPadding = 0;\n    const maxLineWidth = function(line) {\n        width = Math.max(width, ctx.measureText(line).width + widthPadding);\n    };\n    ctx.save();\n    ctx.font = titleFont.string;\n    each(tooltip.title, maxLineWidth);\n    ctx.font = bodyFont.string;\n    each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n    widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n    each(body, (bodyItem)=>{\n        each(bodyItem.before, maxLineWidth);\n        each(bodyItem.lines, maxLineWidth);\n        each(bodyItem.after, maxLineWidth);\n    });\n    widthPadding = 0;\n    ctx.font = footerFont.string;\n    each(tooltip.footer, maxLineWidth);\n    ctx.restore();\n    width += padding.width;\n    return {\n        width,\n        height\n    };\n}\nfunction determineYAlign(chart, size) {\n    const { y , height  } = size;\n    if (y < height / 2) {\n        return 'top';\n    } else if (y > chart.height - height / 2) {\n        return 'bottom';\n    }\n    return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n    const { x , width  } = size;\n    const caret = options.caretSize + options.caretPadding;\n    if (xAlign === 'left' && x + width + caret > chart.width) {\n        return true;\n    }\n    if (xAlign === 'right' && x - width - caret < 0) {\n        return true;\n    }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n    const { x , width  } = size;\n    const { width: chartWidth , chartArea: { left , right  }  } = chart;\n    let xAlign = 'center';\n    if (yAlign === 'center') {\n        xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n    } else if (x <= width / 2) {\n        xAlign = 'left';\n    } else if (x >= chartWidth - width / 2) {\n        xAlign = 'right';\n    }\n    if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n        xAlign = 'center';\n    }\n    return xAlign;\n}\n function determineAlignment(chart, options, size) {\n    const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n    return {\n        xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n        yAlign\n    };\n}\nfunction alignX(size, xAlign) {\n    let { x , width  } = size;\n    if (xAlign === 'right') {\n        x -= width;\n    } else if (xAlign === 'center') {\n        x -= width / 2;\n    }\n    return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n    let { y , height  } = size;\n    if (yAlign === 'top') {\n        y += paddingAndSize;\n    } else if (yAlign === 'bottom') {\n        y -= height + paddingAndSize;\n    } else {\n        y -= height / 2;\n    }\n    return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n    const { caretSize , caretPadding , cornerRadius  } = options;\n    const { xAlign , yAlign  } = alignment;\n    const paddingAndSize = caretSize + caretPadding;\n    const { topLeft , topRight , bottomLeft , bottomRight  } = toTRBLCorners(cornerRadius);\n    let x = alignX(size, xAlign);\n    const y = alignY(size, yAlign, paddingAndSize);\n    if (yAlign === 'center') {\n        if (xAlign === 'left') {\n            x += paddingAndSize;\n        } else if (xAlign === 'right') {\n            x -= paddingAndSize;\n        }\n    } else if (xAlign === 'left') {\n        x -= Math.max(topLeft, bottomLeft) + caretSize;\n    } else if (xAlign === 'right') {\n        x += Math.max(topRight, bottomRight) + caretSize;\n    }\n    return {\n        x: _limitValue(x, 0, chart.width - size.width),\n        y: _limitValue(y, 0, chart.height - size.height)\n    };\n}\nfunction getAlignedX(tooltip, align, options) {\n    const padding = toPadding(options.padding);\n    return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n    return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n    return createContext(parent, {\n        tooltip,\n        tooltipItems,\n        type: 'tooltip'\n    });\n}\nfunction overrideCallbacks(callbacks, context) {\n    const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n    return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n    beforeTitle: noop,\n    title (tooltipItems) {\n        if (tooltipItems.length > 0) {\n            const item = tooltipItems[0];\n            const labels = item.chart.data.labels;\n            const labelCount = labels ? labels.length : 0;\n            if (this && this.options && this.options.mode === 'dataset') {\n                return item.dataset.label || '';\n            } else if (item.label) {\n                return item.label;\n            } else if (labelCount > 0 && item.dataIndex < labelCount) {\n                return labels[item.dataIndex];\n            }\n        }\n        return '';\n    },\n    afterTitle: noop,\n    beforeBody: noop,\n    beforeLabel: noop,\n    label (tooltipItem) {\n        if (this && this.options && this.options.mode === 'dataset') {\n            return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n        }\n        let label = tooltipItem.dataset.label || '';\n        if (label) {\n            label += ': ';\n        }\n        const value = tooltipItem.formattedValue;\n        if (!isNullOrUndef(value)) {\n            label += value;\n        }\n        return label;\n    },\n    labelColor (tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n            borderColor: options.borderColor,\n            backgroundColor: options.backgroundColor,\n            borderWidth: options.borderWidth,\n            borderDash: options.borderDash,\n            borderDashOffset: options.borderDashOffset,\n            borderRadius: 0\n        };\n    },\n    labelTextColor () {\n        return this.options.bodyColor;\n    },\n    labelPointStyle (tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n            pointStyle: options.pointStyle,\n            rotation: options.rotation\n        };\n    },\n    afterLabel: noop,\n    afterBody: noop,\n    beforeFooter: noop,\n    footer: noop,\n    afterFooter: noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n    const result = callbacks[name].call(ctx, arg);\n    if (typeof result === 'undefined') {\n        return defaultCallbacks[name].call(ctx, arg);\n    }\n    return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n    constructor(config){\n        super();\n        this.opacity = 0;\n        this._active = [];\n        this._eventPosition = undefined;\n        this._size = undefined;\n        this._cachedAnimations = undefined;\n        this._tooltipItems = [];\n        this.$animations = undefined;\n        this.$context = undefined;\n        this.chart = config.chart;\n        this.options = config.options;\n        this.dataPoints = undefined;\n        this.title = undefined;\n        this.beforeBody = undefined;\n        this.body = undefined;\n        this.afterBody = undefined;\n        this.footer = undefined;\n        this.xAlign = undefined;\n        this.yAlign = undefined;\n        this.x = undefined;\n        this.y = undefined;\n        this.height = undefined;\n        this.width = undefined;\n        this.caretX = undefined;\n        this.caretY = undefined;\n        this.labelColors = undefined;\n        this.labelPointStyles = undefined;\n        this.labelTextColors = undefined;\n    }\n    initialize(options) {\n        this.options = options;\n        this._cachedAnimations = undefined;\n        this.$context = undefined;\n    }\n _resolveAnimations() {\n        const cached = this._cachedAnimations;\n        if (cached) {\n            return cached;\n        }\n        const chart = this.chart;\n        const options = this.options.setContext(this.getContext());\n        const opts = options.enabled && chart.options.animation && options.animations;\n        const animations = new Animations(this.chart, opts);\n        if (opts._cacheable) {\n            this._cachedAnimations = Object.freeze(animations);\n        }\n        return animations;\n    }\n getContext() {\n        return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n    }\n    getTitle(context, options) {\n        const { callbacks  } = options;\n        const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n        const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n        const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n        let lines = [];\n        lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n        lines = pushOrConcat(lines, splitNewlines(title));\n        lines = pushOrConcat(lines, splitNewlines(afterTitle));\n        return lines;\n    }\n    getBeforeBody(tooltipItems, options) {\n        return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n    }\n    getBody(tooltipItems, options) {\n        const { callbacks  } = options;\n        const bodyItems = [];\n        each(tooltipItems, (context)=>{\n            const bodyItem = {\n                before: [],\n                lines: [],\n                after: []\n            };\n            const scoped = overrideCallbacks(callbacks, context);\n            pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n            pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n            pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n            bodyItems.push(bodyItem);\n        });\n        return bodyItems;\n    }\n    getAfterBody(tooltipItems, options) {\n        return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n    }\n    getFooter(tooltipItems, options) {\n        const { callbacks  } = options;\n        const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n        const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n        const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n        let lines = [];\n        lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n        lines = pushOrConcat(lines, splitNewlines(footer));\n        lines = pushOrConcat(lines, splitNewlines(afterFooter));\n        return lines;\n    }\n _createItems(options) {\n        const active = this._active;\n        const data = this.chart.data;\n        const labelColors = [];\n        const labelPointStyles = [];\n        const labelTextColors = [];\n        let tooltipItems = [];\n        let i, len;\n        for(i = 0, len = active.length; i < len; ++i){\n            tooltipItems.push(createTooltipItem(this.chart, active[i]));\n        }\n        if (options.filter) {\n            tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n        }\n        if (options.itemSort) {\n            tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n        }\n        each(tooltipItems, (context)=>{\n            const scoped = overrideCallbacks(options.callbacks, context);\n            labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n            labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n            labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n        });\n        this.labelColors = labelColors;\n        this.labelPointStyles = labelPointStyles;\n        this.labelTextColors = labelTextColors;\n        this.dataPoints = tooltipItems;\n        return tooltipItems;\n    }\n    update(changed, replay) {\n        const options = this.options.setContext(this.getContext());\n        const active = this._active;\n        let properties;\n        let tooltipItems = [];\n        if (!active.length) {\n            if (this.opacity !== 0) {\n                properties = {\n                    opacity: 0\n                };\n            }\n        } else {\n            const position = positioners[options.position].call(this, active, this._eventPosition);\n            tooltipItems = this._createItems(options);\n            this.title = this.getTitle(tooltipItems, options);\n            this.beforeBody = this.getBeforeBody(tooltipItems, options);\n            this.body = this.getBody(tooltipItems, options);\n            this.afterBody = this.getAfterBody(tooltipItems, options);\n            this.footer = this.getFooter(tooltipItems, options);\n            const size = this._size = getTooltipSize(this, options);\n            const positionAndSize = Object.assign({}, position, size);\n            const alignment = determineAlignment(this.chart, options, positionAndSize);\n            const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n            this.xAlign = alignment.xAlign;\n            this.yAlign = alignment.yAlign;\n            properties = {\n                opacity: 1,\n                x: backgroundPoint.x,\n                y: backgroundPoint.y,\n                width: size.width,\n                height: size.height,\n                caretX: position.x,\n                caretY: position.y\n            };\n        }\n        this._tooltipItems = tooltipItems;\n        this.$context = undefined;\n        if (properties) {\n            this._resolveAnimations().update(this, properties);\n        }\n        if (changed && options.external) {\n            options.external.call(this, {\n                chart: this.chart,\n                tooltip: this,\n                replay\n            });\n        }\n    }\n    drawCaret(tooltipPoint, ctx, size, options) {\n        const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n        ctx.lineTo(caretPosition.x1, caretPosition.y1);\n        ctx.lineTo(caretPosition.x2, caretPosition.y2);\n        ctx.lineTo(caretPosition.x3, caretPosition.y3);\n    }\n    getCaretPosition(tooltipPoint, size, options) {\n        const { xAlign , yAlign  } = this;\n        const { caretSize , cornerRadius  } = options;\n        const { topLeft , topRight , bottomLeft , bottomRight  } = toTRBLCorners(cornerRadius);\n        const { x: ptX , y: ptY  } = tooltipPoint;\n        const { width , height  } = size;\n        let x1, x2, x3, y1, y2, y3;\n        if (yAlign === 'center') {\n            y2 = ptY + height / 2;\n            if (xAlign === 'left') {\n                x1 = ptX;\n                x2 = x1 - caretSize;\n                y1 = y2 + caretSize;\n                y3 = y2 - caretSize;\n            } else {\n                x1 = ptX + width;\n                x2 = x1 + caretSize;\n                y1 = y2 - caretSize;\n                y3 = y2 + caretSize;\n            }\n            x3 = x1;\n        } else {\n            if (xAlign === 'left') {\n                x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n            } else if (xAlign === 'right') {\n                x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n            } else {\n                x2 = this.caretX;\n            }\n            if (yAlign === 'top') {\n                y1 = ptY;\n                y2 = y1 - caretSize;\n                x1 = x2 - caretSize;\n                x3 = x2 + caretSize;\n            } else {\n                y1 = ptY + height;\n                y2 = y1 + caretSize;\n                x1 = x2 + caretSize;\n                x3 = x2 - caretSize;\n            }\n            y3 = y1;\n        }\n        return {\n            x1,\n            x2,\n            x3,\n            y1,\n            y2,\n            y3\n        };\n    }\n    drawTitle(pt, ctx, options) {\n        const title = this.title;\n        const length = title.length;\n        let titleFont, titleSpacing, i;\n        if (length) {\n            const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n            pt.x = getAlignedX(this, options.titleAlign, options);\n            ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n            ctx.textBaseline = 'middle';\n            titleFont = toFont(options.titleFont);\n            titleSpacing = options.titleSpacing;\n            ctx.fillStyle = options.titleColor;\n            ctx.font = titleFont.string;\n            for(i = 0; i < length; ++i){\n                ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n                pt.y += titleFont.lineHeight + titleSpacing;\n                if (i + 1 === length) {\n                    pt.y += options.titleMarginBottom - titleSpacing;\n                }\n            }\n        }\n    }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n        const labelColor = this.labelColors[i];\n        const labelPointStyle = this.labelPointStyles[i];\n        const { boxHeight , boxWidth  } = options;\n        const bodyFont = toFont(options.bodyFont);\n        const colorX = getAlignedX(this, 'left', options);\n        const rtlColorX = rtlHelper.x(colorX);\n        const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n        const colorY = pt.y + yOffSet;\n        if (options.usePointStyle) {\n            const drawOptions = {\n                radius: Math.min(boxWidth, boxHeight) / 2,\n                pointStyle: labelPointStyle.pointStyle,\n                rotation: labelPointStyle.rotation,\n                borderWidth: 1\n            };\n            const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n            const centerY = colorY + boxHeight / 2;\n            ctx.strokeStyle = options.multiKeyBackground;\n            ctx.fillStyle = options.multiKeyBackground;\n            drawPoint(ctx, drawOptions, centerX, centerY);\n            ctx.strokeStyle = labelColor.borderColor;\n            ctx.fillStyle = labelColor.backgroundColor;\n            drawPoint(ctx, drawOptions, centerX, centerY);\n        } else {\n            ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n            ctx.strokeStyle = labelColor.borderColor;\n            ctx.setLineDash(labelColor.borderDash || []);\n            ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n            const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n            const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n            const borderRadius = toTRBLCorners(labelColor.borderRadius);\n            if (Object.values(borderRadius).some((v)=>v !== 0)) {\n                ctx.beginPath();\n                ctx.fillStyle = options.multiKeyBackground;\n                addRoundedRectPath(ctx, {\n                    x: outerX,\n                    y: colorY,\n                    w: boxWidth,\n                    h: boxHeight,\n                    radius: borderRadius\n                });\n                ctx.fill();\n                ctx.stroke();\n                ctx.fillStyle = labelColor.backgroundColor;\n                ctx.beginPath();\n                addRoundedRectPath(ctx, {\n                    x: innerX,\n                    y: colorY + 1,\n                    w: boxWidth - 2,\n                    h: boxHeight - 2,\n                    radius: borderRadius\n                });\n                ctx.fill();\n            } else {\n                ctx.fillStyle = options.multiKeyBackground;\n                ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n                ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n                ctx.fillStyle = labelColor.backgroundColor;\n                ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n            }\n        }\n        ctx.fillStyle = this.labelTextColors[i];\n    }\n    drawBody(pt, ctx, options) {\n        const { body  } = this;\n        const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding  } = options;\n        const bodyFont = toFont(options.bodyFont);\n        let bodyLineHeight = bodyFont.lineHeight;\n        let xLinePadding = 0;\n        const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n        const fillLineOfText = function(line) {\n            ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n            pt.y += bodyLineHeight + bodySpacing;\n        };\n        const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n        let bodyItem, textColor, lines, i, j, ilen, jlen;\n        ctx.textAlign = bodyAlign;\n        ctx.textBaseline = 'middle';\n        ctx.font = bodyFont.string;\n        pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n        ctx.fillStyle = options.bodyColor;\n        each(this.beforeBody, fillLineOfText);\n        xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n        for(i = 0, ilen = body.length; i < ilen; ++i){\n            bodyItem = body[i];\n            textColor = this.labelTextColors[i];\n            ctx.fillStyle = textColor;\n            each(bodyItem.before, fillLineOfText);\n            lines = bodyItem.lines;\n            if (displayColors && lines.length) {\n                this._drawColorBox(ctx, pt, i, rtlHelper, options);\n                bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n            }\n            for(j = 0, jlen = lines.length; j < jlen; ++j){\n                fillLineOfText(lines[j]);\n                bodyLineHeight = bodyFont.lineHeight;\n            }\n            each(bodyItem.after, fillLineOfText);\n        }\n        xLinePadding = 0;\n        bodyLineHeight = bodyFont.lineHeight;\n        each(this.afterBody, fillLineOfText);\n        pt.y -= bodySpacing;\n    }\n    drawFooter(pt, ctx, options) {\n        const footer = this.footer;\n        const length = footer.length;\n        let footerFont, i;\n        if (length) {\n            const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n            pt.x = getAlignedX(this, options.footerAlign, options);\n            pt.y += options.footerMarginTop;\n            ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n            ctx.textBaseline = 'middle';\n            footerFont = toFont(options.footerFont);\n            ctx.fillStyle = options.footerColor;\n            ctx.font = footerFont.string;\n            for(i = 0; i < length; ++i){\n                ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n                pt.y += footerFont.lineHeight + options.footerSpacing;\n            }\n        }\n    }\n    drawBackground(pt, ctx, tooltipSize, options) {\n        const { xAlign , yAlign  } = this;\n        const { x , y  } = pt;\n        const { width , height  } = tooltipSize;\n        const { topLeft , topRight , bottomLeft , bottomRight  } = toTRBLCorners(options.cornerRadius);\n        ctx.fillStyle = options.backgroundColor;\n        ctx.strokeStyle = options.borderColor;\n        ctx.lineWidth = options.borderWidth;\n        ctx.beginPath();\n        ctx.moveTo(x + topLeft, y);\n        if (yAlign === 'top') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x + width - topRight, y);\n        ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n        if (yAlign === 'center' && xAlign === 'right') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x + width, y + height - bottomRight);\n        ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n        if (yAlign === 'bottom') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x + bottomLeft, y + height);\n        ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n        if (yAlign === 'center' && xAlign === 'left') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x, y + topLeft);\n        ctx.quadraticCurveTo(x, y, x + topLeft, y);\n        ctx.closePath();\n        ctx.fill();\n        if (options.borderWidth > 0) {\n            ctx.stroke();\n        }\n    }\n _updateAnimationTarget(options) {\n        const chart = this.chart;\n        const anims = this.$animations;\n        const animX = anims && anims.x;\n        const animY = anims && anims.y;\n        if (animX || animY) {\n            const position = positioners[options.position].call(this, this._active, this._eventPosition);\n            if (!position) {\n                return;\n            }\n            const size = this._size = getTooltipSize(this, options);\n            const positionAndSize = Object.assign({}, position, this._size);\n            const alignment = determineAlignment(chart, options, positionAndSize);\n            const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n            if (animX._to !== point.x || animY._to !== point.y) {\n                this.xAlign = alignment.xAlign;\n                this.yAlign = alignment.yAlign;\n                this.width = size.width;\n                this.height = size.height;\n                this.caretX = position.x;\n                this.caretY = position.y;\n                this._resolveAnimations().update(this, point);\n            }\n        }\n    }\n _willRender() {\n        return !!this.opacity;\n    }\n    draw(ctx) {\n        const options = this.options.setContext(this.getContext());\n        let opacity = this.opacity;\n        if (!opacity) {\n            return;\n        }\n        this._updateAnimationTarget(options);\n        const tooltipSize = {\n            width: this.width,\n            height: this.height\n        };\n        const pt = {\n            x: this.x,\n            y: this.y\n        };\n        opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n        const padding = toPadding(options.padding);\n        const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n        if (options.enabled && hasTooltipContent) {\n            ctx.save();\n            ctx.globalAlpha = opacity;\n            this.drawBackground(pt, ctx, tooltipSize, options);\n            overrideTextDirection(ctx, options.textDirection);\n            pt.y += padding.top;\n            this.drawTitle(pt, ctx, options);\n            this.drawBody(pt, ctx, options);\n            this.drawFooter(pt, ctx, options);\n            restoreTextDirection(ctx, options.textDirection);\n            ctx.restore();\n        }\n    }\n getActiveElements() {\n        return this._active || [];\n    }\n setActiveElements(activeElements, eventPosition) {\n        const lastActive = this._active;\n        const active = activeElements.map(({ datasetIndex , index  })=>{\n            const meta = this.chart.getDatasetMeta(datasetIndex);\n            if (!meta) {\n                throw new Error('Cannot find a dataset at index ' + datasetIndex);\n            }\n            return {\n                datasetIndex,\n                element: meta.data[index],\n                index\n            };\n        });\n        const changed = !_elementsEqual(lastActive, active);\n        const positionChanged = this._positionChanged(active, eventPosition);\n        if (changed || positionChanged) {\n            this._active = active;\n            this._eventPosition = eventPosition;\n            this._ignoreReplayEvents = true;\n            this.update(true);\n        }\n    }\n handleEvent(e, replay, inChartArea = true) {\n        if (replay && this._ignoreReplayEvents) {\n            return false;\n        }\n        this._ignoreReplayEvents = false;\n        const options = this.options;\n        const lastActive = this._active || [];\n        const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n        const positionChanged = this._positionChanged(active, e);\n        const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n        if (changed) {\n            this._active = active;\n            if (options.enabled || options.external) {\n                this._eventPosition = {\n                    x: e.x,\n                    y: e.y\n                };\n                this.update(true, replay);\n            }\n        }\n        return changed;\n    }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n        const options = this.options;\n        if (e.type === 'mouseout') {\n            return [];\n        }\n        if (!inChartArea) {\n            return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n        }\n        const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n        if (options.reverse) {\n            active.reverse();\n        }\n        return active;\n    }\n _positionChanged(active, e) {\n        const { caretX , caretY , options  } = this;\n        const position = positioners[options.position].call(this, active, e);\n        return position !== false && (caretX !== position.x || caretY !== position.y);\n    }\n}\nvar plugin_tooltip = {\n    id: 'tooltip',\n    _element: Tooltip,\n    positioners,\n    afterInit (chart, _args, options) {\n        if (options) {\n            chart.tooltip = new Tooltip({\n                chart,\n                options\n            });\n        }\n    },\n    beforeUpdate (chart, _args, options) {\n        if (chart.tooltip) {\n            chart.tooltip.initialize(options);\n        }\n    },\n    reset (chart, _args, options) {\n        if (chart.tooltip) {\n            chart.tooltip.initialize(options);\n        }\n    },\n    afterDraw (chart) {\n        const tooltip = chart.tooltip;\n        if (tooltip && tooltip._willRender()) {\n            const args = {\n                tooltip\n            };\n            if (chart.notifyPlugins('beforeTooltipDraw', {\n                ...args,\n                cancelable: true\n            }) === false) {\n                return;\n            }\n            tooltip.draw(chart.ctx);\n            chart.notifyPlugins('afterTooltipDraw', args);\n        }\n    },\n    afterEvent (chart, args) {\n        if (chart.tooltip) {\n            const useFinalPosition = args.replay;\n            if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n                args.changed = true;\n            }\n        }\n    },\n    defaults: {\n        enabled: true,\n        external: null,\n        position: 'average',\n        backgroundColor: 'rgba(0,0,0,0.8)',\n        titleColor: '#fff',\n        titleFont: {\n            weight: 'bold'\n        },\n        titleSpacing: 2,\n        titleMarginBottom: 6,\n        titleAlign: 'left',\n        bodyColor: '#fff',\n        bodySpacing: 2,\n        bodyFont: {},\n        bodyAlign: 'left',\n        footerColor: '#fff',\n        footerSpacing: 2,\n        footerMarginTop: 6,\n        footerFont: {\n            weight: 'bold'\n        },\n        footerAlign: 'left',\n        padding: 6,\n        caretPadding: 2,\n        caretSize: 5,\n        cornerRadius: 6,\n        boxHeight: (ctx, opts)=>opts.bodyFont.size,\n        boxWidth: (ctx, opts)=>opts.bodyFont.size,\n        multiKeyBackground: '#fff',\n        displayColors: true,\n        boxPadding: 0,\n        borderColor: 'rgba(0,0,0,0)',\n        borderWidth: 0,\n        animation: {\n            duration: 400,\n            easing: 'easeOutQuart'\n        },\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'width',\n                    'height',\n                    'caretX',\n                    'caretY'\n                ]\n            },\n            opacity: {\n                easing: 'linear',\n                duration: 200\n            }\n        },\n        callbacks: defaultCallbacks\n    },\n    defaultRoutes: {\n        bodyFont: 'font',\n        footerFont: 'font',\n        titleFont: 'font'\n    },\n    descriptors: {\n        _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n        _indexable: false,\n        callbacks: {\n            _scriptable: false,\n            _indexable: false\n        },\n        animation: {\n            _fallback: false\n        },\n        animations: {\n            _fallback: 'animation'\n        }\n    },\n    additionalOptionScopes: [\n        'interaction'\n    ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n    if (typeof raw === 'string') {\n        index = labels.push(raw) - 1;\n        addedLabels.unshift({\n            index,\n            label: raw\n        });\n    } else if (isNaN(raw)) {\n        index = null;\n    }\n    return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n    const first = labels.indexOf(raw);\n    if (first === -1) {\n        return addIfString(labels, raw, index, addedLabels);\n    }\n    const last = labels.lastIndexOf(raw);\n    return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n    const labels = this.getLabels();\n    if (value >= 0 && value < labels.length) {\n        return labels[value];\n    }\n    return value;\n}\nclass CategoryScale extends Scale {\n    static id = 'category';\n static defaults = {\n        ticks: {\n            callback: _getLabelForValue\n        }\n    };\n    constructor(cfg){\n        super(cfg);\n         this._startValue = undefined;\n        this._valueRange = 0;\n        this._addedLabels = [];\n    }\n    init(scaleOptions) {\n        const added = this._addedLabels;\n        if (added.length) {\n            const labels = this.getLabels();\n            for (const { index , label  } of added){\n                if (labels[index] === label) {\n                    labels.splice(index, 1);\n                }\n            }\n            this._addedLabels = [];\n        }\n        super.init(scaleOptions);\n    }\n    parse(raw, index) {\n        if (isNullOrUndef(raw)) {\n            return null;\n        }\n        const labels = this.getLabels();\n        index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n        return validIndex(index, labels.length - 1);\n    }\n    determineDataLimits() {\n        const { minDefined , maxDefined  } = this.getUserBounds();\n        let { min , max  } = this.getMinMax(true);\n        if (this.options.bounds === 'ticks') {\n            if (!minDefined) {\n                min = 0;\n            }\n            if (!maxDefined) {\n                max = this.getLabels().length - 1;\n            }\n        }\n        this.min = min;\n        this.max = max;\n    }\n    buildTicks() {\n        const min = this.min;\n        const max = this.max;\n        const offset = this.options.offset;\n        const ticks = [];\n        let labels = this.getLabels();\n        labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n        this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n        this._startValue = this.min - (offset ? 0.5 : 0);\n        for(let value = min; value <= max; value++){\n            ticks.push({\n                value\n            });\n        }\n        return ticks;\n    }\n    getLabelForValue(value) {\n        return _getLabelForValue.call(this, value);\n    }\n configure() {\n        super.configure();\n        if (!this.isHorizontal()) {\n            this._reversePixels = !this._reversePixels;\n        }\n    }\n    getPixelForValue(value) {\n        if (typeof value !== 'number') {\n            value = this.parse(value);\n        }\n        return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n    }\n    getPixelForTick(index) {\n        const ticks = this.ticks;\n        if (index < 0 || index > ticks.length - 1) {\n            return null;\n        }\n        return this.getPixelForValue(ticks[index].value);\n    }\n    getValueForPixel(pixel) {\n        return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n    }\n    getBasePixel() {\n        return this.bottom;\n    }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n    const ticks = [];\n    const MIN_SPACING = 1e-14;\n    const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds  } = generationOptions;\n    const unit = step || 1;\n    const maxSpaces = maxTicks - 1;\n    const { min: rmin , max: rmax  } = dataRange;\n    const minDefined = !isNullOrUndef(min);\n    const maxDefined = !isNullOrUndef(max);\n    const countDefined = !isNullOrUndef(count);\n    const minSpacing = (rmax - rmin) / (maxDigits + 1);\n    let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n    let factor, niceMin, niceMax, numSpaces;\n    if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n        return [\n            {\n                value: rmin\n            },\n            {\n                value: rmax\n            }\n        ];\n    }\n    numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n    if (numSpaces > maxSpaces) {\n        spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n    }\n    if (!isNullOrUndef(precision)) {\n        factor = Math.pow(10, precision);\n        spacing = Math.ceil(spacing * factor) / factor;\n    }\n    if (bounds === 'ticks') {\n        niceMin = Math.floor(rmin / spacing) * spacing;\n        niceMax = Math.ceil(rmax / spacing) * spacing;\n    } else {\n        niceMin = rmin;\n        niceMax = rmax;\n    }\n    if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n        numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n        spacing = (max - min) / numSpaces;\n        niceMin = min;\n        niceMax = max;\n    } else if (countDefined) {\n        niceMin = minDefined ? min : niceMin;\n        niceMax = maxDefined ? max : niceMax;\n        numSpaces = count - 1;\n        spacing = (niceMax - niceMin) / numSpaces;\n    } else {\n        numSpaces = (niceMax - niceMin) / spacing;\n        if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n            numSpaces = Math.round(numSpaces);\n        } else {\n            numSpaces = Math.ceil(numSpaces);\n        }\n    }\n    const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n    factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n    niceMin = Math.round(niceMin * factor) / factor;\n    niceMax = Math.round(niceMax * factor) / factor;\n    let j = 0;\n    if (minDefined) {\n        if (includeBounds && niceMin !== min) {\n            ticks.push({\n                value: min\n            });\n            if (niceMin < min) {\n                j++;\n            }\n            if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n                j++;\n            }\n        } else if (niceMin < min) {\n            j++;\n        }\n    }\n    for(; j < numSpaces; ++j){\n        const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n        if (maxDefined && tickValue > max) {\n            break;\n        }\n        ticks.push({\n            value: tickValue\n        });\n    }\n    if (maxDefined && includeBounds && niceMax !== max) {\n        if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n            ticks[ticks.length - 1].value = max;\n        } else {\n            ticks.push({\n                value: max\n            });\n        }\n    } else if (!maxDefined || niceMax === max) {\n        ticks.push({\n            value: niceMax\n        });\n    }\n    return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation  }) {\n    const rad = toRadians(minRotation);\n    const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n    const length = 0.75 * minSpacing * ('' + value).length;\n    return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n    constructor(cfg){\n        super(cfg);\n         this.start = undefined;\n         this.end = undefined;\n         this._startValue = undefined;\n         this._endValue = undefined;\n        this._valueRange = 0;\n    }\n    parse(raw, index) {\n        if (isNullOrUndef(raw)) {\n            return null;\n        }\n        if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n            return null;\n        }\n        return +raw;\n    }\n    handleTickRangeOptions() {\n        const { beginAtZero  } = this.options;\n        const { minDefined , maxDefined  } = this.getUserBounds();\n        let { min , max  } = this;\n        const setMin = (v)=>min = minDefined ? min : v;\n        const setMax = (v)=>max = maxDefined ? max : v;\n        if (beginAtZero) {\n            const minSign = sign(min);\n            const maxSign = sign(max);\n            if (minSign < 0 && maxSign < 0) {\n                setMax(0);\n            } else if (minSign > 0 && maxSign > 0) {\n                setMin(0);\n            }\n        }\n        if (min === max) {\n            let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n            setMax(max + offset);\n            if (!beginAtZero) {\n                setMin(min - offset);\n            }\n        }\n        this.min = min;\n        this.max = max;\n    }\n    getTickLimit() {\n        const tickOpts = this.options.ticks;\n        let { maxTicksLimit , stepSize  } = tickOpts;\n        let maxTicks;\n        if (stepSize) {\n            maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n            if (maxTicks > 1000) {\n                console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n                maxTicks = 1000;\n            }\n        } else {\n            maxTicks = this.computeTickLimit();\n            maxTicksLimit = maxTicksLimit || 11;\n        }\n        if (maxTicksLimit) {\n            maxTicks = Math.min(maxTicksLimit, maxTicks);\n        }\n        return maxTicks;\n    }\n computeTickLimit() {\n        return Number.POSITIVE_INFINITY;\n    }\n    buildTicks() {\n        const opts = this.options;\n        const tickOpts = opts.ticks;\n        let maxTicks = this.getTickLimit();\n        maxTicks = Math.max(2, maxTicks);\n        const numericGeneratorOptions = {\n            maxTicks,\n            bounds: opts.bounds,\n            min: opts.min,\n            max: opts.max,\n            precision: tickOpts.precision,\n            step: tickOpts.stepSize,\n            count: tickOpts.count,\n            maxDigits: this._maxDigits(),\n            horizontal: this.isHorizontal(),\n            minRotation: tickOpts.minRotation || 0,\n            includeBounds: tickOpts.includeBounds !== false\n        };\n        const dataRange = this._range || this;\n        const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n        if (opts.bounds === 'ticks') {\n            _setMinAndMaxByKey(ticks, this, 'value');\n        }\n        if (opts.reverse) {\n            ticks.reverse();\n            this.start = this.max;\n            this.end = this.min;\n        } else {\n            this.start = this.min;\n            this.end = this.max;\n        }\n        return ticks;\n    }\n configure() {\n        const ticks = this.ticks;\n        let start = this.min;\n        let end = this.max;\n        super.configure();\n        if (this.options.offset && ticks.length) {\n            const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n            start -= offset;\n            end += offset;\n        }\n        this._startValue = start;\n        this._endValue = end;\n        this._valueRange = end - start;\n    }\n    getLabelForValue(value) {\n        return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n    }\n}\n\nclass LinearScale extends LinearScaleBase {\n    static id = 'linear';\n static defaults = {\n        ticks: {\n            callback: Ticks.formatters.numeric\n        }\n    };\n    determineDataLimits() {\n        const { min , max  } = this.getMinMax(true);\n        this.min = isNumberFinite(min) ? min : 0;\n        this.max = isNumberFinite(max) ? max : 1;\n        this.handleTickRangeOptions();\n    }\n computeTickLimit() {\n        const horizontal = this.isHorizontal();\n        const length = horizontal ? this.width : this.height;\n        const minRotation = toRadians(this.options.ticks.minRotation);\n        const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n        const tickFont = this._resolveTickFontOptions(0);\n        return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n    }\n    getPixelForValue(value) {\n        return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n    }\n    getValueForPixel(pixel) {\n        return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n    }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n    const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n    return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n    const rangeStep = Math.pow(10, rangeExp);\n    const start = Math.floor(min / rangeStep);\n    const end = Math.ceil(max / rangeStep);\n    return end - start;\n}\nfunction startExp(min, max) {\n    const range = max - min;\n    let rangeExp = log10Floor(range);\n    while(steps(min, max, rangeExp) > 10){\n        rangeExp++;\n    }\n    while(steps(min, max, rangeExp) < 10){\n        rangeExp--;\n    }\n    return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max  }) {\n    min = finiteOrDefault(generationOptions.min, min);\n    const ticks = [];\n    const minExp = log10Floor(min);\n    let exp = startExp(min, max);\n    let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n    const stepSize = Math.pow(10, exp);\n    const base = minExp > exp ? Math.pow(10, minExp) : 0;\n    const start = Math.round((min - base) * precision) / precision;\n    const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n    let significand = Math.floor((start - offset) / Math.pow(10, exp));\n    let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n    while(value < max){\n        ticks.push({\n            value,\n            major: isMajor(value),\n            significand\n        });\n        if (significand >= 10) {\n            significand = significand < 15 ? 15 : 20;\n        } else {\n            significand++;\n        }\n        if (significand >= 20) {\n            exp++;\n            significand = 2;\n            precision = exp >= 0 ? 1 : precision;\n        }\n        value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n    }\n    const lastTick = finiteOrDefault(generationOptions.max, value);\n    ticks.push({\n        value: lastTick,\n        major: isMajor(lastTick),\n        significand\n    });\n    return ticks;\n}\nclass LogarithmicScale extends Scale {\n    static id = 'logarithmic';\n static defaults = {\n        ticks: {\n            callback: Ticks.formatters.logarithmic,\n            major: {\n                enabled: true\n            }\n        }\n    };\n    constructor(cfg){\n        super(cfg);\n         this.start = undefined;\n         this.end = undefined;\n         this._startValue = undefined;\n        this._valueRange = 0;\n    }\n    parse(raw, index) {\n        const value = LinearScaleBase.prototype.parse.apply(this, [\n            raw,\n            index\n        ]);\n        if (value === 0) {\n            this._zero = true;\n            return undefined;\n        }\n        return isNumberFinite(value) && value > 0 ? value : null;\n    }\n    determineDataLimits() {\n        const { min , max  } = this.getMinMax(true);\n        this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n        this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n        if (this.options.beginAtZero) {\n            this._zero = true;\n        }\n        if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n            this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n        }\n        this.handleTickRangeOptions();\n    }\n    handleTickRangeOptions() {\n        const { minDefined , maxDefined  } = this.getUserBounds();\n        let min = this.min;\n        let max = this.max;\n        const setMin = (v)=>min = minDefined ? min : v;\n        const setMax = (v)=>max = maxDefined ? max : v;\n        if (min === max) {\n            if (min <= 0) {\n                setMin(1);\n                setMax(10);\n            } else {\n                setMin(changeExponent(min, -1));\n                setMax(changeExponent(max, +1));\n            }\n        }\n        if (min <= 0) {\n            setMin(changeExponent(max, -1));\n        }\n        if (max <= 0) {\n            setMax(changeExponent(min, +1));\n        }\n        this.min = min;\n        this.max = max;\n    }\n    buildTicks() {\n        const opts = this.options;\n        const generationOptions = {\n            min: this._userMin,\n            max: this._userMax\n        };\n        const ticks = generateTicks(generationOptions, this);\n        if (opts.bounds === 'ticks') {\n            _setMinAndMaxByKey(ticks, this, 'value');\n        }\n        if (opts.reverse) {\n            ticks.reverse();\n            this.start = this.max;\n            this.end = this.min;\n        } else {\n            this.start = this.min;\n            this.end = this.max;\n        }\n        return ticks;\n    }\n getLabelForValue(value) {\n        return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n    }\n configure() {\n        const start = this.min;\n        super.configure();\n        this._startValue = log10(start);\n        this._valueRange = log10(this.max) - log10(start);\n    }\n    getPixelForValue(value) {\n        if (value === undefined || value === 0) {\n            value = this.min;\n        }\n        if (value === null || isNaN(value)) {\n            return NaN;\n        }\n        return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n    }\n    getValueForPixel(pixel) {\n        const decimal = this.getDecimalForPixel(pixel);\n        return Math.pow(10, this._startValue + decimal * this._valueRange);\n    }\n}\n\nfunction getTickBackdropHeight(opts) {\n    const tickOpts = opts.ticks;\n    if (tickOpts.display && opts.display) {\n        const padding = toPadding(tickOpts.backdropPadding);\n        return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n    }\n    return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n    label = isArray(label) ? label : [\n        label\n    ];\n    return {\n        w: _longestText(ctx, font.string, label),\n        h: label.length * font.lineHeight\n    };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n    if (angle === min || angle === max) {\n        return {\n            start: pos - size / 2,\n            end: pos + size / 2\n        };\n    } else if (angle < min || angle > max) {\n        return {\n            start: pos - size,\n            end: pos\n        };\n    }\n    return {\n        start: pos,\n        end: pos + size\n    };\n}\n function fitWithPointLabels(scale) {\n    const orig = {\n        l: scale.left + scale._padding.left,\n        r: scale.right - scale._padding.right,\n        t: scale.top + scale._padding.top,\n        b: scale.bottom - scale._padding.bottom\n    };\n    const limits = Object.assign({}, orig);\n    const labelSizes = [];\n    const padding = [];\n    const valueCount = scale._pointLabels.length;\n    const pointLabelOpts = scale.options.pointLabels;\n    const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n    for(let i = 0; i < valueCount; i++){\n        const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n        padding[i] = opts.padding;\n        const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n        const plFont = toFont(opts.font);\n        const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n        labelSizes[i] = textSize;\n        const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n        const angle = Math.round(toDegrees(angleRadians));\n        const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n        const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n        updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n    }\n    scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n    scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n    const sin = Math.abs(Math.sin(angle));\n    const cos = Math.abs(Math.cos(angle));\n    let x = 0;\n    let y = 0;\n    if (hLimits.start < orig.l) {\n        x = (orig.l - hLimits.start) / sin;\n        limits.l = Math.min(limits.l, orig.l - x);\n    } else if (hLimits.end > orig.r) {\n        x = (hLimits.end - orig.r) / sin;\n        limits.r = Math.max(limits.r, orig.r + x);\n    }\n    if (vLimits.start < orig.t) {\n        y = (orig.t - vLimits.start) / cos;\n        limits.t = Math.min(limits.t, orig.t - y);\n    } else if (vLimits.end > orig.b) {\n        y = (vLimits.end - orig.b) / cos;\n        limits.b = Math.max(limits.b, orig.b + y);\n    }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n    const outerDistance = scale.drawingArea;\n    const { extra , additionalAngle , padding , size  } = itemOpts;\n    const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n    const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n    const y = yForAngle(pointLabelPosition.y, size.h, angle);\n    const textAlign = getTextAlignForAngle(angle);\n    const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n    return {\n        visible: true,\n        x: pointLabelPosition.x,\n        y,\n        textAlign,\n        left,\n        top: y,\n        right: left + size.w,\n        bottom: y + size.h\n    };\n}\nfunction isNotOverlapped(item, area) {\n    if (!area) {\n        return true;\n    }\n    const { left , top , right , bottom  } = item;\n    const apexesInArea = _isPointInArea({\n        x: left,\n        y: top\n    }, area) || _isPointInArea({\n        x: left,\n        y: bottom\n    }, area) || _isPointInArea({\n        x: right,\n        y: top\n    }, area) || _isPointInArea({\n        x: right,\n        y: bottom\n    }, area);\n    return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n    const items = [];\n    const valueCount = scale._pointLabels.length;\n    const opts = scale.options;\n    const { centerPointLabels , display  } = opts.pointLabels;\n    const itemOpts = {\n        extra: getTickBackdropHeight(opts) / 2,\n        additionalAngle: centerPointLabels ? PI / valueCount : 0\n    };\n    let area;\n    for(let i = 0; i < valueCount; i++){\n        itemOpts.padding = padding[i];\n        itemOpts.size = labelSizes[i];\n        const item = createPointLabelItem(scale, i, itemOpts);\n        items.push(item);\n        if (display === 'auto') {\n            item.visible = isNotOverlapped(item, area);\n            if (item.visible) {\n                area = item;\n            }\n        }\n    }\n    return items;\n}\nfunction getTextAlignForAngle(angle) {\n    if (angle === 0 || angle === 180) {\n        return 'center';\n    } else if (angle < 180) {\n        return 'left';\n    }\n    return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n    if (align === 'right') {\n        x -= w;\n    } else if (align === 'center') {\n        x -= w / 2;\n    }\n    return x;\n}\nfunction yForAngle(y, h, angle) {\n    if (angle === 90 || angle === 270) {\n        y -= h / 2;\n    } else if (angle > 270 || angle < 90) {\n        y -= h;\n    }\n    return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n    const { left , top , right , bottom  } = item;\n    const { backdropColor  } = opts;\n    if (!isNullOrUndef(backdropColor)) {\n        const borderRadius = toTRBLCorners(opts.borderRadius);\n        const padding = toPadding(opts.backdropPadding);\n        ctx.fillStyle = backdropColor;\n        const backdropLeft = left - padding.left;\n        const backdropTop = top - padding.top;\n        const backdropWidth = right - left + padding.width;\n        const backdropHeight = bottom - top + padding.height;\n        if (Object.values(borderRadius).some((v)=>v !== 0)) {\n            ctx.beginPath();\n            addRoundedRectPath(ctx, {\n                x: backdropLeft,\n                y: backdropTop,\n                w: backdropWidth,\n                h: backdropHeight,\n                radius: borderRadius\n            });\n            ctx.fill();\n        } else {\n            ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n        }\n    }\n}\nfunction drawPointLabels(scale, labelCount) {\n    const { ctx , options: { pointLabels  }  } = scale;\n    for(let i = labelCount - 1; i >= 0; i--){\n        const item = scale._pointLabelItems[i];\n        if (!item.visible) {\n            continue;\n        }\n        const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n        drawPointLabelBox(ctx, optsAtIndex, item);\n        const plFont = toFont(optsAtIndex.font);\n        const { x , y , textAlign  } = item;\n        renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n            color: optsAtIndex.color,\n            textAlign: textAlign,\n            textBaseline: 'middle'\n        });\n    }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n    const { ctx  } = scale;\n    if (circular) {\n        ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n    } else {\n        let pointPosition = scale.getPointPosition(0, radius);\n        ctx.moveTo(pointPosition.x, pointPosition.y);\n        for(let i = 1; i < labelCount; i++){\n            pointPosition = scale.getPointPosition(i, radius);\n            ctx.lineTo(pointPosition.x, pointPosition.y);\n        }\n    }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n    const ctx = scale.ctx;\n    const circular = gridLineOpts.circular;\n    const { color , lineWidth  } = gridLineOpts;\n    if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n        return;\n    }\n    ctx.save();\n    ctx.strokeStyle = color;\n    ctx.lineWidth = lineWidth;\n    ctx.setLineDash(borderOpts.dash || []);\n    ctx.lineDashOffset = borderOpts.dashOffset;\n    ctx.beginPath();\n    pathRadiusLine(scale, radius, circular, labelCount);\n    ctx.closePath();\n    ctx.stroke();\n    ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n    return createContext(parent, {\n        label,\n        index,\n        type: 'pointLabel'\n    });\n}\nclass RadialLinearScale extends LinearScaleBase {\n    static id = 'radialLinear';\n static defaults = {\n        display: true,\n        animate: true,\n        position: 'chartArea',\n        angleLines: {\n            display: true,\n            lineWidth: 1,\n            borderDash: [],\n            borderDashOffset: 0.0\n        },\n        grid: {\n            circular: false\n        },\n        startAngle: 0,\n        ticks: {\n            showLabelBackdrop: true,\n            callback: Ticks.formatters.numeric\n        },\n        pointLabels: {\n            backdropColor: undefined,\n            backdropPadding: 2,\n            display: true,\n            font: {\n                size: 10\n            },\n            callback (label) {\n                return label;\n            },\n            padding: 5,\n            centerPointLabels: false\n        }\n    };\n    static defaultRoutes = {\n        'angleLines.color': 'borderColor',\n        'pointLabels.color': 'color',\n        'ticks.color': 'color'\n    };\n    static descriptors = {\n        angleLines: {\n            _fallback: 'grid'\n        }\n    };\n    constructor(cfg){\n        super(cfg);\n         this.xCenter = undefined;\n         this.yCenter = undefined;\n         this.drawingArea = undefined;\n         this._pointLabels = [];\n        this._pointLabelItems = [];\n    }\n    setDimensions() {\n        const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n        const w = this.width = this.maxWidth - padding.width;\n        const h = this.height = this.maxHeight - padding.height;\n        this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n        this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n        this.drawingArea = Math.floor(Math.min(w, h) / 2);\n    }\n    determineDataLimits() {\n        const { min , max  } = this.getMinMax(false);\n        this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n        this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n        this.handleTickRangeOptions();\n    }\n computeTickLimit() {\n        return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n    }\n    generateTickLabels(ticks) {\n        LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n        this._pointLabels = this.getLabels().map((value, index)=>{\n            const label = callback(this.options.pointLabels.callback, [\n                value,\n                index\n            ], this);\n            return label || label === 0 ? label : '';\n        }).filter((v, i)=>this.chart.getDataVisibility(i));\n    }\n    fit() {\n        const opts = this.options;\n        if (opts.display && opts.pointLabels.display) {\n            fitWithPointLabels(this);\n        } else {\n            this.setCenterPoint(0, 0, 0, 0);\n        }\n    }\n    setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n        this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n        this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n        this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n    }\n    getIndexAngle(index) {\n        const angleMultiplier = TAU / (this._pointLabels.length || 1);\n        const startAngle = this.options.startAngle || 0;\n        return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n    }\n    getDistanceFromCenterForValue(value) {\n        if (isNullOrUndef(value)) {\n            return NaN;\n        }\n        const scalingFactor = this.drawingArea / (this.max - this.min);\n        if (this.options.reverse) {\n            return (this.max - value) * scalingFactor;\n        }\n        return (value - this.min) * scalingFactor;\n    }\n    getValueForDistanceFromCenter(distance) {\n        if (isNullOrUndef(distance)) {\n            return NaN;\n        }\n        const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n        return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n    }\n    getPointLabelContext(index) {\n        const pointLabels = this._pointLabels || [];\n        if (index >= 0 && index < pointLabels.length) {\n            const pointLabel = pointLabels[index];\n            return createPointLabelContext(this.getContext(), index, pointLabel);\n        }\n    }\n    getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n        const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n        return {\n            x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n            y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n            angle\n        };\n    }\n    getPointPositionForValue(index, value) {\n        return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n    }\n    getBasePosition(index) {\n        return this.getPointPositionForValue(index || 0, this.getBaseValue());\n    }\n    getPointLabelPosition(index) {\n        const { left , top , right , bottom  } = this._pointLabelItems[index];\n        return {\n            left,\n            top,\n            right,\n            bottom\n        };\n    }\n drawBackground() {\n        const { backgroundColor , grid: { circular  }  } = this.options;\n        if (backgroundColor) {\n            const ctx = this.ctx;\n            ctx.save();\n            ctx.beginPath();\n            pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n            ctx.closePath();\n            ctx.fillStyle = backgroundColor;\n            ctx.fill();\n            ctx.restore();\n        }\n    }\n drawGrid() {\n        const ctx = this.ctx;\n        const opts = this.options;\n        const { angleLines , grid , border  } = opts;\n        const labelCount = this._pointLabels.length;\n        let i, offset, position;\n        if (opts.pointLabels.display) {\n            drawPointLabels(this, labelCount);\n        }\n        if (grid.display) {\n            this.ticks.forEach((tick, index)=>{\n                if (index !== 0 || index === 0 && this.min < 0) {\n                    offset = this.getDistanceFromCenterForValue(tick.value);\n                    const context = this.getContext(index);\n                    const optsAtIndex = grid.setContext(context);\n                    const optsAtIndexBorder = border.setContext(context);\n                    drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n                }\n            });\n        }\n        if (angleLines.display) {\n            ctx.save();\n            for(i = labelCount - 1; i >= 0; i--){\n                const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n                const { color , lineWidth  } = optsAtIndex;\n                if (!lineWidth || !color) {\n                    continue;\n                }\n                ctx.lineWidth = lineWidth;\n                ctx.strokeStyle = color;\n                ctx.setLineDash(optsAtIndex.borderDash);\n                ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n                offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n                position = this.getPointPosition(i, offset);\n                ctx.beginPath();\n                ctx.moveTo(this.xCenter, this.yCenter);\n                ctx.lineTo(position.x, position.y);\n                ctx.stroke();\n            }\n            ctx.restore();\n        }\n    }\n drawBorder() {}\n drawLabels() {\n        const ctx = this.ctx;\n        const opts = this.options;\n        const tickOpts = opts.ticks;\n        if (!tickOpts.display) {\n            return;\n        }\n        const startAngle = this.getIndexAngle(0);\n        let offset, width;\n        ctx.save();\n        ctx.translate(this.xCenter, this.yCenter);\n        ctx.rotate(startAngle);\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'middle';\n        this.ticks.forEach((tick, index)=>{\n            if (index === 0 && this.min >= 0 && !opts.reverse) {\n                return;\n            }\n            const optsAtIndex = tickOpts.setContext(this.getContext(index));\n            const tickFont = toFont(optsAtIndex.font);\n            offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n            if (optsAtIndex.showLabelBackdrop) {\n                ctx.font = tickFont.string;\n                width = ctx.measureText(tick.label).width;\n                ctx.fillStyle = optsAtIndex.backdropColor;\n                const padding = toPadding(optsAtIndex.backdropPadding);\n                ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n            }\n            renderText(ctx, tick.label, 0, -offset, tickFont, {\n                color: optsAtIndex.color,\n                strokeColor: optsAtIndex.textStrokeColor,\n                strokeWidth: optsAtIndex.textStrokeWidth\n            });\n        });\n        ctx.restore();\n    }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n    millisecond: {\n        common: true,\n        size: 1,\n        steps: 1000\n    },\n    second: {\n        common: true,\n        size: 1000,\n        steps: 60\n    },\n    minute: {\n        common: true,\n        size: 60000,\n        steps: 60\n    },\n    hour: {\n        common: true,\n        size: 3600000,\n        steps: 24\n    },\n    day: {\n        common: true,\n        size: 86400000,\n        steps: 30\n    },\n    week: {\n        common: false,\n        size: 604800000,\n        steps: 4\n    },\n    month: {\n        common: true,\n        size: 2.628e9,\n        steps: 12\n    },\n    quarter: {\n        common: false,\n        size: 7.884e9,\n        steps: 4\n    },\n    year: {\n        common: true,\n        size: 3.154e10\n    }\n};\n const UNITS =  /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n    return a - b;\n}\n function parse(scale, input) {\n    if (isNullOrUndef(input)) {\n        return null;\n    }\n    const adapter = scale._adapter;\n    const { parser , round , isoWeekday  } = scale._parseOpts;\n    let value = input;\n    if (typeof parser === 'function') {\n        value = parser(value);\n    }\n    if (!isNumberFinite(value)) {\n        value = typeof parser === 'string' ? adapter.parse(value,  parser) : adapter.parse(value);\n    }\n    if (value === null) {\n        return null;\n    }\n    if (round) {\n        value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n    }\n    return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n    const ilen = UNITS.length;\n    for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n        const interval = INTERVALS[UNITS[i]];\n        const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n        if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n            return UNITS[i];\n        }\n    }\n    return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n    for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n        const unit = UNITS[i];\n        if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n            return unit;\n        }\n    }\n    return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n    for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n        if (INTERVALS[UNITS[i]].common) {\n            return UNITS[i];\n        }\n    }\n}\n function addTick(ticks, time, timestamps) {\n    if (!timestamps) {\n        ticks[time] = true;\n    } else if (timestamps.length) {\n        const { lo , hi  } = _lookup(timestamps, time);\n        const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n        ticks[timestamp] = true;\n    }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n    const adapter = scale._adapter;\n    const first = +adapter.startOf(ticks[0].value, majorUnit);\n    const last = ticks[ticks.length - 1].value;\n    let major, index;\n    for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n        index = map[major];\n        if (index >= 0) {\n            ticks[index].major = true;\n        }\n    }\n    return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n    const ticks = [];\n     const map = {};\n    const ilen = values.length;\n    let i, value;\n    for(i = 0; i < ilen; ++i){\n        value = values[i];\n        map[value] = i;\n        ticks.push({\n            value,\n            major: false\n        });\n    }\n    return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n    static id = 'time';\n static defaults = {\n bounds: 'data',\n        adapters: {},\n        time: {\n            parser: false,\n            unit: false,\n            round: false,\n            isoWeekday: false,\n            minUnit: 'millisecond',\n            displayFormats: {}\n        },\n        ticks: {\n source: 'auto',\n            callback: false,\n            major: {\n                enabled: false\n            }\n        }\n    };\n constructor(props){\n        super(props);\n         this._cache = {\n            data: [],\n            labels: [],\n            all: []\n        };\n         this._unit = 'day';\n         this._majorUnit = undefined;\n        this._offsets = {};\n        this._normalized = false;\n        this._parseOpts = undefined;\n    }\n    init(scaleOpts, opts = {}) {\n        const time = scaleOpts.time || (scaleOpts.time = {});\n         const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n        adapter.init(opts);\n        mergeIf(time.displayFormats, adapter.formats());\n        this._parseOpts = {\n            parser: time.parser,\n            round: time.round,\n            isoWeekday: time.isoWeekday\n        };\n        super.init(scaleOpts);\n        this._normalized = opts.normalized;\n    }\n parse(raw, index) {\n        if (raw === undefined) {\n            return null;\n        }\n        return parse(this, raw);\n    }\n    beforeLayout() {\n        super.beforeLayout();\n        this._cache = {\n            data: [],\n            labels: [],\n            all: []\n        };\n    }\n    determineDataLimits() {\n        const options = this.options;\n        const adapter = this._adapter;\n        const unit = options.time.unit || 'day';\n        let { min , max , minDefined , maxDefined  } = this.getUserBounds();\n function _applyBounds(bounds) {\n            if (!minDefined && !isNaN(bounds.min)) {\n                min = Math.min(min, bounds.min);\n            }\n            if (!maxDefined && !isNaN(bounds.max)) {\n                max = Math.max(max, bounds.max);\n            }\n        }\n        if (!minDefined || !maxDefined) {\n            _applyBounds(this._getLabelBounds());\n            if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n                _applyBounds(this.getMinMax(false));\n            }\n        }\n        min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n        max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n        this.min = Math.min(min, max - 1);\n        this.max = Math.max(min + 1, max);\n    }\n _getLabelBounds() {\n        const arr = this.getLabelTimestamps();\n        let min = Number.POSITIVE_INFINITY;\n        let max = Number.NEGATIVE_INFINITY;\n        if (arr.length) {\n            min = arr[0];\n            max = arr[arr.length - 1];\n        }\n        return {\n            min,\n            max\n        };\n    }\n buildTicks() {\n        const options = this.options;\n        const timeOpts = options.time;\n        const tickOpts = options.ticks;\n        const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n        if (options.bounds === 'ticks' && timestamps.length) {\n            this.min = this._userMin || timestamps[0];\n            this.max = this._userMax || timestamps[timestamps.length - 1];\n        }\n        const min = this.min;\n        const max = this.max;\n        const ticks = _filterBetween(timestamps, min, max);\n        this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n        this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n        this.initOffsets(timestamps);\n        if (options.reverse) {\n            ticks.reverse();\n        }\n        return ticksFromTimestamps(this, ticks, this._majorUnit);\n    }\n    afterAutoSkip() {\n        if (this.options.offsetAfterAutoskip) {\n            this.initOffsets(this.ticks.map((tick)=>+tick.value));\n        }\n    }\n initOffsets(timestamps = []) {\n        let start = 0;\n        let end = 0;\n        let first, last;\n        if (this.options.offset && timestamps.length) {\n            first = this.getDecimalForValue(timestamps[0]);\n            if (timestamps.length === 1) {\n                start = 1 - first;\n            } else {\n                start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n            }\n            last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n            if (timestamps.length === 1) {\n                end = last;\n            } else {\n                end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n            }\n        }\n        const limit = timestamps.length < 3 ? 0.5 : 0.25;\n        start = _limitValue(start, 0, limit);\n        end = _limitValue(end, 0, limit);\n        this._offsets = {\n            start,\n            end,\n            factor: 1 / (start + 1 + end)\n        };\n    }\n _generate() {\n        const adapter = this._adapter;\n        const min = this.min;\n        const max = this.max;\n        const options = this.options;\n        const timeOpts = options.time;\n        const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n        const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n        const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n        const hasWeekday = isNumber(weekday) || weekday === true;\n        const ticks = {};\n        let first = min;\n        let time, count;\n        if (hasWeekday) {\n            first = +adapter.startOf(first, 'isoWeek', weekday);\n        }\n        first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n        if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n            throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n        }\n        const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n        for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n            addTick(ticks, time, timestamps);\n        }\n        if (time === max || options.bounds === 'ticks' || count === 1) {\n            addTick(ticks, time, timestamps);\n        }\n        return Object.keys(ticks).sort(sorter).map((x)=>+x);\n    }\n getLabelForValue(value) {\n        const adapter = this._adapter;\n        const timeOpts = this.options.time;\n        if (timeOpts.tooltipFormat) {\n            return adapter.format(value, timeOpts.tooltipFormat);\n        }\n        return adapter.format(value, timeOpts.displayFormats.datetime);\n    }\n format(value, format) {\n        const options = this.options;\n        const formats = options.time.displayFormats;\n        const unit = this._unit;\n        const fmt = format || formats[unit];\n        return this._adapter.format(value, fmt);\n    }\n _tickFormatFunction(time, index, ticks, format) {\n        const options = this.options;\n        const formatter = options.ticks.callback;\n        if (formatter) {\n            return callback(formatter, [\n                time,\n                index,\n                ticks\n            ], this);\n        }\n        const formats = options.time.displayFormats;\n        const unit = this._unit;\n        const majorUnit = this._majorUnit;\n        const minorFormat = unit && formats[unit];\n        const majorFormat = majorUnit && formats[majorUnit];\n        const tick = ticks[index];\n        const major = majorUnit && majorFormat && tick && tick.major;\n        return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n    }\n generateTickLabels(ticks) {\n        let i, ilen, tick;\n        for(i = 0, ilen = ticks.length; i < ilen; ++i){\n            tick = ticks[i];\n            tick.label = this._tickFormatFunction(tick.value, i, ticks);\n        }\n    }\n getDecimalForValue(value) {\n        return value === null ? NaN : (value - this.min) / (this.max - this.min);\n    }\n getPixelForValue(value) {\n        const offsets = this._offsets;\n        const pos = this.getDecimalForValue(value);\n        return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n    }\n getValueForPixel(pixel) {\n        const offsets = this._offsets;\n        const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n        return this.min + pos * (this.max - this.min);\n    }\n _getLabelSize(label) {\n        const ticksOpts = this.options.ticks;\n        const tickLabelWidth = this.ctx.measureText(label).width;\n        const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n        const cosRotation = Math.cos(angle);\n        const sinRotation = Math.sin(angle);\n        const tickFontSize = this._resolveTickFontOptions(0).size;\n        return {\n            w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n            h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n        };\n    }\n _getLabelCapacity(exampleTime) {\n        const timeOpts = this.options.time;\n        const displayFormats = timeOpts.displayFormats;\n        const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n        const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n            exampleTime\n        ], this._majorUnit), format);\n        const size = this._getLabelSize(exampleLabel);\n        const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n        return capacity > 0 ? capacity : 1;\n    }\n getDataTimestamps() {\n        let timestamps = this._cache.data || [];\n        let i, ilen;\n        if (timestamps.length) {\n            return timestamps;\n        }\n        const metas = this.getMatchingVisibleMetas();\n        if (this._normalized && metas.length) {\n            return this._cache.data = metas[0].controller.getAllParsedValues(this);\n        }\n        for(i = 0, ilen = metas.length; i < ilen; ++i){\n            timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n        }\n        return this._cache.data = this.normalize(timestamps);\n    }\n getLabelTimestamps() {\n        const timestamps = this._cache.labels || [];\n        let i, ilen;\n        if (timestamps.length) {\n            return timestamps;\n        }\n        const labels = this.getLabels();\n        for(i = 0, ilen = labels.length; i < ilen; ++i){\n            timestamps.push(parse(this, labels[i]));\n        }\n        return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n    }\n normalize(values) {\n        return _arrayUnique(values.sort(sorter));\n    }\n}\n\nfunction interpolate(table, val, reverse) {\n    let lo = 0;\n    let hi = table.length - 1;\n    let prevSource, nextSource, prevTarget, nextTarget;\n    if (reverse) {\n        if (val >= table[lo].pos && val <= table[hi].pos) {\n            ({ lo , hi  } = _lookupByKey(table, 'pos', val));\n        }\n        ({ pos: prevSource , time: prevTarget  } = table[lo]);\n        ({ pos: nextSource , time: nextTarget  } = table[hi]);\n    } else {\n        if (val >= table[lo].time && val <= table[hi].time) {\n            ({ lo , hi  } = _lookupByKey(table, 'time', val));\n        }\n        ({ time: prevSource , pos: prevTarget  } = table[lo]);\n        ({ time: nextSource , pos: nextTarget  } = table[hi]);\n    }\n    const span = nextSource - prevSource;\n    return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n    static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n        super(props);\n         this._table = [];\n         this._minPos = undefined;\n         this._tableRange = undefined;\n    }\n initOffsets() {\n        const timestamps = this._getTimestampsForTable();\n        const table = this._table = this.buildLookupTable(timestamps);\n        this._minPos = interpolate(table, this.min);\n        this._tableRange = interpolate(table, this.max) - this._minPos;\n        super.initOffsets(timestamps);\n    }\n buildLookupTable(timestamps) {\n        const { min , max  } = this;\n        const items = [];\n        const table = [];\n        let i, ilen, prev, curr, next;\n        for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n            curr = timestamps[i];\n            if (curr >= min && curr <= max) {\n                items.push(curr);\n            }\n        }\n        if (items.length < 2) {\n            return [\n                {\n                    time: min,\n                    pos: 0\n                },\n                {\n                    time: max,\n                    pos: 1\n                }\n            ];\n        }\n        for(i = 0, ilen = items.length; i < ilen; ++i){\n            next = items[i + 1];\n            prev = items[i - 1];\n            curr = items[i];\n            if (Math.round((next + prev) / 2) !== curr) {\n                table.push({\n                    time: curr,\n                    pos: i / (ilen - 1)\n                });\n            }\n        }\n        return table;\n    }\n _generate() {\n        const min = this.min;\n        const max = this.max;\n        let timestamps = super.getDataTimestamps();\n        if (!timestamps.includes(min) || !timestamps.length) {\n            timestamps.splice(0, 0, min);\n        }\n        if (!timestamps.includes(max) || timestamps.length === 1) {\n            timestamps.push(max);\n        }\n        return timestamps.sort((a, b)=>a - b);\n    }\n _getTimestampsForTable() {\n        let timestamps = this._cache.all || [];\n        if (timestamps.length) {\n            return timestamps;\n        }\n        const data = this.getDataTimestamps();\n        const label = this.getLabelTimestamps();\n        if (data.length && label.length) {\n            timestamps = this.normalize(data.concat(label));\n        } else {\n            timestamps = data.length ? data : label;\n        }\n        timestamps = this._cache.all = timestamps;\n        return timestamps;\n    }\n getDecimalForValue(value) {\n        return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n    }\n getValueForPixel(pixel) {\n        const offsets = this._offsets;\n        const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n        return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n    }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n    controllers,\n    elements,\n    plugins,\n    scales\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, plugin_colors as Colors, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, defaults, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n","import {Chart, registerables} from '../dist/chart.js';\n\nChart.register(...registerables);\n\nexport * from '../dist/chart.js';\nexport default Chart;\n"],"names":["EventListener","constructor","eventTarget","eventName","eventOptions","this","unorderedBindings","Set","connect","addEventListener","disconnect","removeEventListener","bindingConnected","binding","add","bindingDisconnected","delete","handleEvent","event","extendedEvent","stopImmediatePropagation","Object","assign","immediatePropagationStopped","call","extendEvent","bindings","hasBindings","size","Array","from","sort","left","right","leftIndex","index","rightIndex","Dispatcher","application","eventListenerMaps","Map","started","start","eventListeners","forEach","eventListener","stop","values","reduce","listeners","map","concat","fetchEventListenerForBinding","clearEventListeners","clearEventListenersForBinding","handleError","error","message","detail","removeMappedEventListenerFor","eventListenerMap","fetchEventListenerMapForEventTarget","cacheKey","fetchEventListener","get","createEventListener","set","parts","keys","key","push","join","defaultActionDescriptorFilters","value","stopPropagation","prevent","preventDefault","self","element","target","descriptorPattern","parseEventTarget","eventTargetName","window","document","camelize","replace","_","char","toUpperCase","namespaceCamelize","capitalize","charAt","slice","dasherize","toLowerCase","isSomething","object","undefined","hasProperty","property","prototype","hasOwnProperty","allModifiers","Action","descriptor","schema","tagName","defaultEventNames","getDefaultEventNameForElement","identifier","methodName","keyFilter","forToken","token","descriptorString","matches","trim","match","includes","split","options","test","parseActionDescriptorString","content","toString","eventFilter","shouldIgnoreKeyboardEvent","filters","keyFilterDissatisfied","standardFilter","filter","keyMappings","shouldIgnoreMouseEvent","params","pattern","RegExp","name","attributes","typecast","meta","ctrl","alt","shift","modifier","metaKey","ctrlKey","altKey","shiftKey","a","button","form","details","input","e","getAttribute","select","textarea","Error","JSON","parse","o_O","Binding","context","action","actionEvent","prepareActionEvent","willBeInvokedByEvent","applyEventModifiers","invokeWithEvent","method","controller","actionDescriptorFilters","passes","entries","currentTarget","logDebugActivity","KeyboardEvent","MouseEvent","Element","contains","scope","containsElement","ElementObserver","delegate","mutationObserverInit","childList","subtree","elements","mutationObserver","MutationObserver","mutations","processMutations","observe","refresh","pause","callback","takeRecords","matchElementsInTree","has","removeElement","addElement","mutation","processMutation","type","processAttributeChange","attributeName","processRemovedNodes","removedNodes","processAddedNodes","addedNodes","elementAttributeChanged","matchElement","nodes","node","elementFromNode","processTree","elementIsActive","tree","processor","nodeType","Node","ELEMENT_NODE","isConnected","elementMatched","elementUnmatched","AttributeObserver","elementObserver","selector","hasAttribute","querySelectorAll","elementMatchedAttribute","elementUnmatchedAttribute","elementAttributeValueChanged","fetch","del","prune","Multimap","valuesByKey","hasKey","hasValue","some","getValuesForKey","getKeysForValue","_key","_values","SelectorObserver","_selector","matchesByElement","selectorMatchElement","selectorMatched","selectors","selectorUnmatched","_attributeName","matchedBefore","StringMapObserver","stringMap","attributeOldValue","knownAttributeNames","refreshAttribute","oldValue","getStringMapKeyForAttribute","stringMapKeyAdded","stringMapValueChanged","stringMapKeyRemoved","currentAttributeNames","recordedAttributeNames","attribute","TokenListObserver","attributeObserver","tokensByElement","tokensMatched","readTokensForElement","unmatchedTokens","matchedTokens","refreshTokensForElement","tokensUnmatched","tokens","tokenMatched","tokenUnmatched","previousTokens","currentTokens","firstDifferingIndex","length","Math","max","zip","findIndex","previousToken","currentToken","tokenString","parseTokenString","ValueListObserver","tokenListObserver","parseResultsByToken","WeakMap","valuesByTokenByElement","fetchParseResultForToken","fetchValuesByTokenForElement","elementMatchedValue","elementUnmatchedValue","parseResult","parseToken","valuesByToken","parseValueForToken","BindingObserver","bindingsByAction","valueListObserver","actionAttribute","disconnectAllActions","connectAction","disconnectAction","clear","ValueObserver","receiver","stringMapObserver","valueDescriptorMap","invokeChangedCallbacksForDefaultValues","invokeChangedCallback","writer","defaultValue","valueDescriptorNameMap","valueDescriptors","data","rawValue","rawOldValue","changedMethodName","changedMethod","reader","TypeError","descriptors","hasMethodName","TargetObserver","targetsByName","disconnectAllTargets","connectTarget","disconnectTarget","_a","targetConnected","targetDisconnected","readInheritableStaticArrayValues","propertyName","ancestors","getAncestorsForConstructor","definition","isArray","getOwnStaticArrayValues","readInheritableStaticObjectPairs","pairs","getOwnStaticObjectPairs","getPrototypeOf","reverse","OutletObserver","outletsByName","outletElementsByName","selectorObserverMap","attributeObserverMap","outletDefinitions","outletName","setupSelectorObserverForOutlet","setupAttributeObserverForOutlet","dependentContexts","observer","disconnectAllOutlets","stopSelectorObservers","stopAttributeObservers","outlet","getOutlet","connectOutlet","getOutletFromMap","disconnectOutlet","hasOutlet","hasOutletController","controllerAttribute","_element","getOutletNameFromOutletAttributeName","updateSelectorObserverForOutlet","outletConnected","outletDisconnected","selectorObserver","body","attributeNameForOutletName","outlets","getSelectorForOutletName","outletAttributeForScope","find","outletDependencies","dependencies","router","modules","module","controllerConstructor","dependentControllerIdentifiers","identifiers","contexts","getControllerForElementAndIdentifier","Context","functionName","bindingObserver","dispatcher","valueObserver","targetObserver","outletObserver","initialize","parentElement","invokeControllerMethod","args","bless","properties","shadowConstructor","extend","shadowProperties","getOwnKeys","shadowingDescriptor","getOwnPropertyDescriptor","getShadowedDescriptor","getShadowProperties","defineProperties","shadow","blessings","blessedProperties","blessing","getBlessedProperties","getOwnPropertySymbols","getOwnPropertyNames","extendWithReflect","extended","Reflect","construct","arguments","create","setPrototypeOf","b","testReflectExtension","Module","blessDefinition","contextsByScope","connectedContexts","connectContextForScope","fetchContextForScope","disconnectContextForScope","ClassMap","getDataKey","getAll","getAttributeName","getAttributeNameForKey","DataMap","setAttribute","removeAttribute","Guide","logger","warnedKeysByObject","warn","warnedKeys","attributeValueContainsToken","TargetSet","targetName","targetNames","findTarget","findLegacyTarget","findAll","targets","findAllTargets","findAllLegacyTargets","getSelectorForTargetName","findElement","findAllElements","targetAttributeForScope","getLegacySelectorForTargetName","deprecate","targetDescriptor","targetAttribute","revisedAttributeName","guide","OutletSet","controllerElement","outletNames","findOutlet","findAllOutlets","queryElements","matchesElement","Scope","classes","closest","controllerSelector","documentScope","isDocumentScope","documentElement","ScopeObserver","scopesByIdentifierByElement","scopeReferenceCounts","parseValueForElementAndIdentifier","scopesByIdentifier","fetchScopesByIdentifierForElement","createScopeForElementAndIdentifier","referenceCount","scopeConnected","scopeDisconnected","Router","scopeObserver","modulesByIdentifier","loadDefinition","unloadIdentifier","connectModule","afterLoad","disconnectModule","getContextForElementAndIdentifier","proposeToConnectScopeForElementAndIdentifier","console","defaultSchema","enter","tab","esc","space","up","down","home","end","page_up","page_down","objectFromEntries","c","n","array","memo","k","v","Application","debug","logFormattedMessage","Promise","resolve","readyState","register","load","registerActionOption","head","rest","shouldLoad","unload","controllers","onerror","groupCollapsed","log","groupEnd","getOutletController","getControllerAndEnsureConnectedScope","outletController","parseValueDefinitionPair","typeDefinition","payload","typeObject","typeFromObject","hasType","hasDefault","default","fullObject","onlyType","onlyDefault","parseValueTypeConstant","typeFromDefaultValue","parseValueTypeDefault","parseValueTypeObject","typeFromConstant","propertyPath","parseValueTypeDefinition","constant","defaultValuesByType","constantFromType","defaultValueForDefinition","hasCustomDefaultValue","readers","writers","valueDescriptorForTokenAndTypeDefinition","Boolean","Number","String","boolean","number","string","writeJSON","stringify","Controller","_identifier","_application","dispatch","prefix","bubbles","cancelable","CustomEvent","dispatchEvent","classDefinition","targetDefinition","valueDefinitionPairs","propertyDescriptorMap","result","valueDefinitionPair","valueDescriptor","read","write","propertiesForValueDefinitionPair","outletDefinition","camelizedName","outletElement","propertiesForOutletDefinition","t","togglers","openedTogglers","storeKeyValue","s","findContent","getID","show","hide","save","sessionStorage","getItem","setItem","isOpened","contents","init","store","toggle","close","open","toggler","style","height","transitionEnd","setTimeout","scrollHeight","toggleClass","toggleText","classList","remove","innerHTML","storeKey","debounce","func","wait","immediate","timeout","timestamp","later","last","Date","now","apply","debounced","callNow","clearTimeout","flush","exports","round","lim","l","h","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","d","f","hex","h1","h2","eq","hexString","r","g","isShort","alpha","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","w","rgb","i","rgb2hsl","hueValue","calln","hsl2rgb","hue","hueParse","str","m","exec","p1","p2","hwb2rgb","hsv2rgb","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","names","nameParse","unpacked","tkeys","j","ok","nk","parseInt","unpack","transparent","RGB_RE","to","pow","modHSL","ratio","tmp","clone","proto","fromObject","functionParse","rgbParse","Color","ret","len","_rgb","_valid","valid","obj","rgbString","hslString","mix","color","weight","c1","c2","w2","p","w1","interpolate","rgb1","rgb2","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","rotate","deg","noop","uid","id","isNullOrUndef","isObject","isNumberFinite","isFinite","finiteOrDefault","valueOrDefault","toDimension","dimension","endsWith","parseFloat","fn","thisArg","each","loopable","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","keyResolvers","o","y","resolveObjectKey","resolver","part","_splitKey","_getKeyResolver","_capitalize","defined","isFunction","setsEqual","item","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","range","roundedRange","niceRange","floor","fraction","isNumber","isNaN","_setMinAndMaxByKey","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","sqrt","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","ti","_rlookupByKey","arrayEvents","unlistenArrayEvents","listener","stub","_chartjs","splice","_arrayUnique","items","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","_toLeftRightCenter","align","_alignStartEnd","_getStartAndCountOfVisiblePoints","points","animationsDisabled","pointCount","count","_sorted","iScale","_parsed","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","intlCache","formatNumber","num","locale","formatter","Intl","NumberFormat","getNumberFormat","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","Ticks","overrides","getScope$1","root","Defaults","_descriptors","_appliers","animation","backgroundColor","borderColor","datasets","devicePixelRatio","platform","getDevicePixelRatio","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","onClick","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","describe","override","route","targetScope","scopeObject","targetScopeObject","privateName","writable","enumerable","local","appliers","defaults","_scriptable","startsWith","_indexable","_fallback","delay","duration","easing","loop","active","resize","animations","visible","autoPadding","padding","top","bottom","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","_ctx","tickColor","border","dash","dashOffset","width","title","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","_measureText","gc","longest","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","point","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","decorateText","line","opts","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","fillStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","translation","textAlign","textBaseline","setRenderOpts","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","_readValueToProps","props","objProps","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","toFontString","inputs","info","cacheable","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","Symbol","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","proxy","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","isScriptable","getValue","_resolveScriptable","isIndexable","arr","_resolveArray","_resolveWithContext","allKeys","configurable","scriptable","indexable","_allKeys","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","iPixel","vPixel","monotoneCompute","capControlPoint","pt","_updateBezierControlPoints","controlPoints","spanGaps","cubicInterpolationMode","prev","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","_isDomSupported","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","ownerDocument","defaultView","positions","getPositionedStyle","styles","suffix","pos","getRelativePosition","borderBox","boxSizing","paddings","borders","box","touches","offsetX","offsetY","shadowRoot","useOffsetPos","getBoundingClientRect","clientX","clientY","getCanvasPosition","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","maxHeight","containerSize","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","getContainerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","el","getPropertyValue","getStyle","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRtlAdapter","rtl","rectX","setWidth","xPlus","leftForLtr","itemWidth","getRightToLeftAdapter","_itemWidth","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","_boundSegment","segment","startBound","endBound","getSegment","prevValue","inside","subStart","shouldStart","shouldStop","_boundSegments","segments","sub","splitByStyles","segmentOptions","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","doSplitByStyles","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","Animator","_request","_charts","_running","_lastDate","_notify","anims","date","callbacks","numSteps","initial","currentStep","_refresh","_update","remaining","running","draw","_active","_total","tick","pop","_getAnims","charts","complete","progress","listen","cb","acc","cur","_duration","cancel","animator","interpolators","factor","c0","Animation","cfg","currentValue","_fn","_easing","_start","_loop","_target","_prop","_from","_to","_promises","update","elapsed","promises","res","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","option","_animateOptions","newOptions","$shared","$animations","resolveTargetOptions","_createAnimations","anim","all","awaitAll","then","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","isStacked","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","_cachedMeta","_stacks","iAxis","vAxis","indexScale","valueScale","getStackKey","_top","_bottom","_visualValues","getFirstScaleId","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","static","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","linkScales","_stacked","addElements","isPluginEnabled","updateIndex","dataset","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","iAxisKey","vAxisKey","adata","convertObjectDataToArray","isExtensible","defineProperty","base","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","canStack","otherScale","hidden","createStack","NEGATIVE_INFINITY","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","_clip","disabled","toClip","defaultClip","chartArea","resolveDatasetElementOptions","resolveDataElementOptions","dataIndex","raw","createDataContext","createDatasetContext","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","computeMinSampleSize","_cache","$bar","visibleMetas","getAllScaleValues","curr","_length","updateMinAndPrev","getPixelForTick","parseValue","entry","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v2","startEnd","setInflateAmount","inflateAmount","DoughnutController","animateRotate","animateScale","cutout","circumference","spacing","legend","generateLabels","fontColor","getDataVisibility","legendItem","toggleDataVisibility","super","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","calculateCircumference","animationOpts","centerX","centerY","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","PolarAreaController","angleLines","circular","pointLabels","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","__proto__","BarController","categoryPercentage","barPercentage","grouped","_index_","_value_","bars","getBasePixel","isHorizontal","ruler","_getRuler","vpixels","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","currentParsed","iScaleValue","skipNull","_getStackCount","_getStackIndex","pixels","barThickness","_startPixel","_endPixel","stackCount","baseValue","minBarLength","actualBase","floating","barSign","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","rects","BubbleController","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PieController","RadarController","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","DateAdapterBase","members","formats","diff","startOf","endOf","adapters","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","getIntersectItems","useFinalPosition","isPointInArea","inRange","getNearestCartesianItems","distanceMetric","useX","useY","deltaX","deltaY","getDistanceMetricForAxis","minDistance","getCenterPoint","getNearestItems","getProps","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","setLayoutDims","layouts","wrap","stackWeight","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","layoutBoxes","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","nodeList","createAttachObserver","trigger","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","ResizeObserver","contentRect","listenDevicePixelRatioChanges","releaseObserver","unlistenDevicePixelRatioChanges","createProxyAndListen","native","fromNativeEvent","addListener","DomPlatform","renderHeight","renderWidth","displayWidth","displayHeight","initCanvas","proxies","$proxies","attach","detach","tooltipPosition","final","tickOpts","determinedMaxTicks","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","ceil","skipMajors","evenMajorSpacing","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","majorStart","majorEnd","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","getTickMarkLength","getTitleHeight","titleAlign","reverseAlign","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","minmax","keepZero","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","caches","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","createTickContext","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","positionAxisID","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","lineDashOffset","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","titleX","titleY","titleArgs","tz","gz","bz","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","parentScope","isIChartComponent","itemDefaults","defaultRoutes","routes","propertyParts","sourceName","sourceScope","routeDefaults","registerDefaults","unregister","Registry","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","plugin","invalidate","_oldCache","_notifyStateChanges","localIds","allPlugins","getOpts","pluginOpts","createDescriptors","previousDescriptors","pluginScopeKeys","getIndexAxis","datasetDefaults","idMatchesAxis","determineAxis","scaleOptions","getAxisFromDataset","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","boundDs","retrieveAxisFromDatasets","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","initOptions","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","clearCache","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","hasFunction","needContext","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","getSizeForArea","field","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","OffscreenCanvas","_detectPlatform","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","render","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","getDatasetArea","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","inChartArea","_handleEvent","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","pixelMargin","innerR","spacingOffset","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","fullCircles","inner","lineJoin","angleMargin","clipArc","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","stepped","getLineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","path","_path","strokePathWithCache","segmentMethod","strokePathDirect","LineElement","_points","_segments","_pointsUpdated","findStartAndEnd","solidSegments","_computeSegments","_interpolate","_getInterpolationMethod","interpolated","inRange$1","hitRadius","getBarBounds","bar","half","skipOrLimit","boundingRects","maxW","maxH","parseBorderWidth","maxR","enableBorder","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","inflateRect","amount","refRect","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","BarElement","addRectPath","mouseX","mouseY","inXRange","inYRange","PointElement","hoverRadius","BORDER_COLORS","BACKGROUND_COLORS","getBorderColor","getBackgroundColor","getColorizer","colorizeDoughnutDataset","colorizePolarAreaDataset","colorizeDefaultDataset","containsColorsDefinitions","plugin_colors","forceOverride","_args","chartOptions","containsColorDefenition","colorizer","cleanDecimatedDataset","cleanDecimatedData","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","getStartAndCountOfVisiblePointsSimplified","threshold","decimated","samples","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","lttbDecimation","minIndex","maxIndex","startIndex","xMin","dx","lastIndex","intermediateIndex1","intermediateIndex2","minMaxDecimation","_getBounds","_findSegmentEnd","_getEdge","_createBoundaryLine","boundary","linePoints","_pointsFromSegments","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","fillOption","parseFillOption","firstCh","decodeTargetIndex","addPointsBelow","sourcePoint","linesBelow","postponed","findPoint","unshift","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","sourcePoints","below","getLinesBelow","_buildStackLine","_getTargetValue","computeCircularBoundary","_getTargetPixel","computeLinearBoundary","computeBoundary","_drawfill","lineOpts","above","clipVertical","doFill","clipY","lineLoop","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","src","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","legendItemText","calculateItemWidth","fontLineHeight","calculateLegendItemHeight","calculateItemHeight","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","textDirection","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","drawLegendBox","_textX","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","onLeave","isListened","hoveredItem","sameItem","plugin_legend","afterEvent","ci","useBorderRadius","Title","_padding","textSize","_drawArgs","fontOpts","plugin_title","titleBlock","createTitle","plugin_subtitle","positioners","average","xSet","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","defaultCallbacks","beforeTitle","tooltipItems","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","Colors","Decimation","Filler","SubTitle","findOrAddLabel","addedLabels","addIfString","lastIndexOf","_getLabelForValue","generateTicks$1","generationOptions","dataRange","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","rounded","almostWhole","decimalPlaces","relativeLabelSize","LinearScaleBase","_startValue","_endValue","_valueRange","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","generateTicks","minExp","exp","startExp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","determineLimits","fitWithPointLabels","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","updateLimits","setCenterPoint","_pointLabelItems","itemOpts","extra","createPointLabelItem","isNotOverlapped","buildPointLabelItems","hLimits","vLimits","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","pathRadiusLine","RadialLinearScale","animate","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","getBasePosition","getPointLabelPosition","drawPointLabels","gridLineOpts","drawRadiusLine","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","addTick","time","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","displayFormats","_unit","_majorUnit","_offsets","_normalized","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","CategoryScale","_addedLabels","added","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","registerables"],"sourceRoot":""}