{
  "version": 3,
  "sources": ["../src/YagrCore/defaults.ts", "../src/plugins/aggregates/utils.ts", "../src/plugins/aggregates/aggregates.ts", "../src/YagrCore/plugins/tooltip/utils.ts", "../src/YagrCore/plugins/tooltip/render.ts", "../src/YagrCore/utils/common.ts", "../src/YagrCore/plugins/tooltip/placement.ts", "../src/YagrCore/utils/colors.ts", "../src/YagrCore/plugins/cursor/cursor.ts", "../src/YagrCore/utils/events.ts", "../src/YagrCore/plugins/legend/utils.ts", "../src/YagrCore/plugins/legend/legend.ts", "../node_modules/uplot/dist/uPlot.esm.js", "../src/YagrCore/utils/types.ts", "../src/YagrCore/utils/axes.ts", "../src/YagrCore/utils/scales.ts", "../src/YagrCore/locale.ts", "../src/YagrCore/plugins/tooltip/tooltip.ts", "../src/YagrCore/plugins/markers/index.ts", "../src/YagrCore/utils/paths.ts", "../src/YagrCore/utils/series.ts", "../src/YagrCore/utils/chart.ts", "../src/YagrCore/plugins/plotLines/utils/calculateFromTo.ts", "../src/YagrCore/plugins/plotLines/plotLines.ts", "../src/YagrCore/mixins/create-options.ts", "../src/YagrCore/mixins/transform-series.ts", "../src/YagrCore/mixins/dynamic-updates.ts", "../src/YagrCore/utils/mixins.ts", "../src/YagrCore/mixins/batch-updates.ts", "../src/YagrCore/index.ts", "../src/index.ts"],
  "sourcesContent": ["import uPlot, {Padding} from 'uplot';\nimport {YagrTheme} from './types';\nimport type ColorParser from './utils/colors';\n\nexport const DEFAULT_X_SERIE_NAME = 'date';\nexport const DEFAULT_X_SCALE = 'x';\nexport const DEFAULT_Y_SCALE = 'y';\nexport const DEFAULT_FOCUS_ALPHA = 0.3;\nexport const DEFAULT_CANVAS_PIXEL_RATIO = typeof window === 'undefined' ? 1 : window.devicePixelRatio;\nexport const DEFAULT_MAX_TICKS = 5;\nexport const DEFAULT_Y_AXIS_OFFSET = 0.05;\nexport const DEFAULT_SCALE_MIN_RANGE = 0.01;\nexport const DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE = 0.001;\nexport const DEFAULT_POINT_SIZE = DEFAULT_CANVAS_PIXEL_RATIO >= 2 ? 4 : 2;\n\nexport const DEFAULT_SYNC_KEY = 'sync';\nexport const DEFAULT_TITLE_FONT_SIZE = 14;\n\nexport const LIGHT_DEFAULT_LINE_COLOR = '#222222';\nexport const DARK_DEFAULT_LINE_COLOR = '#eeeeee';\n\nexport const DEFAULT_AXIS_FONT_SIZE = 11;\nexport const AXIS_LABEL_FONT = 'normal 11px Lucida Grande, Arial, Helvetica, sans-serif';\nexport const AXIS_VALUES_FONT = '11px Lucida Grande, Arial, Helvetica, sans-serif';\n\nexport const Y_AXIS_TICK_GAP = 6;\nexport const DEFAULT_Y_AXIS_SIZE = 12;\nexport const DEFAULT_Y_AXIS_PADDING = 12;\nexport const DEFAULT_Y_AXIS_LABEL_PADDING = 2;\nexport const Y_AXIS_SIZE = (self: uPlot, values: string[], axisIdx: number) => {\n    if (!values) {\n        return DEFAULT_Y_AXIS_SIZE;\n    }\n\n    const longesValue = values.reduce((l, c) => (l.length > c.length ? l : c));\n    const {ctx} = self;\n    ctx.save();\n    const axis = self.axes[axisIdx];\n\n    ctx.font = axis.font ? axis.font[0] : AXIS_VALUES_FONT;\n    const {width: textSize} = ctx.measureText(longesValue);\n    ctx.restore();\n\n    let labelSize = 0;\n    if (axis.label) {\n        labelSize = axis.labelSize || DEFAULT_AXIS_FONT_SIZE;\n\n        ctx.font = axis.labelFont ? axis.labelFont[0] : AXIS_LABEL_FONT;\n\n        let labelText: string;\n        if (typeof axis.label === 'function') {\n            labelText = axis.label(self, axisIdx, 0, 0);\n        } else {\n            labelText = axis.label;\n        }\n\n        const {fontBoundingBoxAscent: size} = ctx.measureText(labelText);\n        labelSize = size;\n        ctx.restore();\n    }\n\n    return labelSize\n        ? textSize / DEFAULT_CANVAS_PIXEL_RATIO + labelSize / DEFAULT_CANVAS_PIXEL_RATIO + DEFAULT_Y_AXIS_LABEL_PADDING\n        : textSize / DEFAULT_CANVAS_PIXEL_RATIO + DEFAULT_Y_AXIS_PADDING;\n};\nexport const Y_AXIS_LABEL_SIZE = 11;\n\nexport const SECOND = 1000;\nexport const MINUTE = SECOND * 60;\nexport const HOUR = MINUTE * 60;\nexport const DAY = HOUR * 24;\nexport const YEAR = DAY * 365;\nexport const DECADE = YEAR * 10;\n\nexport const X_AXIS_TICK_GAP = 6;\nexport const X_AXIS_SIZE = 32;\nexport const X_AXIS_SPACE = 80;\nexport const X_AXIS_INCRS = [\n    // seconds divisors (# os ms)\n    1,\n    10,\n    50,\n    100,\n    200,\n    500,\n    // minute divisors\n    SECOND,\n    SECOND * 2,\n    SECOND * 5,\n    SECOND * 10,\n    SECOND * 15,\n    SECOND * 30,\n    // hour divisors\n    MINUTE,\n    MINUTE * 5,\n    MINUTE * 10,\n    MINUTE * 30,\n    // day divisors\n    HOUR,\n    HOUR * 2,\n    HOUR * 3,\n    HOUR * 4,\n    HOUR * 6,\n    HOUR * 12,\n    // month divisors\n    DAY,\n    DAY * 2,\n    DAY * 3,\n    DAY * 5,\n    DAY * 10,\n    DAY * 15,\n    DAY * 30,\n    DAY * 60,\n    DAY * 120,\n    DAY * 180,\n    // year divisors\n    YEAR,\n    YEAR * 2,\n    YEAR * 5,\n    YEAR * 10,\n];\n\nexport const TYPES_ORDER = ['dots', 'line', 'area', 'column'];\n\nexport const BARS_DRAW_FACTOR = 0.5;\nexport const BARS_DRAW_MAX = 100;\n\nexport const PADDING_LEFT: Padding = [14, 14, 0, 4];\nexport const PADDING_RIGHT: Padding = [14, 4, 0, 14];\nexport const PADDING_BOTH: Padding = [14, 4, 0, 4];\n\nexport const SERIE_COLOR = 'rgba(0, 0, 0, 1)';\nexport const SERIE_LINE_WIDTH = 2;\nexport const SERIE_AREA_BORDER_COLOR = 'rgba(0, 0, 0, 0.2)';\nexport const SERIE_AREA_BORDER_WIDTH = 1;\n\nexport const MARKER_DIAMETER = 8;\nexport const CURSOR_STYLE = '1px solid #ffa0a0';\n\nexport const MIN_SELECTION_WIDTH = 15;\n\nconst LIGHTEN_COLOR_SHIFT = 0.68;\nconst DARKEN_COLOR_SHIFT = -0.6;\n\nexport default class ThemedDefaults {\n    theme?: YagrTheme;\n    colors: ColorParser;\n\n    constructor(colors: ColorParser, theme: YagrTheme = 'light') {\n        this.setTheme(theme);\n        this.colors = colors;\n    }\n\n    setTheme(theme: YagrTheme) {\n        this.theme = theme;\n    }\n\n    get GRID() {\n        return {\n            show: true,\n            stroke: () => this.colors.parse('--yagr-grid'),\n            width: 1,\n        };\n    }\n\n    get X_AXIS_TICKS() {\n        return {size: 8, ...this.GRID};\n    }\n\n    get Y_AXIS_TICKS() {\n        return {size: 6, ...this.GRID};\n    }\n\n    get AXIS_STROKE() {\n        return this.colors.parse('--yagr-axis-stroke');\n    }\n\n    get BACKGROUND() {\n        return this.colors.parse('--yagr-background');\n    }\n\n    get SHIFT() {\n        return this.theme?.startsWith('light') ? LIGHTEN_COLOR_SHIFT : DARKEN_COLOR_SHIFT;\n    }\n\n    get DEFAULT_LINE_COLOR() {\n        return this.theme?.startsWith('light') ? LIGHT_DEFAULT_LINE_COLOR : DARK_DEFAULT_LINE_COLOR;\n    }\n}\n\nexport const TOOLTIP_Y_OFFSET = 24;\nexport const TOOLTIP_X_OFFSET = 24;\nexport const TOOLTIP_DEFAULT_MAX_LINES = 10;\nexport const TIME_MULTIPLIER = 1;\n", "import {DataSeriesExtended} from '../../types';\n\nexport function integrate(timestamps: number[], values: DataSeriesExtended) {\n    if (timestamps.length < 2) {\n        return 0;\n    }\n\n    let t0 = timestamps[0];\n    let x0 = Number(values[0]);\n    let t1: number;\n    let x1: number;\n    let integral = 0;\n\n    for (let i = 1; i < timestamps.length; i++) {\n        x1 = Number(values[i]);\n        t1 = timestamps[i];\n\n        // we skip over all non-numeric values in a serie\n        // so that all holes and single points (surrounded by\n        // empty void) do not add anything to the integral\n        if (!Number.isNaN(x1) && !Number.isNaN(x0)) {\n            const dt = t1 - t0;\n            const dx = x1 - x0;\n            const area = (x0 + dx / 2) * dt;\n            integral += area;\n        }\n\n        t0 = t1;\n        x0 = x1;\n    }\n\n    return integral;\n}\n\nexport function countNumbers(values: DataSeriesExtended, from = 0, to = values.length - 1) {\n    let cnt = 0;\n    for (let i = from; i <= to; i++) {\n        const val = values[i];\n        if (typeof val === 'number') {\n            cnt++;\n        }\n    }\n\n    return cnt;\n}\n\nexport function getLast(values: DataSeriesExtended, from = 0, to = values.length - 1): number | null {\n    for (let i = to; i >= from; i--) {\n        const val = values[i];\n        if (val !== null && typeof val === 'number') {\n            return val;\n        }\n    }\n\n    return null;\n}\n\nexport const safeMin = (values: DataSeriesExtended, from = 0, to = values.length - 1) => {\n    if (values.length === 0) {\n        return null;\n    }\n    let min = null;\n\n    for (let i = from; i <= to; i++) {\n        const v = values[i];\n\n        if (v === null || typeof v === 'string') {\n            continue;\n        }\n\n        if (min === null || v < min) {\n            min = v;\n        }\n    }\n\n    return min;\n};\n\nexport const safeMax = (values: DataSeriesExtended, from = 0, to = values.length - 1) => {\n    if (values.length === 0) {\n        return null;\n    }\n    let max = null;\n\n    for (let i = from; i <= to; i++) {\n        const v = values[i];\n\n        if (v === null || typeof v === 'string') {\n            continue;\n        }\n\n        if (max === null || v > max) {\n            max = v;\n        }\n    }\n\n    return max;\n};\n\nexport const safeSum = (values: DataSeriesExtended, from = 0, to = values.length - 1) => {\n    if (values.length === 0) {\n        return null;\n    }\n\n    let sum = null;\n\n    for (let i = from; i <= to; i++) {\n        const v = values[i];\n\n        if (v === null || typeof v === 'string') {\n            continue;\n        }\n\n        if (sum === null) {\n            sum = v;\n        } else {\n            sum += v;\n        }\n    }\n\n    return sum;\n};\n", "import {DataSeriesExtended, YagrPlugin} from '../../types';\nimport uPlot, {Series} from 'uplot';\nimport {DEFAULT_X_SCALE} from '../../YagrCore/defaults';\nimport type Yagr from '../../YagrCore/index';\nimport {countNumbers, getLast, integrate, safeMax, safeMin, safeSum} from './utils';\n\nexport type Aggregates = {\n    min: number | null;\n    max: number | null;\n    sum: number | null;\n    avg: number | null;\n    count: number;\n    integral: number | null;\n    last: number | null;\n};\nexport type AggregatesPerScale = Record<string, Aggregates>;\nexport type AggregatesPerSeries = Record<\n    string,\n    {\n        series: Record<string, Aggregates>;\n        total: Aggregates;\n    }\n>;\n\nexport type AggregatesPluginOptions = {\n    /** Should calc aggregates on ready event (true by default) */\n    calcOnReady?: boolean;\n};\n\nconst DataRef = (opst: AggregatesPluginOptions) => {\n    const plugin: YagrPlugin<{\n        get: (from?: number, to?: number) => AggregatesPerScale | AggregatesPerSeries;\n        calc: (from: number, to: number, id: string) => Aggregates;\n    }> = (yagr: Yagr) => {\n        const aggrs: AggregatesPerScale = {};\n\n        const pluginMethods = {\n            get: (fromIdx?: number, toIdx?: number) => {\n                if (fromIdx === undefined && toIdx === undefined) {\n                    return aggrs;\n                }\n\n                if (fromIdx === undefined) {\n                    fromIdx = 0;\n                }\n\n                if (toIdx === undefined) {\n                    toIdx = yagr.uplot.data[0].length - 1;\n                }\n\n                const result: AggregatesPerSeries = {};\n\n                yagr.uplot.series.forEach(({scale, id}) => {\n                    if (scale === DEFAULT_X_SCALE || !scale) {\n                        return;\n                    }\n                    result[scale] = result[scale] || {};\n                    result[scale].series = result[scale].series || {};\n                    result[scale].series[id] = pluginMethods.calc(fromIdx as number, toIdx as number, id);\n                });\n\n                Object.keys(result).forEach((scale) => {\n                    const total: Aggregates = {\n                        min: safeMin(Object.values(result[scale].series).map(({min}) => min)),\n                        max: safeMax(Object.values(result[scale].series).map(({max}) => max)),\n                        sum: safeSum(Object.values(result[scale].series).map(({sum}) => sum)),\n                        avg: 0,\n                        count: Object.values(result[scale].series).reduce((acc, {count}) => acc + count, 0),\n                        integral: Object.values(result[scale].series).reduce(\n                            (acc, {integral}) => acc + (integral ?? 0),\n                            0,\n                        ),\n                        last: 0,\n                    };\n\n                    total.avg = total.sum === null ? null : total.sum / total.count;\n                    total.last = null;\n\n                    result[scale].total = total;\n                });\n\n                return result;\n            },\n            calc: (fromIdx: number, toIdx: number, seriesId: string) => {\n                const seriesIdx = yagr.state.y2uIdx[seriesId];\n                const timestamps = yagr.uplot.data[0].slice(fromIdx, toIdx + 1) as number[];\n                const values = yagr.uplot.series[seriesIdx].$c;\n                const integral = integrate(timestamps, values.slice(fromIdx, toIdx + 1));\n                const sum = safeSum(values, fromIdx, toIdx);\n                const min = safeMin(values, fromIdx, toIdx);\n                const max = safeMax(values, fromIdx, toIdx);\n                const cnt = countNumbers(values, fromIdx, toIdx);\n                const avg = sum === null ? null : sum / cnt;\n                const last = getLast(values, fromIdx, toIdx);\n\n                return {min, max, sum, avg, count: cnt, integral, last};\n            },\n\n            uplot: {\n                hooks:\n                    opst.calcOnReady === false\n                        ? {}\n                        : {\n                              ready: (u: uPlot) => {\n                                  Object.keys(u.scales).forEach((key) => {\n                                      if (key === DEFAULT_X_SCALE) {\n                                          return;\n                                      }\n                                      aggrs[key] = {\n                                          min: null,\n                                          max: null,\n                                          sum: null,\n                                          avg: null,\n                                          integral: null,\n                                          count: 0,\n                                          last: null,\n                                      };\n                                  });\n\n                                  (u.series as Required<Series>[]).forEach(({scale, $c, count}) => {\n                                      if (scale === DEFAULT_X_SCALE) {\n                                          return;\n                                      }\n                                      const numericValues = $c.filter(\n                                          (v) => typeof v === 'number' && v !== null,\n                                      ) as number[];\n\n                                      aggrs[scale].min = safeMin([...numericValues, aggrs[scale].min]);\n                                      aggrs[scale].max = safeMax([...numericValues, aggrs[scale].max]);\n                                      const sum = aggrs[scale].sum;\n                                      const rowSum = safeSum(numericValues);\n                                      aggrs[scale].sum =\n                                          sum === null ? safeSum(numericValues) : rowSum === null ? sum : sum + rowSum;\n                                      aggrs[scale].count += count;\n                                      const integral = aggrs[scale].integral;\n                                      const rowIntegral = integrate(\n                                          u.data[0] as number[],\n                                          $c as DataSeriesExtended,\n                                      );\n                                      aggrs[scale].integral = integral === null ? rowIntegral : integral + rowIntegral;\n                                  });\n\n                                  Object.keys(aggrs).forEach((key) => {\n                                      const sum = aggrs[key].sum;\n                                      aggrs[key].avg = sum === null ? null : sum / aggrs[key].count;\n                                  });\n                              },\n                          },\n            },\n        };\n\n        return pluginMethods;\n    };\n    return plugin;\n};\n\nexport default DataRef;\n\nif (typeof window !== 'undefined') {\n    Object.assign(window, {YagrAggregates: DataRef});\n}\n", "export function getOptionValue<T>(option: T | {[key in string]: T}, scale: string): T {\n    return (typeof option === 'object' ? (option as {[key in string]: T})[scale] : option) as T;\n}\n\nexport function escapeHTML(html: string) {\n    const elem = document.createElement('span');\n\n    elem.innerText = html;\n    return elem.innerHTML;\n}\n", "/* eslint-disable complexity, no-nested-ternary */\nimport {TooltipRenderOptions, TooltipRow} from './types';\nimport {getOptionValue, escapeHTML} from './utils';\n\nfunction renderItems(rows: TooltipRow[], opts: TooltipRenderOptions['options'], scale: string) {\n    const rowsMax = rows.slice(0, getOptionValue(opts.maxLines, scale));\n\n    return (\n        rowsMax\n            .map(({value, name = 'unnamed', color, active, transformed, seriesIdx}, i) => {\n                const val = `\n<span class=\"yagr-tooltip__val\">${value}</span>\n    ${typeof transformed === 'number' ? `<span class=\"yagr-tooltip__tf\">${transformed.toFixed(2)}</span>` : ''}\n`;\n                return `\n<div class=\"yagr-tooltip__item ${active ? '_active' : ''}\" data-series=\"${seriesIdx}\">\n    ${opts.showIndicies ? `<span class=\"yagr-tooltip__idx\">${rows.length - i}</span>` : ''}\n    <span class=\"yagr-tooltip__mark\" style=\"background-color: ${color}\"></span>${escapeHTML(name)}&nbsp;&nbsp;${val}\n</div>`;\n            })\n            .join('') +\n        (rows.length > rowsMax.length\n            ? `<div class=\"yagr-tooltip__item _more\">+${rows.length - rowsMax.length}</div>`\n            : '')\n    );\n}\n\nexport function renderTooltip(data: TooltipRenderOptions) {\n    if (data.scales.length === 0) {\n        return data.yagr.utils.i18n('nodata');\n    }\n\n    const [allTitle, sectionTitle] = data.options.title\n        ? typeof data.options.title === 'string'\n            ? [data.options.title, false]\n            : typeof data.options.title === 'function'\n              ? [data.options.title(data), false]\n              : ['', true]\n        : ['', false];\n\n    const sections = data.scales.map((x) => {\n        const xScaleTitle = getOptionValue(data.options.title, x.scale);\n        const sectionTitleBody =\n            typeof xScaleTitle === 'function' ? xScaleTitle(data) : xScaleTitle;\n        const scaleBody =\n            data.scales.length > 1\n                ? data.options.scales\n                    ? `${getOptionValue(data.options.scales, x.scale) || ''}`\n                    : `${data.yagr.utils.i18n('scale')}: ${x.scale}`\n                : '';\n        return `\n<div class=\"__section\" data-scale=${x.scale}>\n    ${sectionTitle && sectionTitleBody ? `<div class=\"_section_title\">${sectionTitleBody}</div>` : ''}\n    ${scaleBody ? `<div class=\"__section_scale\">${scaleBody}</div>` : ''}\n    <div class=\"__section_body\">${renderItems(x.rows, data.options, x.scale)}</div>\n    ${\n        getOptionValue(data.options.sum, x.scale)\n            ? `\n        <div class=\"__section_sum\">\n            ${data.yagr.utils.i18n('sum')}: ${x.sum}\n        </div>\n    `\n            : ''\n    }\n</div>`;\n    });\n\n    return `${allTitle ? `<div class=\"__title\">${allTitle}</div>` : ''}${sections.join('')}`;\n}\n", "/* eslint-disable no-nested-ternary */\n\nimport {Series} from 'uplot';\nimport {DataSeriesExtended, DataSeries, SnapToValue, ProcessingSettings, ProcessingInterpolation} from '../types';\nimport {TooltipSection} from '../plugins/tooltip/types';\n\n/**\n * Finds index of point in ranges of Y-Axis values.\n * Returns index of starting range when idx < Y <= idx next\n *\n * @param {TooltipSection} section - tooltip section\n * @param {number} value - Y value of cursor\n * @param {boolean} stickToRanges - if true, then always return index of range\n * @returns {number | null}\n */\nexport const findInRange = (section: TooltipSection, value: number, stickToRanges = true): number | null => {\n    const positive = value >= 0;\n    let max = -Infinity,\n        maxIdx = null;\n    let min = Infinity,\n        minIdx = null;\n\n    const diffs: Array<number | null> = [];\n    let result: number | null = null;\n\n    for (let r = section.rows.length - 1; r >= 0; r--) {\n        const row = section.rows[r];\n        const {displayY: y, rowIdx} = row;\n\n        let diff: number | null;\n\n        if (y !== null) {\n            if (y > max) {\n                max = y;\n                maxIdx = row.rowIdx;\n            }\n\n            if (y < min) {\n                min = y;\n                minIdx = row.rowIdx;\n            }\n        }\n\n        if (y === null || (positive ? y < 0 : y >= 0)) {\n            diff = null;\n        } else if (positive) {\n            diff = value > y ? null : y - value;\n        } else {\n            diff = value < y ? null : Math.abs(y - value);\n        }\n\n        const currentMin = result === null ? Infinity : (diffs[result] as number);\n        const nextMin = diff === null ? currentMin : Math.min(currentMin, diff);\n\n        if ((diff !== null && currentMin === diff) || nextMin !== currentMin) {\n            result = rowIdx;\n        }\n    }\n\n    if (result === null && stickToRanges) {\n        return value >= max ? maxIdx : value <= min ? minIdx : null;\n    }\n\n    return result;\n};\n\n/* Gets sum of all values of given data index by all series */\nexport const getSumByIdx = (seriesOptions: Series[], idx: number, scale: string) => {\n    let sum = 0;\n    let i = 0;\n    while (i < seriesOptions.length) {\n        const seriesIdx = seriesOptions.length - i - 1;\n        const opts = seriesOptions[seriesIdx];\n        const seriesValues = opts.$c;\n        i += 1;\n        if (opts.scale !== scale || opts.show === false || opts.showInGraph === false) {\n            continue;\n        }\n        const value = seriesValues[idx];\n        sum += typeof value === 'number' ? value : 0;\n    }\n    return sum;\n};\n\n/**\n * Finds index of nearest non-null point in range of Y-Axis values\n *\n * @param {TooltipSection} section\n * @param {number} value\n * @returns {number | null}\n */\nexport const findSticky = (section: TooltipSection, value: number): number | null => {\n    let nearestIndex;\n    let nearestValue;\n\n    let i = 0;\n    while (!nearestValue && i < section.rows.length) {\n        const r = section.rows[i].displayY;\n        if (r !== null) {\n            nearestIndex = i;\n            nearestValue = Math.abs(r - (value || 0));\n        }\n        i += 1;\n    }\n\n    if (!nearestValue || nearestIndex === undefined) {\n        return null;\n    }\n\n    for (i = nearestIndex + 1; i < section.rows.length; i++) {\n        const v = section.rows[i].displayY;\n\n        if (v === null) {\n            continue;\n        }\n\n        const diff = Math.abs(v - value);\n\n        if (nearestValue > diff) {\n            nearestValue = diff;\n            nearestIndex = i;\n        }\n    }\n\n    return nearestIndex;\n};\n\nexport const getUnitSuffix = (value: number): [number, string] => {\n    if (value >= 1e18) {\n        return [1e18, 'E'];\n    } else if (value >= 1e15) {\n        return [1e15, 'P'];\n    } else if (value >= 1e12) {\n        return [1e12, 'T'];\n    } else if (value >= 1e9) {\n        return [1e9, 'G'];\n    } else if (value >= 1e6) {\n        return [1e6, 'M'];\n    } else if (value >= 1e3) {\n        return [1e3, 'K'];\n    }\n    return [1, ''];\n};\n\n/* Number.toFixed() wihout rounding */\nexport function toFixed(num: number, fixed: number) {\n    if (fixed === 0) {\n        return parseInt(num as unknown as string);\n    }\n\n    if (Number.isInteger(num)) {\n        return num + '.' + '0'.repeat(fixed);\n    }\n\n    const [int, frac] = num.toString().split('.');\n    return frac.length >= fixed ? `${int}.${frac.slice(0, fixed)}` : `${int}.${frac}${'0'.repeat(fixed - frac.length)}`;\n}\n\n/**\n * Finds nearest non-null value's index in data series by given direction\n *\n * @param {DataSeriesExtended} data - Series data\n * @param {Series} series - Series options\n * @param {number} idx - cursor index\n * @param {SnapToValue | false} defaultSnapTo - default value for direction\n * @param {unknown} skipValue - value to skip\n * @returns {number}\n */\nexport function findDataIdx(\n    data: DataSeriesExtended,\n    series: Series,\n    idx: number,\n    defaultSnapTo: SnapToValue | false = 'closest',\n    skipValue: unknown = null,\n) {\n    let corL = idx,\n        corR = idx;\n\n    const direction = series.snapToValues ?? defaultSnapTo;\n\n    if (direction === false) {\n        return idx;\n    }\n\n    if (direction === 'left' || direction === 'closest') {\n        for (let i = idx - 1; i >= 0; i--) {\n            if (data[i] !== skipValue) {\n                corL = i;\n                break;\n            }\n        }\n    }\n\n    if (direction === 'right' || direction === 'closest') {\n        for (let i = idx + 1; i < data.length; i++) {\n            if (data[i] !== skipValue) {\n                corR = i;\n                break;\n            }\n        }\n    }\n\n    if (direction === 'left') {\n        return corL;\n    }\n    if (direction === 'right') {\n        return corR;\n    }\n\n    return corR - idx > idx - corL ? corL : corR;\n}\n\n/*\n * Interpolation function\n */\nconst interpolateImpl = (\n    timeline: number[],\n    y1: number | null,\n    y2: number | null,\n    x1: number,\n    x2: number,\n    xIdx: number,\n    iGroup: number[],\n    type: ProcessingInterpolation['type'] | number = 'linear',\n) => {\n    let result = null;\n    const x = timeline[xIdx];\n\n    switch (type) {\n        case 'linear': {\n            if (y1 === null || y2 === null) {\n                return null;\n            }\n\n            result = y1 + ((x - x1) * (y2 - y1)) / (x2 - x1);\n\n            if (isNaN(result) || Math.abs(result) === Infinity) {\n                result = null;\n            }\n            break;\n        }\n        case 'previous': {\n            result = y1;\n            break;\n        }\n        case 'next': {\n            result = y2;\n            break;\n        }\n        case 'left': {\n            result = iGroup[iGroup.length - 1] === timeline.length - 1 || y2 === null ? null : y1;\n            break;\n        }\n        case 'right': {\n            result = iGroup[0] === 0 ? null : y2;\n            break;\n        }\n        case 'closest': {\n            const lD = Math.abs(x1 - timeline[xIdx]);\n            const rD = Math.abs(x2 - timeline[xIdx]);\n            result = lD < rD ? y1 : y2;\n            break;\n        }\n        default: {\n            result = type;\n        }\n    }\n    return result;\n};\n\n// https://stackoverflow.com/a/53116778\nexport const genId = () => Date.now().toString(36) + Math.random().toString(36).substring(2);\n\n/**\n * Processing data series to:\n *  1. Find missing data and interpolate these points\n *  2. Find string special values to convert them to nulls\n *\n * @param {DataSeriesExtended[]} series\n * @param {number[]} timeline\n * @param {ProcessingSettings} settings\n * @returns {DataSeries[]}\n */\nexport const preprocess = (\n    series: DataSeriesExtended[],\n    timeline: number[],\n    settings: ProcessingSettings,\n): DataSeries[] => {\n    const result = [];\n    const nullValues = settings.nullValues || {};\n    const interpolation = settings.interpolation;\n    for (let sIdx = 0; sIdx < series.length; sIdx++) {\n        const line = series[sIdx];\n        const resultLine = [];\n\n        let iGroup = [];\n        let y1 = null,\n            y2 = null,\n            x1,\n            x2;\n\n        for (let idx = 0; idx < line.length; idx++) {\n            let val = line[idx];\n\n            if (interpolation && val === interpolation.value) {\n                iGroup.push(idx);\n                continue;\n            }\n\n            if (nullValues[val as string]) {\n                val = null;\n            }\n\n            if (iGroup.length) {\n                y2 = val;\n                x2 = timeline[idx];\n                for (const iIdx of iGroup) {\n                    resultLine[iIdx] = interpolateImpl(\n                        timeline,\n                        y1 as number | null,\n                        y2 as number | null,\n                        x1 || timeline[0],\n                        x2 || timeline[timeline.length - 1],\n                        iIdx,\n                        iGroup,\n                        interpolation && interpolation.type,\n                    );\n                }\n                iGroup = [];\n            }\n\n            y1 = val;\n            x1 = timeline[idx];\n            resultLine.push(val);\n        }\n\n        y2 = null;\n\n        if (iGroup.length) {\n            for (const iIdx of iGroup) {\n                resultLine.push(\n                    interpolateImpl(\n                        timeline,\n                        y1 as number | null,\n                        y2 as number | null,\n                        x1 || timeline[0],\n                        x2 || timeline[timeline.length - 1],\n                        iIdx,\n                        iGroup,\n                        interpolation && interpolation.type,\n                    ),\n                );\n            }\n        }\n        result.push(resultLine);\n    }\n\n    return result as DataSeries[];\n};\n\nexport const exec = <T, ArgsT extends unknown[]>(s: T | ((...a: ArgsT) => T), ...args: ArgsT) => {\n    return typeof s === 'function' ? (s as (...a: ArgsT) => T)(...args) : s;\n};\n\nexport function debounce<T extends Array<unknown> = []>(func: (...args: T) => void, timeout = 300) {\n    let timer: ReturnType<typeof setTimeout>;\n\n    return (...args: T) => {\n        clearTimeout(timer);\n        timer = setTimeout(() => func(...args), timeout);\n    };\n}\n\nexport const px = (x: number) => x + 'px';\nexport const html = (\n    tag: string,\n    attrs: Record<string, string | Record<string, string>> = {},\n    content?: string | HTMLElement,\n) => {\n    const el = document.createElement(tag);\n    Object.keys(attrs).forEach((key) => {\n        const attr = attrs[key];\n        el.setAttribute(\n            key,\n            typeof attr === 'object'\n                ? Object.entries(attr)\n                      .map(([a, b]) => `${a}:${b}`)\n                      .join(';')\n                : attr,\n        );\n    });\n    if (content) {\n        if (typeof content === 'string') {\n            el.innerHTML = content;\n        } else {\n            el.appendChild(content);\n        }\n    }\n    return el;\n};\n\ntype Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]];\ntype Join<K, P> = K extends string | number\n    ? P extends string | number\n        ? `${K}${'' extends P ? '' : '.'}${P}`\n        : never\n    : never;\nexport type Paths<T, D extends number = 10> = [D] extends [never]\n    ? never\n    : T extends object\n    ? {\n          [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K], Prev[D]>> : never;\n      }[keyof T]\n    : '';\n\nexport function get(obj: object, key: string) {\n    return key.split('.').reduce((acc, key) => Object.getOwnPropertyDescriptor(acc, key)?.value ?? {}, obj);\n}\n\nexport function deepIsEqual(a: unknown, b: unknown): boolean {\n    if (typeof a !== typeof b) {\n        return false;\n    }\n\n    if (typeof a === 'function' || typeof b === 'function') {\n        a = (a as Function).toString();\n        b = (b as Function).toString();\n    }\n\n    if (typeof a !== 'object' || isNil(a) || isNil(b)) {\n        return a === b;\n    }\n\n    const aObject = a as Record<string, unknown>;\n    const bObject = b as Record<string, unknown>;\n\n    const aKeys = Object.keys(aObject);\n    const bKeys = Object.keys(bObject);\n\n    if (aKeys.length !== bKeys.length) {\n        return false;\n    }\n\n    for (const key of aKeys) {\n        if (!bObject.hasOwnProperty(key)) {\n            return false;\n        }\n\n        if (!deepIsEqual(aObject[key], bObject[key])) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nexport function asFn<T>(t: T) {\n    return typeof t === 'function' ? t : typeof t === 'undefined' ? t : () => t;\n}\n\nexport function asPlain<T>(t: T): T extends (...args: any[]) => any ? ReturnType<T> : T {\n    return typeof t === 'function' ? t() : t;\n}\n\nexport function isNil(v: unknown): v is null | undefined {\n    return v === null || v === undefined;\n}\n\nexport function inBetween(value: number, start: number, end: number) {\n    return value >= start && value <= end ? value : value < start ? start : end;\n}\n", "import {px} from '../../utils/common';\n\nconst NAMES = {\n    size: ['height', 'width'],\n    clientSize: ['clientHeight', 'clientWidth'],\n    offsetSize: ['offsetHeight', 'offsetWidth'],\n    maxSize: ['maxHeight', 'maxWidth'],\n    before: ['top', 'left'],\n    marginBefore: ['marginTop', 'marginLeft'],\n    after: ['bottom', 'right'],\n    marginAfter: ['marginBottom', 'marginRight'],\n    scrollOffset: ['pageYOffset', 'pageXOffset'],\n    offset: ['offsetY', 'offsetY'],\n    offsetOpt: ['yOffset', 'xOffset'],\n    bodyScroll: ['scrollHeight', 'scrollWidth'],\n    inner: ['innerHeight', 'innerWidth'],\n};\n\ninterface Props {\n    size: 'height' | 'width';\n    clientSize: 'clientHeight' | 'clientWidth';\n    offsetSize: 'offsetHeight' | 'offsetWidth';\n    maxSize: 'maxHeight' | 'maxWidth';\n    before: 'top' | 'left';\n    marginBefore: 'marginTop' | 'marginLeft';\n    after: 'bottom' | 'right';\n    marginAfter: 'marginBottom' | 'marginRight';\n    scrollOffset: 'pageYOffset' | 'pageXOffset';\n    offset: 'offsetY' | 'offsetY';\n    offsetOpt: 'yOffset' | 'xOffset';\n    bodyScroll: 'scrollHeight' | 'scrollWidth';\n    inner: 'innerHeight' | 'innerWidth';\n}\n\ntype Side = 'top' | 'bottom' | 'left' | 'right';\n\ntype Coordinates = {\n    top?: number;\n    bottom?: number;\n    left?: number;\n    right?: number;\n};\n\ntype Options = {\n    bound?: Element | Range | Coordinates;\n    xOffset?: number;\n    yOffset?: number;\n};\n\nfunction normalizeRect(rect: DOMRect | ClientRect): Coordinates {\n    return {\n        top: rect.top,\n        bottom: rect.bottom,\n        left: rect.left,\n        right: rect.right,\n    };\n}\n\n// eslint-disable-next-line complexity\nexport const placement = function (\n    elem: HTMLElement,\n    initialAnchor: Element | Range | Coordinates,\n    side: Side = 'bottom',\n    options: Options = {},\n) {\n    let anchor;\n\n    if (initialAnchor instanceof Element || initialAnchor instanceof Range) {\n        anchor = normalizeRect(elem.getBoundingClientRect());\n    } else {\n        anchor = initialAnchor;\n    }\n\n    const anchorRect = Object.assign(\n        {\n            top: anchor.bottom || 0,\n            bottom: anchor.top || 0,\n            left: anchor.right || 0,\n            right: anchor.left || 0,\n        },\n        anchor,\n    );\n\n    const boundRect = {\n        top: 0,\n        left: 0,\n        bottom: window.innerHeight,\n        right: window.innerWidth,\n    };\n\n    if (options.bound) {\n        if (options.bound instanceof Element || options.bound instanceof Range) {\n            options.bound = normalizeRect(options.bound.getBoundingClientRect());\n        }\n        Object.assign(boundRect, options.bound);\n    }\n\n    const elemStyle = getComputedStyle(elem);\n\n    const {primary, secondary} = Object.entries(NAMES).reduce(\n        (acc, [key, value]) => ({\n            primary: {...acc.primary, [key]: value[side === 'top' || side === 'bottom' ? 0 : 1]},\n            secondary: {\n                ...acc.secondary,\n                [key]: value[side === 'top' || side === 'bottom' ? 1 : 0],\n            },\n        }),\n        {primary: {}, secondary: {}},\n    ) as {\n        primary: Props;\n        secondary: Props;\n    };\n\n    elem.style.position = 'absolute';\n    elem.style.maxWidth = '';\n    elem.style.maxHeight = '';\n\n    const offset = options[primary.offsetOpt] || 0;\n\n    // Constrain the maximum size of the popup along the secondary axis.\n    const secondaryMarginBefore = parseInt(elemStyle[secondary.marginBefore], 10);\n    const secondaryMarginAfter = parseInt(elemStyle[secondary.marginAfter], 10);\n    const secondaryMargin = secondaryMarginBefore + secondaryMarginAfter;\n\n    const secondaryMaxSize =\n        boundRect[secondary.after] - boundRect[secondary.before] - secondaryMargin;\n    const styledSecondaryMaxSize = parseInt(elemStyle[secondary.maxSize], 10);\n\n    if (!styledSecondaryMaxSize || secondaryMaxSize < styledSecondaryMaxSize) {\n        elem.style[secondary.maxSize] = px(secondaryMaxSize);\n    }\n\n    // Calculate the available room on either side of the anchor element. If\n    // the size of the popup is more than is available on the given side, then we\n    // will switch to the side with more room.\n    const margin =\n        parseInt(elemStyle[primary.marginBefore], 10) +\n        parseInt(elemStyle[primary.marginAfter], 10);\n    const roomBefore = anchorRect[primary.before] - boundRect[primary.before] - margin;\n    const roomAfter = boundRect[primary.after] - anchorRect[primary.after] - margin - offset;\n\n    if (\n        (side === primary.before && elem[primary.offsetSize] > roomBefore) ||\n        (side === primary.after && elem[primary.offsetSize] > roomAfter)\n    ) {\n        side = roomBefore > roomAfter ? primary.before : primary.after;\n    }\n\n    // If the size of the popup exceeds the room available on this side, then\n    // we will give the popup an explicit size so that it doesn't go off-screen.\n    const primaryMaxSize = side === primary.before ? roomBefore : roomAfter;\n    const styledPrimaryMaxSize = parseInt(elemStyle[primary.maxSize], 10);\n\n    if (!styledPrimaryMaxSize || primaryMaxSize < styledPrimaryMaxSize) {\n        elem.style[primary.maxSize] = px(primaryMaxSize);\n    }\n\n    // Set the position of the popup element along the primary axis using the\n    // anchor's bounding rect. If we are working in the context of position:\n    // absolute, then we will need to add the window's scroll position as well.\n    const maxOffset = document.body[primary.bodyScroll] - window[primary.inner];\n    const scrollOffset = Math.max(\n        Math.min(window[primary.scrollOffset] as unknown as number, maxOffset),\n        0,\n    );\n\n    const boundPrimaryPos = (pos: number) => {\n        return Math.max(\n            boundRect[primary.before],\n            Math.min(pos, boundRect[primary.after] - elem[primary.offsetSize] - margin),\n        );\n    };\n\n    const boundSecondaryPos = (pos: number) => {\n        return Math.max(\n            boundRect[secondary.before],\n            Math.min(\n                pos,\n                boundRect[secondary.after] - elem[secondary.offsetSize] - secondaryMargin,\n            ),\n        );\n    };\n\n    if (side === primary.before) {\n        // top or left\n        elem.style[primary.before] =\n            scrollOffset +\n            boundPrimaryPos(anchorRect[primary.before] - elem[primary.offsetSize] - margin) -\n            offset +\n            'px';\n        elem.style[primary.after] = 'auto';\n    } else {\n        // bottom or right\n        elem.style[primary.before] = px(\n            scrollOffset + boundPrimaryPos(anchorRect[primary.after]) + offset,\n        );\n        elem.style[primary.after] = 'auto';\n    }\n\n    // Set the position of the popup element along the secondary axis.\n    const maxSecondaryOffset = document.body[secondary.bodyScroll] - window[secondary.inner];\n    const secondaryScrollOffset = Math.max(\n        Math.min(window[secondary.scrollOffset] as unknown as number, maxSecondaryOffset),\n        0,\n    );\n\n    elem.style[secondary.before] = px(\n        secondaryScrollOffset +\n            boundSecondaryPos(anchorRect[secondary.before] - secondaryMarginBefore),\n    );\n    elem.style[secondary.after] = 'auto';\n\n    elem.dataset.side = side;\n\n    return {\n        side,\n        anchorRect,\n        boundRect,\n    };\n};\n", "import UPlot, {Series} from 'uplot';\nimport type Yagr from '../index';\n\nconst DEFAULT_SHADE_COLOR = [0, 0, 0, 0.6];\n\n/**\n * This class implements:\n *  - color parsing from RGBA, HEX or CSS color name\n *  - linear shade/lighten @see https://github.com/PimpTrizkit/PJs/wiki/12.-Shade,-Blend-and-Convert-a-Web-Color-(pSBC.js)#stackoverflow-archive-begin\n */\nexport default class ColorParser {\n    static parseRgba(rgbaColor: string) {\n        const m = rgbaColor.match(/rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,?\\s*(\\d+\\.?\\d*)?\\s*\\)/);\n        return m ? [m[1], m[2], m[3], m[4] || 1].map(Number) : null;\n    }\n\n    private context?: HTMLElement;\n\n    parse(color = '000') {\n        const isVar = color.startsWith('var(--');\n        let res = color,\n            pure = true,\n            prop;\n        const ctx = this.context as HTMLElement;\n\n        const pColor = ctx.style.color;\n\n        if (isVar || color.startsWith('--')) {\n            pure = false;\n            prop = isVar ? color.slice(4, -1) : color;\n        } else if (!color.startsWith('#') && !color.startsWith('rgb')) {\n            ctx.style.color = color;\n            prop = 'color';\n            pure = false;\n        }\n\n        res = pure ? res : getComputedStyle(ctx).getPropertyValue(prop as string);\n        ctx.style.color = pColor;\n        return res;\n    }\n\n    setContext(context: HTMLElement) {\n        this.context = context;\n    }\n\n    rgba(color: number[]) {\n        return `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n    }\n\n    toRgba(color: string, fallbackRgba: number[]) {\n        return ColorParser.parseRgba(this.parse(color)) || fallbackRgba;\n    }\n\n    shade([r, g, b, a]: number[], value: number) {\n        const direction = value < 0;\n        const tOffset = direction ? 0 : 255 * value;\n        const transition = direction ? 1 + value : 1 - value;\n        const _r = Math.round(r * transition + tOffset);\n        const _g = Math.round(g * transition + tOffset);\n        const _b = Math.round(b * transition + tOffset);\n        return 'rgba(' + _r + ',' + _g + ',' + _b + ',' + a + ')';\n    }\n}\n\nexport const getFocusedColor = (y: Yagr, seriesIdx: number) => {\n    const shift = y.utils.theme.SHIFT;\n    const s = y.uplot.series[seriesIdx];\n    const mainColor = ColorParser.parseRgba(s.color) || DEFAULT_SHADE_COLOR;\n    return y.utils.colors.shade(mainColor, shift);\n};\n\nexport const getSerieFocusColors = (y: Yagr, field: keyof Series) => {\n    return (u: UPlot, idx: number) => {\n        const s = u.series[idx];\n        return s._focus === false ? s.getFocusedColor(y, idx) : (s[field] as string);\n    };\n};\n", "import {SnapToValue} from '../../types';\nimport UPlot, {Plugin, Series} from 'uplot';\n\nimport {CURSOR_STYLE, DEFAULT_X_SCALE, MARKER_DIAMETER, SERIE_COLOR} from '../../defaults';\nimport CP from '../../utils/colors';\nimport {findDataIdx, html, isNil} from '../../utils/common';\nimport type Yagr from '../..';\n\n/**\n * Options for cursor plugin.\n */\nexport interface CursorOptions {\n    /** Diameter of point markers */\n    markersSize?: number;\n    /** Snap cursor to non-null value (default: SnapToValue.Closest) */\n    snapToValues?: false | SnapToValue;\n    /** X crosshair options */\n    x?: {\n        visible?: boolean;\n        style?: string; // css style\n    };\n    /** Y crosshair options */\n    y?: {\n        visible?: boolean;\n        style?: string;\n    };\n    /** Max count of visible markers. If lines > value then markers will be hidden (default: 50) */\n    maxMarkers?: number;\n\n    /** Cursror sync key (default if true) */\n    sync?: true | string;\n\n    /** Hide cursor markers by predicate */\n    hideMarkers?: (value: number | null | string, seriesIdx: number) => boolean;\n}\n\nconst MAX_CURSORS = 50;\n\nfunction paintCursorPoint(series: Series, pt: HTMLElement, span?: HTMLElement) {\n    span ||= pt.querySelector('span') as HTMLElement;\n\n    if (!span) {\n        return;\n    }\n\n    pt.style.background = `${series.color}`;\n    span.style.background = series.color || SERIE_COLOR;\n    const colorRgba = CP.parseRgba(series.color) || [256, 256, 256, 0];\n    pt.style.boxShadow = `0px 0px 0px 1px rgba(${colorRgba[0]}, ${colorRgba[1]}, ${colorRgba[2]}, 0.5)`;\n}\n\n/*\n * Draws HTML points for cursor to transform\n */\nexport function cursorPoint(u: UPlot, seriesIndex: number) {\n    const serie = u.series[seriesIndex];\n    const span = html('span');\n    const pt = html(\n        'div',\n        {\n            class: 'yagr-point',\n            'data-idx': String(seriesIndex),\n        },\n        serie.empty ? undefined : span,\n    );\n\n    // @TODO possibly not to render at all. Requires PR into uPlot\n    if (serie.empty) {\n        pt.style.display = 'none';\n        return pt;\n    }\n\n    paintCursorPoint(serie, pt, span);\n\n    return pt;\n}\n\nfunction getPointsByIdx(over: HTMLDivElement, idx?: number) {\n    return idx === undefined\n        ? (Array.from(over.querySelectorAll('.yagr-point')) as HTMLDivElement[])\n        : [over.querySelector(`.yagr-point[data-idx=\"${idx}\"]`) as HTMLDivElement];\n}\n\n/*\n * Cursor plugin responsible for drawing cursor points and crosshairs,\n * and for syncing cursors.\n */\nexport default function CursorPlugin(\n    yagr: Yagr,\n    opts: CursorOptions,\n): {\n    pin: (v: boolean) => void;\n    focus: (i: number | null, f: boolean) => void;\n    uplot: Plugin;\n    updatePoints: () => void;\n    showPoints: (idx?: number) => void;\n    hidePoints: (idx?: number) => void;\n} {\n    const config = yagr.config;\n    const processing = config.processing || {};\n    const pInterpolation = Boolean(processing.interpolation);\n    const iValue = processing.interpolation?.value;\n\n    const snapToNulls = opts.snapToValues === false ? false : opts.snapToValues || 'closest';\n    const snapToInterpolated = pInterpolation\n        ? (processing.interpolation?.snapToValues ?? 'closest')\n        : false;\n\n    let mem: Record<string, HTMLElement> = {};\n\n    /*\n     * This function finds non null value index and returns\n     * it's value for drawIdx hook for cursor\n     */\n    const snapOnValues = (self: UPlot, seriesIdx: number, hoveredIdx: number) => {\n        const series = self.series[seriesIdx];\n\n        if (series.scale === DEFAULT_X_SCALE) {\n            return hoveredIdx;\n        }\n\n        const seriesData = series.$c || self.data[seriesIdx];\n        const value = seriesData[hoveredIdx];\n\n        if (pInterpolation && value === iValue) {\n            return findDataIdx(seriesData, series, hoveredIdx, snapToInterpolated, iValue);\n        } else if (value === null) {\n            return findDataIdx(seriesData, series, hoveredIdx, snapToNulls, null);\n        }\n\n        return hoveredIdx;\n    };\n\n    return {\n        showPoints: (idx?: number) => {\n            const over = yagr.uplot.over;\n\n            if (!over) {\n                return;\n            }\n\n            const points = getPointsByIdx(over, idx);\n            points.forEach((pt) => {\n                pt.style.visibility = 'visible';\n            });\n        },\n        hidePoints: (idx?: number) => {\n            const over = yagr.uplot.over;\n\n            if (!over) {\n                return;\n            }\n\n            const points = getPointsByIdx(over, idx);\n            points.forEach((pt) => {\n                pt.style.visibility = 'hidden';\n            });\n        },\n        pin: (pinState: boolean) => {\n            const over = yagr.root.querySelector('.u-over');\n\n            if (!over) {\n                return;\n            }\n\n            if (pinState) {\n                const pointsHolder = document.createElement('div');\n                pointsHolder.classList.add('yagr-points-holder');\n                over.querySelectorAll('.yagr-point').forEach((elem) => {\n                    const newElem = elem.cloneNode(true) as HTMLElement;\n                    pointsHolder.appendChild(newElem);\n                    const idx = newElem.dataset['idx'];\n                    if (idx) {\n                        mem[idx] = newElem;\n                    }\n                });\n                over.appendChild(pointsHolder);\n            } else {\n                mem = {};\n                over.querySelector('.yagr-points-holder')?.remove();\n            }\n        },\n        updatePoints: () => {\n            (yagr.root.querySelectorAll('.yagr-point') as NodeListOf<HTMLElement>).forEach((pt) => {\n                const idx = Number(pt.dataset['idx']);\n                if (isNaN(idx)) {\n                    return;\n                }\n\n                const series = yagr.uplot.series[idx];\n\n                paintCursorPoint(series, pt);\n            });\n        },\n        focus: (serieIdx: number | null, focus: boolean) => {\n            Object.entries(mem).forEach(([idx, item]) => {\n                if (serieIdx === null) {\n                    item.style.display = focus ? 'block' : 'none';\n                    return;\n                }\n\n                item.style.display = idx === String(serieIdx) && focus ? 'block' : 'none';\n            });\n        },\n        uplot: {\n            opts: (_, uplotOptions) => {\n                uplotOptions.cursor = uplotOptions.cursor || {};\n\n                let emptyLines = 0;\n                let hiddenLines = 0;\n                for (const s of uplotOptions.series) {\n                    if (s.empty) {\n                        emptyLines += 1;\n                    }\n                    if (!s.show) {\n                        hiddenLines += 1;\n                    }\n                }\n                const totalLines = uplotOptions.series.length - 1;\n                const maxCursors = opts?.maxMarkers ?? MAX_CURSORS;\n\n                uplotOptions.cursor.points = {\n                    show: totalLines - emptyLines - hiddenLines <= maxCursors ? cursorPoint : false,\n                    size: (u: uPlot, seriesIdx: number) => {\n                        const serie = u.series[seriesIdx];\n                        return (\n                            (serie.cursorOptions\n                                ? serie.cursorOptions.markersSize\n                                : opts?.markersSize) || MARKER_DIAMETER\n                        );\n                    },\n                };\n\n                uplotOptions.cursor.dataIdx = snapOnValues;\n            },\n            hooks: {\n                ...(opts.hideMarkers && {\n                    setCursor: (u: uPlot) => {\n                        const idx = u.cursor.idx;\n\n                        if (isNil(idx)) {\n                            return;\n                        }\n\n                        for (let i = 1; i < u.series.length; i++) {\n                            const seriesValue = u.series[i].$c[idx];\n\n                            if (opts.hideMarkers!(seriesValue, i)) {\n                                yagr.plugins.cursor?.hidePoints(i);\n                            } else {\n                                yagr.plugins.cursor?.showPoints(i);\n                            }\n                        }\n                    },\n                }),\n                init: (u) => {\n                    const cX: HTMLElement | null = u.root.querySelector('.u-cursor-x');\n                    if (cX) {\n                        if (opts.x && opts.x.visible === false) {\n                            cX.style.display = 'none';\n                        }\n                        cX.style.borderRight = (opts.x && opts.x.style) || CURSOR_STYLE;\n                    }\n\n                    const cY: HTMLElement | null = u.root.querySelector('.u-cursor-y');\n                    if (cY) {\n                        if (opts.y && opts.y.visible !== false) {\n                            cY.style.borderBottom = opts.y.style || CURSOR_STYLE;\n                        } else {\n                            cY.style.display = 'none';\n                        }\n                    }\n                },\n            },\n        },\n    };\n}\n", "export const preventMouseEvents = (e: MouseEvent) => e.preventDefault();\n", "export function escapeAttribute(value: string): string {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;')\n        .replace(/'/g, '&apos;');\n}", "import UPlot, {Options, Series} from 'uplot';\n\nimport Yagr from '../../index';\nimport {DEFAULT_X_SERIE_NAME} from '../../defaults';\nimport {html} from '../../utils/common';\nimport {preventMouseEvents} from '../../utils/events';\nimport {escapeAttribute} from './utils';\n\nexport type LegendPosition = 'top' | 'bottom';\nexport interface LegendOptions {\n    /** Show legend (default: false) */\n    show?: boolean;\n    /** Root classname */\n    className?: string;\n    /** Legend placement position */\n    position?: LegendPosition;\n    /** Maximal space fro legend as a fraction of chart height (default: 0.3) */\n    maxLegendSpace?: number;\n    /** @TODO Maybe bugs here  */\n    fontSize?: number;\n    /** Basic behaviour includes only toggle behaviuor (\"Hide/show all\" button exists) */\n    behaviour?: 'basic' | 'extended';\n}\n\ninterface LegendState {\n    page: number;\n    pages: number;\n    paginated: boolean;\n    rowsPerPage: number;\n    pageSize: number;\n    requiredSpace: number;\n    totalSpace: number;\n    startSerieRange?: UPlot.Series;\n}\n\nconst ALL_SERIES_IDX = 'null' as const;\nconst PAGINATION_BUTTON_HEIGHT = 18;\nconst TOTAL_LEGEND_VERTICAL_PADDING_BOTTOM = 20;\nconst TOTAL_LEGEND_VERTICAL_PADDING_TOP = 48;\nconst DEFAULT_FONT_SIZE = 12;\nconst DEFAULT_LEGEND_PLACE_RATIO = 0.3;\n\nexport const getSeriesInLegend = (series: Series[]) => {\n    return series.filter(\n        ({id, showInLegend}) => id !== DEFAULT_X_SERIE_NAME && showInLegend !== false,\n    );\n};\n\nexport const hasOneVisibleLine = (series: Series[]) => {\n    return series.some(\n        ({id, show, showInLegend, showInGraph}) =>\n            id !== DEFAULT_X_SERIE_NAME && showInLegend !== false && show && showInGraph !== false,\n    );\n};\n\n/**\n * Any series with show: true in the legend (regardless of showInGraph).\n * Needed for behaviour: 'extended' \u2014 solo / show all are tied to show, as before showInGraph.\n */\nconst hasAnySeriesWithShowTrue = (series: Series[]) => {\n    return series.some(\n        ({id, show, showInLegend}) => id !== DEFAULT_X_SERIE_NAME && showInLegend !== false && show,\n    );\n};\n\nconst isSeriesVisibleOnGraph = (serie: Series) => {\n    return serie.show !== false && serie.showInGraph !== false;\n};\n\n/** If the line hidden with option showInGraph, but it showed at tooltip \u2014 we are disabling legend item. */\nconst isLegendItemDisabled = (serie: Series) => {\n    return serie.showInGraph === false;\n};\n\nconst shouldRestoreShowAfterShowAll = (serie: Series) => {\n    return serie.show === false && serie.showInGraph === false;\n};\n\nconst getPrependingTitle = (i18n: Yagr['utils']['i18n'], series: Series[]) => {\n    return series.length > 3 && i18n(hasOneVisibleLine(series) ? 'hide-all' : 'show-all');\n};\n\nconst getPrependingTitleId = (series: Series[]): typeof ALL_SERIES_IDX | undefined => {\n    return (series.length > 3 && ALL_SERIES_IDX) || undefined;\n};\n\nexport default class LegendPlugin {\n    yagr!: Yagr;\n    uplot?: UPlot;\n    options!: LegendOptions;\n    pagesCount = 0;\n    state: LegendState = {\n        page: 0,\n        pages: 1,\n        pageSize: 0,\n        rowsPerPage: 1,\n        paginated: false,\n        requiredSpace: 0,\n        totalSpace: 0,\n    };\n    itemsHtml = '';\n    legendEl?: HTMLElement;\n    items?: HTMLElement;\n    container?: HTMLElement;\n    private _onDestroy?: () => void;\n\n    redraw() {\n        if (!this.options.show) {\n            return;\n        }\n        this.render();\n    }\n\n    destroy() {\n        if (this._onDestroy) {\n            this._onDestroy();\n        }\n        this.legendEl?.remove();\n    }\n\n    preInit = (yagr: Yagr, options: LegendOptions, uplotOptions: Options) => {\n        this.yagr = yagr;\n        this.options = Object.assign(\n            {\n                show: false,\n                position: 'bottom',\n                fontSize: DEFAULT_FONT_SIZE,\n                maxLegendSpace: DEFAULT_LEGEND_PLACE_RATIO,\n                className: undefined,\n                behaviour: 'basic',\n            },\n            options || {},\n        );\n        this.calc(uplotOptions);\n    };\n\n    init = (u: uPlot) => {\n        if (!this.options.show) {\n            return;\n        }\n\n        this.uplot = u;\n\n        /** Removing native uPlot legend */\n        u.root.querySelector('.u-legend')?.remove();\n        this.render();\n    };\n\n    update = () => {\n        const series: NodeListOf<HTMLDivElement> =\n            this.yagr.root.querySelectorAll('[data-serie-id]');\n\n        series.forEach((serieNode) => {\n            const serieId = serieNode.getAttribute('data-serie-id');\n            if (!serieId || serieId === ALL_SERIES_IDX) {\n                return;\n            }\n            const serie = this.uplot?.series[this.yagr.state.y2uIdx[serieId]];\n            const hidden = serie?.show === false;\n            const disabled = Boolean(serie && isLegendItemDisabled(serie));\n\n            serieNode.classList[hidden ? 'add' : 'remove']('yagr-legend__item_hidden');\n            serieNode.classList[disabled ? 'add' : 'remove']('yagr-legend__item_disabled');\n        });\n    };\n\n    private applyHandlers() {\n        const {yagr, uplot: u} = this;\n\n        if (!u) {\n            return () => {};\n        }\n\n        const series: NodeListOf<HTMLDivElement> = yagr.root.querySelectorAll('[data-serie-id]');\n        const unsubsribe: (() => void)[] = [];\n\n        const onSerieClickBasic = (serieNode: HTMLElement) => () => {\n            if (serieNode.classList.contains('yagr-legend__item_disabled')) {\n                return;\n            }\n            const serieId = serieNode.getAttribute('data-serie-id');\n            const seriesToToggle: [Series, boolean][] = [];\n            const series = getSeriesInLegend(u.series);\n            let isShowAll = false;\n\n            if (serieId === ALL_SERIES_IDX) {\n                const nextToggleState = !hasOneVisibleLine(series);\n                isShowAll = nextToggleState;\n\n                series.forEach((s) => {\n                    if (isLegendItemDisabled(s)) {\n                        return;\n                    }\n                    seriesToToggle.push([s, nextToggleState]);\n                });\n            } else {\n                const serie = series.find(({id}) => id === serieId);\n                if (!serie || isLegendItemDisabled(serie)) {\n                    return;\n                }\n                seriesToToggle.push([serie, !isSeriesVisibleOnGraph(serie)]);\n            }\n\n            seriesToToggle.forEach(([serie, nextState]) => {\n                if (isSeriesVisibleOnGraph(serie) === nextState) {\n                    return;\n                }\n                const node = yagr.root.querySelector(\n                    `[data-serie-id=\"${escapeAttribute(serie.id)}\"]`,\n                );\n                yagr.setVisible(serie.id, nextState, false);\n                node?.classList[nextState ? 'remove' : 'add']('yagr-legend__item_hidden');\n            });\n\n            if (serieId === ALL_SERIES_IDX && isShowAll) {\n                series.forEach((s) => {\n                    if (!shouldRestoreShowAfterShowAll(s)) {\n                        return;\n                    }\n                    const node = yagr.root.querySelector(\n                        `[data-serie-id=\"${escapeAttribute(s.id)}\"]`,\n                    );\n                    yagr.setVisible(s.id, true, false);\n                    node?.classList.remove('yagr-legend__item_hidden');\n                });\n            }\n\n            const allSeriesItem = yagr.root.querySelector('.yagr-legend__all-series');\n\n            if (allSeriesItem) {\n                const title = getPrependingTitle(this.yagr.utils.i18n, series);\n                allSeriesItem.innerHTML = title || '';\n            }\n        };\n\n        const onSerieClickExtended = (serieNode: HTMLElement) => {\n            const changeVisibility = (id: string, visibility: boolean) => {\n                const node = yagr.root.querySelector(`[data-serie-id=\"${escapeAttribute(id)}\"]`);\n                yagr.setVisible(id, visibility, false);\n                node?.classList[visibility ? 'remove' : 'add']('yagr-legend__item_hidden');\n            };\n\n            const toggleSerie = (serie: UPlot.Series) => {\n                changeVisibility(serie.id, !isSeriesVisibleOnGraph(serie));\n            };\n\n            const selectSerie = (serie: UPlot.Series) => {\n                this.state.startSerieRange = serie;\n                const series = getSeriesInLegend(u.series);\n\n                const otherSeries = series.filter((s) => s.id !== serie.id);\n                const otherVisibility =\n                    !hasAnySeriesWithShowTrue(otherSeries) && serie.show !== false;\n\n                series.forEach((s) => {\n                    if (isLegendItemDisabled(s)) {\n                        return;\n                    }\n                    const visibility = serie.id === s.id ? true : otherVisibility;\n                    changeVisibility(s.id, visibility);\n                });\n\n                if (otherVisibility) {\n                    series.forEach((s) => {\n                        if (!shouldRestoreShowAfterShowAll(s)) {\n                            return;\n                        }\n                        const node = yagr.root.querySelector(\n                            `[data-serie-id=\"${escapeAttribute(s.id)}\"]`,\n                        );\n                        yagr.setVisible(s.id, true, false);\n                        node?.classList.remove('yagr-legend__item_hidden');\n                    });\n                } else {\n                    // In solo mode, hide series with showInGraph: false from tooltip\n                    series.forEach((s) => {\n                        if (s.showInGraph === false) {\n                            yagr.setVisible(s.id, false, false);\n                        }\n                    });\n                }\n            };\n\n            const selectRange = (serie: UPlot.Series) => {\n                const series = getSeriesInLegend(u.series);\n\n                // If startSerieRange is undefined then startSerieRange = first valid legend element\n                if (!this.state.startSerieRange) {\n                    this.state.startSerieRange = series[0];\n                }\n\n                const range: number[] = [];\n\n                series.forEach((s, i) => {\n                    if (s.id === serie.id) {\n                        range.push(i);\n                    }\n                    // There is no 'else' because exist case when startSerieRange and target serie are same elements\n                    if (s.id === this.state.startSerieRange?.id) {\n                        range.push(i);\n                    }\n                });\n\n                series.forEach((s, i) => {\n                    if (isLegendItemDisabled(s)) {\n                        return;\n                    }\n                    const visibility = i >= range[0] && i <= range[1];\n                    changeVisibility(s.id, visibility);\n                });\n            };\n\n            return (e: MouseEvent) => {\n                const serieId = serieNode.getAttribute('data-serie-id');\n\n                const serie = u.series.find(({id}) => id === serieId);\n\n                if (!serie) {\n                    return;\n                }\n\n                if (isLegendItemDisabled(serie)) {\n                    e.preventDefault();\n                    return;\n                }\n\n                e.preventDefault();\n\n                if (e.ctrlKey || e.metaKey) {\n                    toggleSerie(serie);\n                } else if (e.shiftKey) {\n                    selectRange(serie);\n                } else {\n                    selectSerie(serie);\n                }\n            };\n        };\n\n        const onSerieClick = {\n            basic: onSerieClickBasic,\n            extended: onSerieClickExtended,\n        };\n\n        const onSerieMouseEnter = (serieNode: HTMLElement) => () => {\n            const serieId = serieNode.getAttribute('data-serie-id');\n\n            if (\n                serieNode.classList.contains('yagr-legend__item_hidden') ||\n                serieNode.classList.contains('yagr-legend__item_disabled') ||\n                serieId === ALL_SERIES_IDX\n            ) {\n                return;\n            }\n\n            const targetSerie = this.yagr.uplot.series.find(({id}) => id === serieId);\n            if (targetSerie) {\n                yagr.setFocus(targetSerie.id, true);\n\n                // fix bug with focus in stacking column chart\n                yagr.redraw(true, false);\n            }\n        };\n\n        const onSerieMouseLeave = () => {\n            yagr.setFocus(null, true);\n\n            // fix bug with focus in stacking column chart\n            yagr.redraw(true, false);\n        };\n\n        series.forEach((serieNode) => {\n            const onClick = onSerieClick[this.options.behaviour || 'basic'](serieNode);\n            const onFocus = onSerieMouseEnter(serieNode);\n\n            serieNode.addEventListener('click', onClick);\n            serieNode.addEventListener('mouseenter', onFocus);\n            serieNode.addEventListener('mouseleave', onSerieMouseLeave);\n            serieNode.addEventListener('mousedown', preventMouseEvents);\n\n            unsubsribe.push(() => {\n                serieNode.removeEventListener('click', onClick);\n                serieNode.removeEventListener('mouseenter', onFocus);\n                serieNode.removeEventListener('mouseleave', onSerieMouseLeave);\n                serieNode.removeEventListener('mousedown', preventMouseEvents);\n            });\n        });\n\n        const destroy = () => unsubsribe.forEach((fn) => fn());\n        this._onDestroy = destroy;\n        return destroy;\n    }\n\n    private render() {\n        let reRender = false;\n        const {uplot: u, options} = this;\n        if (!u) {\n            return;\n        }\n\n        let legendEl = this.yagr.root.querySelector('.yagr-legend') as HTMLElement;\n\n        if (legendEl) {\n            reRender = true;\n        } else {\n            legendEl = html('div', {\n                class: `yagr-legend yagr-legend__${this.options.position} ${options?.className || ''}`,\n            });\n        }\n\n        if (!legendEl) {\n            return;\n        }\n\n        if (!reRender) {\n            if (options.position === 'top') {\n                u.root.before(legendEl);\n            } else {\n                u.root?.after(legendEl);\n            }\n        }\n\n        this.legendEl = legendEl;\n\n        if (!this.itemsHtml || reRender) {\n            this.calc(this.yagr.options);\n        }\n\n        legendEl.innerHTML = `<div class=\"yagr-legend__container\" style=\"height: ${this.state.requiredSpace}px\">${this.itemsHtml}</div>`;\n\n        this.items = legendEl.querySelector('.yagr-legend__items') as HTMLElement;\n        this.container = legendEl.querySelector('.yagr-legend__container') as HTMLElement;\n\n        if (this.state.paginated) {\n            const pagination = this.renderPagination();\n            this.container?.after(pagination);\n        } else {\n            this.items.style.justifyContent = 'center';\n        }\n\n        this.applyHandlers();\n    }\n\n    private measureLegend = (body: string) => {\n        const rootEl = this.yagr.root;\n        const pseudo = html(\n            'div',\n            {\n                class: 'yagr-legend',\n                style: {visibility: 'hidden'},\n            },\n            body,\n        );\n\n        rootEl.appendChild(pseudo);\n\n        const items = pseudo.childNodes[0] as HTMLElement;\n        const result = items.getBoundingClientRect();\n        pseudo.remove();\n\n        return result;\n    };\n\n    private nextPage = () => {\n        const {state} = this;\n        this.state.page += 1;\n\n        if (this.items) {\n            this.items.style.transform = `translate(0, ${-1 * state.page * state.pageSize}px)`;\n            this.renderPagination();\n        }\n    };\n\n    private prevPage = () => {\n        const {state} = this;\n        this.state.page -= 1;\n\n        if (this.items) {\n            this.items.style.transform = `translate(0, ${-1 * state.page * state.pageSize}px)`;\n            this.renderPagination();\n        }\n    };\n\n    private renderPagination() {\n        const {state} = this;\n\n        let pagination = this.yagr.root.querySelector('.yagr-legend__pagination');\n\n        if (pagination) {\n            const nextPage = pagination.querySelector('.yagr-legend__icon-down') as HTMLElement;\n            const prevPage = pagination.querySelector('.yagr-legend__icon-up') as HTMLElement;\n\n            nextPage.removeEventListener('click', this.nextPage);\n            prevPage.removeEventListener('click', this.prevPage);\n        } else {\n            pagination = html('div', {\n                class: 'yagr-legend__pagination',\n            });\n        }\n\n        const upClassName = state.page === 0 ? 'yagr-legend__icon-up_disabled' : '';\n        const downClassName =\n            state.page === state.pages - 1 ? 'yagr-legend__icon-down_disabled' : '';\n\n        pagination.innerHTML = `<span class=\"yagr-legend__icon-up ${upClassName}\"></span>\n<span class=\"yagr-legend__pagination-text\">${state.page + 1}/${state.pages}</span>\n<span class=\"yagr-legend__icon-down ${downClassName}\"></span>`;\n\n        const nextPage = pagination.querySelector('.yagr-legend__icon-down') as HTMLElement;\n        const prevPage = pagination.querySelector('.yagr-legend__icon-up') as HTMLElement;\n\n        if (!downClassName) {\n            nextPage.addEventListener('click', this.nextPage);\n        }\n        if (!upClassName) {\n            prevPage.addEventListener('click', this.prevPage);\n        }\n\n        return pagination;\n    }\n\n    private createIconLineElement(serie: Series) {\n        const iconLineElement = html('span', {\n            class: `yagr-legend__icon yagr-legend__icon_${serie.type}`,\n            style: {'background-color': this.yagr.getSerieLegendColor(serie)},\n        });\n\n        return iconLineElement;\n    }\n\n    private createSerieNameElement(serie: Series) {\n        const serieNameElement = html('span', {class: 'yagr-legend__name'});\n        serieNameElement.textContent = serie.name || 'unnamed';\n\n        return serieNameElement;\n    }\n\n    private renderItems(uplotOptions: Options) {\n        const seriesInLegend = getSeriesInLegend(uplotOptions.series);\n        const title = getPrependingTitle(this.yagr.utils.i18n, seriesInLegend);\n        const titleId =\n            this.options.behaviour !== 'extended' && getPrependingTitleId(seriesInLegend);\n        const series: (Series | typeof ALL_SERIES_IDX)[] = titleId\n            ? [titleId, ...seriesInLegend]\n            : [...seriesInLegend];\n\n        const content = series\n            .map((serie) => {\n                let serieContent;\n                let sId;\n                let additionalCn = ' ';\n\n                if (serie === ALL_SERIES_IDX) {\n                    serieContent = title;\n                    sId = titleId;\n                    additionalCn = ' yagr-legend__all-series ';\n                } else {\n                    sId = escapeAttribute(serie.id);\n                    const icon = this.createIconLineElement(serie);\n                    const name = this.createSerieNameElement(serie);\n\n                    serieContent = `${icon.outerHTML}${name.outerHTML}`;\n                }\n\n                if (typeof serie === 'string') {\n                    return `<div class=\"yagr-legend__item${additionalCn}\" data-serie-id=\"${sId}\">${serieContent}</div>`;\n                }\n\n                const isHidden = !isSeriesVisibleOnGraph(serie);\n                const isDisabled = isLegendItemDisabled(serie);\n                let itemClass = `yagr-legend__item${additionalCn}`.trim();\n                if (isHidden) {\n                    itemClass += ' yagr-legend__item_hidden';\n                }\n                if (isDisabled) {\n                    itemClass += ' yagr-legend__item_disabled';\n                }\n\n                const aria = isDisabled ? ' aria-disabled=\"true\"' : '';\n                return `<div class=\"${itemClass}\" data-serie-id=\"${sId}\"${aria}>${serieContent}</div>`;\n            })\n            .join('');\n\n        return `<div class=\"yagr-legend__items\">${content}</div>`;\n    }\n\n    private calc(uplotOptions: Options) {\n        if (!this.options.show) {\n            return;\n        }\n\n        const chartHeight = uplotOptions.height - this.VERTICAL_PADDING;\n        const html = this.renderItems(uplotOptions);\n        const {height: requiredHeight} = this.measureLegend(html);\n        const rowHeight = (this.options.fontSize as number) + 2;\n\n        const maxPossiblePlace = chartHeight * (this.options.maxLegendSpace as number);\n        const rowsPerPage = Math.floor(maxPossiblePlace / rowHeight);\n        const itemsRowsPerPage = rowsPerPage - 1;\n        const itemsPageSize = Math.min(itemsRowsPerPage * rowHeight, maxPossiblePlace);\n        const paginatedPageSize = Math.min(rowsPerPage * rowHeight, maxPossiblePlace);\n        const paginated = requiredHeight > itemsPageSize && itemsPageSize > 0;\n        const requiredSpace = Math.min(\n            paginated ? paginatedPageSize : itemsPageSize,\n            requiredHeight,\n        );\n        const pages = Math.ceil(requiredHeight / itemsPageSize);\n        const additionalSpace = paginated\n            ? this.VERTICAL_PADDING + PAGINATION_BUTTON_HEIGHT\n            : this.VERTICAL_PADDING;\n\n        this.state.requiredSpace = requiredSpace;\n        this.state.totalSpace = requiredSpace + additionalSpace;\n        this.state.paginated = paginated;\n        this.state.page = this.state.page || 0;\n        this.state.pages = pages;\n        this.state.pageSize = itemsPageSize;\n        this.state.rowsPerPage = rowsPerPage;\n        this.itemsHtml = html;\n    }\n\n    private get VERTICAL_PADDING() {\n        return this.options.position === 'bottom'\n            ? TOTAL_LEGEND_VERTICAL_PADDING_BOTTOM\n            : TOTAL_LEGEND_VERTICAL_PADDING_TOP;\n    }\n}\n", "/**\n* Copyright (c) 2025, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.32)\n*/\n\nconst FEAT_TIME          = true;\n\nconst pre = \"u-\";\n\nconst UPLOT          =       \"uplot\";\nconst ORI_HZ         = pre + \"hz\";\nconst ORI_VT         = pre + \"vt\";\nconst TITLE          = pre + \"title\";\nconst WRAP           = pre + \"wrap\";\nconst UNDER          = pre + \"under\";\nconst OVER           = pre + \"over\";\nconst AXIS           = pre + \"axis\";\nconst OFF            = pre + \"off\";\nconst SELECT         = pre + \"select\";\nconst CURSOR_X       = pre + \"cursor-x\";\nconst CURSOR_Y       = pre + \"cursor-y\";\nconst CURSOR_PT      = pre + \"cursor-pt\";\nconst LEGEND         = pre + \"legend\";\nconst LEGEND_LIVE    = pre + \"live\";\nconst LEGEND_INLINE  = pre + \"inline\";\nconst LEGEND_SERIES  = pre + \"series\";\nconst LEGEND_MARKER  = pre + \"marker\";\nconst LEGEND_LABEL   = pre + \"label\";\nconst LEGEND_VALUE   = pre + \"value\";\n\nconst WIDTH       = \"width\";\nconst HEIGHT      = \"height\";\nconst TOP         = \"top\";\nconst BOTTOM      = \"bottom\";\nconst LEFT        = \"left\";\nconst RIGHT       = \"right\";\nconst hexBlack    = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove   = \"mousemove\";\nconst mousedown   = \"mousedown\";\nconst mouseup     = \"mouseup\";\nconst mouseenter  = \"mouseenter\";\nconst mouseleave  = \"mouseleave\";\nconst dblclick    = \"dblclick\";\nconst resize      = \"resize\";\nconst scroll      = \"scroll\";\n\nconst change      = \"change\";\nconst dppxchange  = \"dppxchange\";\n\nconst LEGEND_DISP = \"--\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document  : null;\nconst win = domEnv ? window    : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\n//export const canHover = domEnv && !win.matchMedia('(hover: none)').matches;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction makeIndexOfs(predicate) {\n\t let indexOfs = (data, _i0, _i1) => {\n\t\tlet i0 = -1;\n\t\tlet i1 = -1;\n\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (predicate(data[i])) {\n\t\t\t\ti0 = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = _i1; i >= _i0; i--) {\n\t\t\tif (predicate(data[i])) {\n\t\t\t\ti1 = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn [i0, i1];\n\t };\n\n\t return indexOfs;\n}\n\nconst notNullish = v => v != null;\nconst isPositive = v => v != null && v > 0;\n\nconst nonNullIdxs = makeIndexOfs(notNullish);\nconst positiveIdxs = makeIndexOfs(isPositive);\n\nfunction getMinMax(data, _i0, _i1, sorted = 0, log = false) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet getEdgeIdxs = log ? positiveIdxs : nonNullIdxs;\n\tlet predicate = log ? isPositive : notNullish;\n\n\t[_i0, _i1] = getEdgeIdxs(data, _i0, _i1);\n\n\tlet _min = data[_i0];\n\tlet _max = data[_i0];\n\n\tif (_i0 > -1) {\n\t\tif (sorted == 1) {\n\t\t\t_min = data[_i0];\n\t\t\t_max = data[_i1];\n\t\t}\n\t\telse if (sorted == -1) {\n\t\t\t_min = data[_i1];\n\t\t\t_max = data[_i0];\n\t\t}\n\t\telse {\n\t\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\t\tlet v = data[i];\n\n\t\t\t\tif (predicate(v)) {\n\t\t\t\t\tif (v < _min)\n\t\t\t\t\t\t_min = v;\n\t\t\t\t\telse if (v > _max)\n\t\t\t\t\t\t_max = v;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min ?? inf, _max ?? -inf]; // todo: fix to return nulls\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\tlet maxSign = sign(max);\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tlet growMinAbs = minSign == 1 ? floor : ceil;\n\tlet growMaxAbs = maxSign == 1 ? ceil : floor;\n\n\tlet minExp = growMinAbs(logFn(abs(min)));\n\tlet maxExp = growMaxAbs(logFn(abs(max)));\n\n\tlet minIncr = pow(base, minExp);\n\tlet maxIncr = pow(base, maxExp);\n\n\t// fix values like Math.pow(10, -5) === 0.000009999999999999999\n\tif (base == 10) {\n\t\tif (minExp < 0)\n\t\t\tminIncr = roundDec(minIncr, -minExp);\n\t\tif (maxExp < 0)\n\t\t\tmaxIncr = roundDec(maxIncr, -maxExp);\n\t}\n\n\tif (fullMags || base == 2) {\n\t\tmin = minIncr * minSign;\n\t\tmax = maxIncr * maxSign;\n\t}\n\telse {\n\t\tmin = incrRoundDn(min, minIncr);\n\t\tmax = incrRoundUp(max, maxIncr);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad:  0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad  = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard,  inf);\n\n\tlet softMin = ifNull(cmin.soft,  inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\tlet deltaMag = log10(delta);\n\n\tlet scalarMax = max(abs(_min), abs(_max));\n\tlet scalarMag = log10(scalarMax);\n\n\tlet scalarMagDelta = abs(scalarMag - deltaMag);\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1e-24\n\t// or range is 11+ orders of magnitude below raw values, e.g. 99999999.99999996 - 100000000.00000004\n\tif (delta < 1e-24 || scalarMagDelta > 10) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-24;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || scalarMax || 1e3;\n\tlet mag          = log10(nonZeroDelta);\n\tlet base         = pow(10, floor(mag));\n\n\tlet _padMin  = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin  = roundDec(incrRoundDn(_min - _padMin, base/10), 24);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim   = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax  = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax  = roundDec(incrRoundUp(_max + _padMax, base/10), 24);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim   = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh =  (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction isFn(v) {\n\treturn typeof v == \"function\";\n}\n\nfunction fnOrSelf(v) {\n\treturn isFn(v) ? v : () => v;\n}\n\nconst noop = () => {};\n\n// note: these identity fns may get deoptimized if reused for different arg types\n// a TS version would enforce they stay monotyped and require making variants\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nconst regex6 = /\\.\\d*?(?=9{6,}|0{6,})/gm;\n\n// e.g. 17999.204999999998 -> 17999.205\nconst fixFloat = val => {\n\tif (isInt(val) || fixedDec.has(val))\n\t\treturn val;\n\n\tconst str = `${val}`;\n\n\tconst match = str.match(regex6);\n\n\tif (match == null)\n\t\treturn val;\n\n\tlet len = match[0].length - 1;\n\n\t// e.g. 1.0000000000000001e-24\n\tif (str.indexOf('e-') != -1) {\n\t\tlet [num, exp] = str.split('e');\n\t\treturn +`${fixFloat(num)}e${exp}`;\n\t}\n\n\treturn roundDec(val, len);\n};\n\nfunction incrRound(num, incr) {\n\treturn fixFloat(roundDec(fixFloat(num/incr))*incr);\n}\n\nfunction incrRoundUp(num, incr) {\n\treturn fixFloat(ceil(fixFloat(num/incr))*incr);\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn fixFloat(floor(fixFloat(num/incr))*incr);\n}\n\n// https://stackoverflow.com/a/48764436\n// rounds half away from zero\nfunction roundDec(val, dec = 0) {\n\tif (isInt(val))\n\t\treturn val;\n//\telse if (dec == 0)\n//\t\treturn round(val);\n\n\tlet p = 10 ** dec;\n\tlet n = (val * p) * (1 + Number.EPSILON);\n\treturn round(n) / p;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = base == 10 ? +`${mults[i]}e${exp}` : mults[i] * mag;\n\t\t\tlet dec = (exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = base == 10 ? _incr : roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\nconst isInt = Number.isInteger;\nconst isUndef = v => v === void 0;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nconst __proto__ = \"__proto__\";\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o) {\n\t\t\tif (k != __proto__)\n\t\t\t\tout[k] = copy(o[k], _isObj);\n\t\t}\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (key != __proto__) {\n\t\t\t\tif (isObj(targ[key]))\n\t\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\t\telse\n\t\t\t\t\ttarg[key] = copy(src[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0;  // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1;  // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2;  // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tif (allHeadersSame(tables)) {\n\t//\tconsole.log('cheap join!');\n\n\t\tlet table = tables[0].slice();\n\n\t\tfor (let i = 1; i < tables.length; i++)\n\t\t\ttable.push(...tables[i].slice(1));\n\n\t\tif (!isAsc(table[0]))\n\t\t\ttable = sortCols(table);\n\n\t\treturn table;\n\t}\n\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\n// TODO: https://github.com/dy/sort-ids (~2x faster for 1e5+ arrays)\nfunction sortCols(table) {\n\tlet head = table[0];\n\tlet rlen = head.length;\n\n\tlet idxs = Array(rlen);\n\tfor (let i = 0; i < idxs.length; i++)\n\t\tidxs[i] = i;\n\n\tidxs.sort((i0, i1) => head[i0] - head[i1]);\n\n\tlet table2 = [];\n\tfor (let i = 0; i < table.length; i++) {\n\t\tlet row = table[i];\n\t\tlet row2 = Array(rlen);\n\n\t\tfor (let j = 0; j < rlen; j++)\n\t\t\trow2[j] = row[idxs[j]];\n\n\t\ttable2.push(row2);\n\t}\n\n\treturn table2;\n}\n\n// test if we can do cheap join (all join fields same)\nfunction allHeadersSame(tables) {\n\tlet vals0 = tables[0][0];\n\tlet len0 = vals0.length;\n\n\tfor (let i = 1; i < tables.length; i++) {\n\t\tlet vals1 = tables[i][0];\n\n\t\tif (vals1.length != len0)\n\t\t\treturn false;\n\n\t\tif (vals1 != vals0) {\n\t\t\tfor (let j = 0; j < len0; j++) {\n\t\t\t\tif (vals1[j] != vals0[j])\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction isAsc(vals, samples = 100) {\n\tconst len = vals.length;\n\n\t// empty or single value\n\tif (len <= 1)\n\t\treturn true;\n\n\t// skip leading & trailing nullish\n\tlet firstIdx = 0;\n\tlet lastIdx = len - 1;\n\n\twhile (firstIdx <= lastIdx && vals[firstIdx] == null)\n\t\tfirstIdx++;\n\n\twhile (lastIdx >= firstIdx && vals[lastIdx] == null)\n\t\tlastIdx--;\n\n\t// all nullish or one value surrounded by nullish\n\tif (lastIdx <= firstIdx)\n\t\treturn true;\n\n\tconst stride = max(1, floor((lastIdx - firstIdx + 1) / samples));\n\n\tfor (let prevVal = vals[firstIdx], i = firstIdx + stride; i <= lastIdx; i += stride) {\n\t\tconst v = vals[i];\n\n\t\tif (v != null) {\n\t\t\tif (v <= prevVal)\n\t\t\t\treturn false;\n\n\t\t\tprevVal = v;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM:  months3,\n\tWWWW: days,\n\tWWW:  days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -32, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 32, allMults);\n\n// 1, 2,      5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy    = \"{YYYY}\";\nconst NLyyyy  = NL + yyyy;\nconst md      = \"{M}/{D}\";\nconst NLmd    = NL + md;\nconst NLmdyy  = NLmd + \"/{YY}\";\n\nconst aa      = \"{aa}\";\nconst hmm     = \"{h}:{mm}\";\nconst hmmaa   = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss      = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts  = ms * 1e3,\n\t\tm  = s  * 60,\n\t\th  = m  * 60,\n\t\td  = h  * 24,\n\t\tmo = d  * 30,\n\t\ty  = d  * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]:   minimum num secs in the tick incr\n\t// [1]:   default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]:   mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t//   tick incr    default          year                    month   day                   hour    min       sec   mode\n\t\t[y,           yyyy,            _,                      _,      _,                    _,      _,        _,       1],\n\t\t[d * 28,      \"{MMM}\",         NLyyyy,                 _,      _,                    _,      _,        _,       1],\n\t\t[d,           md,              NLyyyy,                 _,      _,                    _,      _,        _,       1],\n\t\t[h,           \"{h}\" + aa,      NLmdyy,                 _,      NLmd,                 _,      _,        _,       1],\n\t\t[m,           hmmaa,           NLmdyy,                 _,      NLmd,                 _,      _,        _,       1],\n\t\t[s,           ss,              NLmdyy + \" \" + hmmaa,   _,      NLmd + \" \" + hmmaa,   _,      NLhmmaa,  _,       1],\n\t\t[ms,          ss + \".{fff}\",   NLmdyy + \" \" + hmmaa,   _,      NLmd + \" \" + hmmaa,   _,      NLhmmaa,  _,       1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y  : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS,  _timeAxisStampsS,  timeAxisSplitsS  ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t                       s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val, seriesIdx, dataIdx) => dataIdx == null ? LEGEND_DISP : stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmount: noop,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp.size;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle, onlyTarg = true) {\n\treturn e => {\n\t\te.button == 0 && (!onlyTarg || e.target == targ) && handle(e);\n\t};\n}\n\nfunction filtTarg(self, targ, handle, onlyTarg = true) {\n\treturn e => {\n\t\t(!onlyTarg || e.target == targ) && handle(e);\n\t};\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tone:    false,\n\t\tshow:   cursorPointShow,\n\t\tsize:   cursorPointSize,\n\t\twidth:  0,\n\t\tstroke: cursorPointStroke,\n\t\tfill:   cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown:   filtBtn0,\n\t\tmouseup:     filtBtn0,\n\t\tclick:       filtBtn0, // legend clicks, not .u-over clicks\n\t\tdblclick:    filtBtn0,\n\n\t\tmousemove:   filtTarg,\n\t\tmouseleave:  filtTarg,\n\t\tmouseenter:  filtTarg,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\tclick: (self, e) => {\n\t\t//\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t},\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tdist: (self, seriesIdx, dataIdx, valPos, curPos) => valPos - curPos,\n\t\tprox: -1,\n\t\tbias: 0,\n\t},\n\n\thover: {\n\t\tskip: [void 0],\n\t\tprox: null,\n\t\tbias: 0,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx: null,\n\tidxs: null,\n\n\tevent: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font      = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineGap = 1.5;\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\talignTo: 1,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\tlineGap,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\t// boo: 10 ** -24 === 1.0000000000000001e-24\n\t// this grabs the proper 1e-24 one\n\tif (logBase == 10)\n\t\tfoundIncr = numIncrs[closestIdx(foundIncr, numIncrs)];\n\n\tlet split = scaleMin;\n\tlet nextMagIncr = foundIncr * logBase;\n\n\tif (logBase == 10)\n\t\tnextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)];\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = split + foundIncr;\n\n\t\tif (logBase == 10 && !fixedDec.has(split))\n\t\t\tsplit = roundDec(split, fixedDec.get(foundIncr));\n\n\t\tif (split >= nextMagIncr) {\n\t\t\tfoundIncr = split;\n\t\t\tnextMagIncr = foundIncr * logBase;\n\n\t\t\tif (logBase == 10)\n\t\t\t\tnextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)];\n\t\t}\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL   = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125   = /[125]/;\nconst RE_1     = /1/;\n\nconst _filt = (splits, distr, re, keepMod) => splits.map((v, i) => ((distr == 4 && v == 0) || i % keepMod == 0 && re.test(v.toExponential()[v < 0 ? 1 : 0])) ? v : null);\n\nfunction log10AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n//\tif (sc.distr == 3 && sc.log == 2)\n//\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\tif (re == RE_1) {\n\t\tlet magSpace = abs(valToPos(1, scaleKey) - _10);\n\n\t\tif (magSpace < minSpace)\n\t\t\treturn _filt(splits.slice().reverse(), sc.distr, re, ceil(minSpace / magSpace)).reverse(); // max->min skip\n\t}\n\n\treturn _filt(splits, sc.distr, re, 1);\n}\n\nfunction log2AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet minSpace = axis._space;\n\tlet valToPos = self.valToPos;\n\n\tlet magSpace = abs(valToPos(1, scaleKey) - valToPos(2, scaleKey));\n\n\tif (magSpace < minSpace)\n\t\treturn _filt(splits.slice().reverse(), 3, RE_ALL, ceil(minSpace / magSpace)).reverse(); // max->min skip\n\n\treturn splits;\n}\n\nfunction numSeriesVal(self, val, seriesIdx, dataIdx) {\n\treturn dataIdx == null ? LEGEND_DISP : val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\talignTo: 1,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\tlineGap,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst gaps = (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps;\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\tgaps,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t//  paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL   = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst mode = u.mode;\n\tconst series = u.series[seriesIdx];\n\tconst data = mode == 2 ? u._data[seriesIdx] : u._data;\n\tconst scales = u.scales;\n\tconst bbox   = u.bbox;\n\n\tlet dx = data[0],\n\t\tdy = mode == 2 ? data[1] : data[seriesIdx],\n\t\tsx = mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale],\n\t\tsy = mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ?  1 : // pos only\n\t\t\tclipDirs == 3 ?  2 : // both\n\t\t\t                 0   // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet mode = self.mode;\n\tlet series = self.series[seriesIdx];\n\tlet scaleKey = mode == 2 ? series.facets[1].scale : series.scale;\n\tlet scale = self.scales[scaleKey];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir ==  1 ? scale.max :\n\t\tscale.distr ==  3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\t// hack to ensure we expand the clip enough to avoid cutting off strokes at edges\n\t\tlet maxStrokeWidth = 10;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop - maxStrokeWidth / 2, w, plotTop + plotHgt + maxStrokeWidth);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\tlet len = xs.length;\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet fri2 = fr - dir;\n\t\t\tlet frPx2 = align <= 0 && fri2 >= 0 && fri2 < len ? pixelForX(xs[fri2]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toi2 = to + dir;\n\t\t\tlet toPx2 = align >= 0 && toi2 >= 0 && toi2 < len ? pixelForX(xs[toi2]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\n/*\n// inefficient linear interpolation that does bi-directinal scans on each call\nexport function costlyLerp(i, idx0, idx1, _dirX, dataY) {\n\tlet prevNonNull = nonNullIdx(dataY, _dirX == 1 ? idx0 : idx1, i, -_dirX);\n\tlet nextNonNull = nonNullIdx(dataY, i, _dirX == 1 ? idx1 : idx0,  _dirX);\n\n\tlet prevVal = dataY[prevNonNull];\n\tlet nextVal = dataY[nextNonNull];\n\n\treturn prevVal + (i - prevNonNull) / (nextNonNull - prevNonNull) * (nextVal - prevVal);\n}\n*/\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\t// TODO (pending better browser support): https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/roundRect\n\treturn (p, x, y, w, h, endRad = 0, baseRad = 0) => {\n\t\tif (endRad == 0 && baseRad == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tendRad  = min(endRad,  w / 2, h / 2);\n\t\t\tbaseRad = min(baseRad, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + endRad, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, endRad);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, baseRad);\n\t\t\tarcTo(p, x, y + h, x, y, baseRad);\n\t\t\tarcTo(p, x, y, x + w, y, endRad);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet hasGap = false;\n\n\t\t\t// decimate when number of points >= 4x available pixels\n\t\t\tconst decimate = idx1 - idx0 >= xDim * 4;\n\n\t\t\tif (decimate) {\n\t\t\t\tlet xForPixel = pos => u.posToVal(pos, scaleX.key, true);\n\n\t\t\t\tlet minY = null,\n\t\t\t\t\tmaxY = null,\n\t\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t\tlet idx0px = pixelForX(dataX[idx0]);\n\t\t\t\tlet idx1px = pixelForX(dataX[idx1]);\n\n\t\t\t\t// tracks limit of current x bucket to avoid having to get x pixel for every x value\n\t\t\t\tlet nextAccXVal = xForPixel(dir == 1 ? idx0px + 1 : idx1px - 1);\n\n\t\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet reuseAccX = dir == 1 ? (xVal < nextAccXVal) : (xVal > nextAccXVal);\n\t\t\t\t\tlet x = reuseAccX ? accX :  pixelForX(xVal);\n\n\t\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t\tif (x == accX) {\n\t\t\t\t\t\tif (yVal != null) {\n\t\t\t\t\t\t\toutY = yVal;\n\n\t\t\t\t\t\t\tif (minY == null) {\n\t\t\t\t\t\t\t\tlineTo(stroke, x, pixelForY(outY));\n\t\t\t\t\t\t\t\tinY = minY = maxY = outY;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (outY < minY)\n\t\t\t\t\t\t\t\t\tminY = outY;\n\t\t\t\t\t\t\t\telse if (outY > maxY)\n\t\t\t\t\t\t\t\t\tmaxY = outY;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\t\t\thasGap = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (minY != null)\n\t\t\t\t\t\t\tdrawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY));\n\n\t\t\t\t\t\tif (yVal != null) {\n\t\t\t\t\t\t\toutY = yVal;\n\t\t\t\t\t\t\tlineTo(stroke, x, pixelForY(outY));\n\t\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tminY = maxY = null;\n\n\t\t\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\t\t\thasGap = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\taccX = x;\n\t\t\t\t\t\tnextAccXVal = xForPixel(accX + dir);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (minY != null && minY != maxY && drawnAtX != accX)\n\t\t\t\t\tdrawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\thasGap = true;\n\t\t\t\t\telse if (yVal != null)\n\t\t\t\t\t\tlineTo(stroke, pixelForX(dataX[i]), pixelForY(yVal));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlet frX = pixelForX(dataX[idx0]);\n\t\t\t\tlet toX = pixelForX(dataX[idx1]);\n\n\t\t\t\tif (dir == -1)\n\t\t\t\t\t[toX, frX] = [frX, toX];\n\n\t\t\t\tlineTo(fill, toX, fillToY);\n\t\t\t\tlineTo(fill, frX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) { // skip in mode: 2?\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\thasGap && gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\n// BUG: align: -1 behaves like align: 1 when scale.dir: -1\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\tconst extend = ifNull(opts.extend, false);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet { left, width } = u.bbox;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tlet prevYPos  = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet firstXPosExt = firstXPos;\n\n\t\t\tif (extend && align == -1) {\n\t\t\t\tfirstXPosExt = left;\n\t\t\t\tlineTo(stroke, firstXPosExt, prevYPos);\n\t\t\t}\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet prevXPosExt = prevXPos;\n\n\t\t\tif (extend && align == 1) {\n\t\t\t\tprevXPosExt = left + width;\n\t\t\t\tlineTo(stroke, prevXPosExt, prevYPos);\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPosExt, fillToY);\n\t\t\t\tlineTo(fill, firstXPosExt, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align ==  1) ?  halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset   = (ascDesc || align == -1) ? -halfStroke :  halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid = inf) {\n\tif (dataX.length > 1) {\n\t\t// prior index with non-undefined y data\n\t\tlet prevIdx = null;\n\n\t\t// scan full dataset for smallest adjacent delta\n\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprevIdx = i;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn colWid;\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst _extraGap = (opts.gap || 0);\n\n\tlet ro = opts.radius;\n\n\tro =\n\t\t// [valueRadius, baselineRadius]\n\t\tro == null ? [0, 0] :\n\t\ttypeof ro == 'number' ? [ro, 0] : ro;\n\n\tconst radiusFn = fnOrSelf(ro);\n\n\tconst gapFactor = 1 - size[0];\n\tconst _maxWidth  = ifNull(size[1], inf);\n\tconst _minWidth  = ifNull(size[2], 1);\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\t\t\tlet _align = align;\n\n\t\t\tlet extraGap = _extraGap * pxRatio;\n\t\t\tlet maxWidth = _maxWidth * pxRatio;\n\t\t\tlet minWidth = _minWidth * pxRatio;\n\n\t\t\tlet valRadius, baseRadius;\n\n\t\t\tif (scaleX.ori == 0)\n\t\t\t\t[valRadius, baseRadius] = radiusFn(u, seriesIdx);\n\t\t\telse\n\t\t\t\t[baseRadius, valRadius] = radiusFn(u, seriesIdx);\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t//\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\t// band where this series is the \"from\" edge\n\t\t\tlet band = ifNull(u.bands, EMPTY_ARR).find(b => b.series[0] == seriesIdx);\n\n\t\t\tlet fillDir = band != null ? band.dir : 0;\n\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, fillDir);\n\t\t\tlet fillToY = pxRound(valToPosY(fillTo, scaleY, yDim, yOff));\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid, fullGap, colWid = xDim;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\t_align = 1;\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tcolWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid);\n\n\t\t\t\tlet gapWid = colWid - barWid;\n\t\t\t\tfullGap = gapWid + extraGap;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcolWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid);\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tfullGap = gapWid + extraGap;\n\t\t\t\tbarWid = colWid - fullGap;\n\t\t\t}\n\n\t\t\tif (fullGap < 1)\n\t\t\t\tfullGap = 0;\n\n\t\t\tif (strokeWidth >= barWid / 2)\n\t\t\t\tstrokeWidth = 0;\n\n\t\t\t// for small gaps, disable pixel snapping since gap inconsistencies become noticible and annoying\n\t\t\tif (fullGap < 5)\n\t\t\t\tpxRound = retArg0;\n\n\t\t\tlet insetStroke = fullGap > 0;\n\n\t\t\tlet rawBarWid = colWid - fullGap - (insetStroke ? strokeWidth : 0);\n\n\t\t\tbarWid = pxRound(clamp(rawBarWid, minWidth, maxWidth));\n\n\t\t\txShift = (_align == 0 ? barWid / 2 : _align == _dirX ? 0 : barWid) - _align * _dirX * ((_align == 0 ? extraGap / 2 : 0) + (insetStroke ? strokeWidth / 2 : 0));\n\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: 0};  // disp, geom\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (band != null)\n\t\t\t\tdataY0 = u.data[band.series[1]];\n\t\t\telse {\n\t\t\t\tlet { y0, y1 } = disp;\n\n\t\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet radVal = valRadius * barWid;\n\t\t\tlet radBase = baseRadius * barWid;\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (dataY0 != null) {\n\t\t\t\t\tlet yVal0 = dataY0[i] ?? 0;\n\n\t\t\t\t\tif (yVal - yVal0 == 0)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tfillToY = valToPosY(yVal0, scaleY, yDim, yOff);\n\t\t\t\t}\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillTo), scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, fillToY));\n\t\t\t\tlet top = pxRound(min(yPos, fillToY));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tif (yVal != null) {  // && yVal != fillTo (0 height bar)\n\t\t\t\t\tlet rv = yVal < 0 ? radBase : radVal;\n\t\t\t\t\tlet rb = yVal < 0 ? radVal : radBase;\n\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft    - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\t\t\telse if (!multiPath) {\n\t\t\t\t_paths._fill = series.width == 0 ? series._fill : series._stroke ?? series._fill;\n\t\t\t\t_paths.width = 0;\n\t\t\t}\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t//  if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms  = Array(n),\n\t\t\tds  = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i]  = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tfor (let u of cursorPlots)\n\t\tu.syncRect(true);\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? {} : assign({}, xyo, o));  // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = scale.valToPct(val);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = scale.valToPct(val);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\n\ton(\"click\", wrap, e => {\n\t\tif (e.target === over) {\n\t\t\tlet didDrag = mouseLeft1 != mouseLeft0 || mouseTop1 != mouseTop0;\n\t\t\tdidDrag && drag.click(self, e);\n\t\t}\n\t}, true);\n\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series  = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes    = self.axes   = setDefaults(opts.axes   || [], xAxisOpts,   yAxisOpts,    true);\n\tconst scales  = self.scales = {};\n\tconst bands   = self.bands  = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initValToPct(sc) {\n\t\tconst getVal = (\n\t\t\tsc.distr == 3   ? val => log10(val > 0 ? val : sc.clamp(self, val, sc.min, sc.max, sc.key)) :\n\t\t\tsc.distr == 4   ? val => asinh(val, sc.asinh) :\n\t\t\tsc.distr == 100 ? val => sc.fwd(val) :\n\t\t\tval => val\n\t\t);\n\n\t\treturn val => {\n\t\t\tlet _val = getVal(val);\n\t\t\tlet { _min, _max } = sc;\n\t\t\tlet delta = _max - _min;\n\t\t\treturn (_val - _min) / delta;\n\t\t};\n\t}\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tlet sc = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t\tsc.valToPct = initValToPct(sc);\n\t\t\t\tscales[scaleKey] = sc;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\n\t\t\t\tsc.valToPct = initValToPct(sc);\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate  = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals   = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal  = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend     = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst cursor     =                (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\tconst showLegend = legend.show;\n\tconst showCursor =                cursor.show;\n\tconst markers    = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width  = fnOrSelf(markers.width);\n\t\tmarkers.dash   = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill   = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendTable;\n\tlet legendHead;\n\tlet legendBody;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = LEGEND_DISP;\n\t}\n\n\tif (showLegend) {\n\t\tlegendTable = placeTag(\"table\", LEGEND, root);\n\t\tlegendBody = placeTag(\"tbody\", null, legendTable);\n\n\t\t// allows legend to be moved out of root\n\t\tlegend.mount(self, legendTable);\n\n\t\tif (multiValLegend) {\n\t\t\tlegendHead = placeTag(\"thead\", null, legendTable, legendBody);\n\n\t\t\tlet head = placeTag(\"tr\", null, legendHead);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendTable, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendTable, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son  = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendBody, legendBody.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width  = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\n\t\tif (s.label instanceof HTMLElement)\n\t\t\ttext.appendChild(s.label);\n\t\telse\n\t\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tsetCursorEvent(e);\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t}, false);\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetCursorEvent(e);\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t}, false);\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn, onlyTarg = true) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn, onlyTarg);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\t// previous values for diffing\n\tlet _plotLftCss = plotLftCss;\n\tlet _plotTopCss = plotTopCss;\n\tlet _plotWidCss = plotWidCss;\n\tlet _plotHgtCss = plotHgtCss;\n\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetSelect = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width  = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss  = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left   = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top    = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width  = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tif (cursor.dataIdx == null) {\n\t\tlet hov = cursor.hover;\n\n\t\tlet skip = hov.skip = new Set(hov.skip ?? []);\n\t\tskip.add(void 0); // alignment artifacts\n\t\tlet prox = hov.prox = fnOrSelf(hov.prox);\n\t\tlet bias = hov.bias ??= 0;\n\n\t\t// TODO: only scan between in-view idxs (i0, i1)\n\t\tcursor.dataIdx = (self, seriesIdx, cursorIdx, valAtPosX) => {\n\t\t\tif (seriesIdx == 0)\n\t\t\t\treturn cursorIdx;\n\n\t\t\tlet idx2 = cursorIdx;\n\n\t\t\tlet _prox = prox(self, seriesIdx, cursorIdx, valAtPosX) ?? inf;\n\t\t\tlet withProx = _prox >= 0 && _prox < inf;\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\t\tlet cursorLft = cursor.left;\n\n\t\t\tlet xValues = data[0];\n\t\t\tlet yValues = data[seriesIdx];\n\n\t\t\tif (skip.has(yValues[cursorIdx])) {\n\t\t\t\tidx2 = null;\n\n\t\t\t\tlet nonNullLft = null,\n\t\t\t\t\tnonNullRgt = null,\n\t\t\t\t\tj;\n\n\t\t\t\tif (bias == 0 || bias == -1) {\n\t\t\t\t\tj = cursorIdx;\n\t\t\t\t\twhile (nonNullLft == null && j-- > 0) {\n\t\t\t\t\t\tif (!skip.has(yValues[j]))\n\t\t\t\t\t\t\tnonNullLft = j;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (bias == 0 || bias == 1) {\n\t\t\t\t\tj = cursorIdx;\n\t\t\t\t\twhile (nonNullRgt == null && j++ < yValues.length) {\n\t\t\t\t\t\tif (!skip.has(yValues[j]))\n\t\t\t\t\t\t\tnonNullRgt = j;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nonNullLft != null || nonNullRgt != null) {\n\t\t\t\t\tif (withProx) {\n\t\t\t\t\t\tlet lftPos = nonNullLft == null ? -Infinity : valToPosX(xValues[nonNullLft], scaleX, xDim, 0);\n\t\t\t\t\t\tlet rgtPos = nonNullRgt == null ?  Infinity : valToPosX(xValues[nonNullRgt], scaleX, xDim, 0);\n\n\t\t\t\t\t\tlet lftDelta = cursorLft - lftPos;\n\t\t\t\t\t\tlet rgtDelta = rgtPos - cursorLft;\n\n\t\t\t\t\t\tif (lftDelta <= rgtDelta) {\n\t\t\t\t\t\t\tif (lftDelta <= _prox)\n\t\t\t\t\t\t\t\tidx2 = nonNullLft;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (rgtDelta <= _prox)\n\t\t\t\t\t\t\t\tidx2 = nonNullRgt;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tidx2 =\n\t\t\t\t\t\t\tnonNullRgt == null ? nonNullLft :\n\t\t\t\t\t\t\tnonNullLft == null ? nonNullRgt :\n\t\t\t\t\t\t\tcursorIdx - nonNullLft <= nonNullRgt - cursorIdx ? nonNullLft : nonNullRgt;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (withProx) {\n\t\t\t\tlet dist = abs(cursorLft - valToPosX(xValues[cursorIdx], scaleX, xDim, 0));\n\n\t\t\t\tif (dist > _prox)\n\t\t\t\t\tidx2 = null;\n\t\t\t}\n\n\t\t\treturn idx2;\n\t\t};\n\t}\n\n\tconst setCursorEvent = e => { cursor.event = e; };\n\n\tcursor.idxs = activeIdxs;\n\n\tcursor._lock = false;\n\n\tlet points = cursor.points;\n\n\tpoints.show   = fnOrSelf(points.show);\n\tpoints.size   = fnOrSelf(points.size);\n\tpoints.stroke = fnOrSelf(points.stroke);\n\tpoints.width  = fnOrSelf(points.width);\n\tpoints.fill   = fnOrSelf(points.fill);\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\n\tconst cursorFocus = focus.prox >= 0;\n\tconst cursorOnePt = cursorFocus && points.one;\n\n\t// series-intersection markers\n\tlet cursorPts = [];\n\t// position caches in CSS pixels\n\tlet cursorPtsLft = [];\n\tlet cursorPtsTop = [];\n\n\tfunction initCursorPt(s, si) {\n\t\tlet pt = points.show(self, si);\n\n\t\tif (pt instanceof HTMLElement) {\n\t\t\taddClass(pt, CURSOR_PT);\n\t\t\taddClass(pt, s.class);\n\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\treturn pt;\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (cursorOnePt || i > 0) {\n\t\t\ts.width  = s.width == null ? 1 : s.width;\n\t\t\ts.paths  = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill   = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(max(1, s.width), 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show   = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill   = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths  = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (showCursor) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = null;\n\n\t\t\tif (cursorOnePt) {\n\t\t\t\tif (i == 0)\n\t\t\t\t\tpt = initCursorPt(s, i);\n\t\t\t}\n\t\t\telse if (i > 0)\n\t\t\t\tpt = initCursorPt(s, i);\n\n\t\t\tcursorPts.splice(i, 0, pt);\n\t\t\tcursorPtsLft.splice(i, 0, 0);\n\t\t\tcursorPtsTop.splice(i, 0, 0);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = mode == 1 ? setDefault(opts, si, xSeriesOpts, ySeriesOpts) : setDefault(opts, si, {}, xySeriesOpts);\n\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (showCursor) {\n\t\t\tactiveIdxs.splice(i, 1);\n\t\t\tcursorPts.splice(i, 1)[0].remove();\n\t\t\tcursorPtsLft.splice(i, 1);\n\t\t\tcursorPtsTop.splice(i, 1);\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size   = fnOrSelf(axis.size);\n\t\t\taxis.space  = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\n\t\t\tif (isArr(axis.incrs)) {\n\t\t\t\taxis.incrs.forEach(incr => {\n\t\t\t\t\t!fixedDec.has(incr) && fixedDec.set(incr, guessDec(incr));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\taxis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke        = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke   = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke  = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || (          sc.distr >= 3 && sc.log == 10 ? log10AxisValsFilt : sc.distr == 3 && sc.log == 2 ? log2AxisValsFilt : retArg1));\n\n\t\t\taxis.font      = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size   = axis.size(self, null, i, 0);\n\n\t\t\taxis._space  =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs  =\n\t\t\taxis._found  =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\"  + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : _data;\n\n\t\tself.data = self._data = data;\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t}\n\t\telse {\n\t\t\tif (data.length == 0)\n\t\t\t\tself.data = self._data = data = [[]];\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tlet scaleData = data;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tscaleData = data.slice();\n\n\t\t\t\tlet _data0 = scaleData[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\t_data0[i] = i;\n\t\t\t}\n\n\t\t\tself._data = data = scaleData;\n\t\t}\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = shouldSetCursor || cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (_min == _max) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke, width, dash, cap, fill, join) {\n\t\tstroke ??= transparent;\n\t\tdash   ??= EMPTY_ARR;\n\t\tcap    ??= \"butt\"; // (\u203F|\u203F)\n\t\tfill   ??= transparent;\n\t\tjoin   ??= \"round\";\n\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap;\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? getMinMax(data, _i0, _i1, sorted, wsc.distr == 3) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tconst AUTOSCALE = {min: null, max: null};\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// implicitly add auto scales, and unranged scales\n\t\tfor (let k in scales) {\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (pendScales[k] == null &&\n\t\t\t\t(\n\t\t\t\t\t// scales that have never been set (on init)\n\t\t\t\t\tsc.min == null ||\n\t\t\t\t\t// or auto scales when the x scale was explicitly set\n\t\t\t\t\tpendScales[xScaleKey] != null && sc.auto(self, viaAutoScaleX)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tpendScales[k] = AUTOSCALE;\n\t\t\t}\n\t\t}\n\n\t\t// implicitly add dependent scales\n\t\tfor (let k in scales) {\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (pendScales[k] == null && sc.from != null && pendScales[sc.from] != null)\n\t\t\t\tpendScales[k] = AUTOSCALE;\n\t\t}\n\n\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\tif (pendScales[xScaleKey] != null)\n\t\t\tresetYSeries(true); // TODO: only reset series on auto scales?\n\n\t\tlet wipScales = {};\n\n\t\tfor (let k in pendScales) {\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null) {\n\t\t\t\tlet wsc = wipScales[k] = copy(scales[k], fastIsObj);\n\n\t\t\t\tif (psc.min != null)\n\t\t\t\t\tassign(wsc, psc);\n\t\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\twsc.min = inf;\n\t\t\t\t\t\twsc.max = -inf;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (psc == null)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tlet wsc = wipScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// don't try to contract same or adjacent idxs\n\t\t\t\t\t\tif (i1 - i0 > 1) {\n\t\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\t\ti1--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\tlet wscx = wipScales[xScaleKey];\n\t\t\t\t\t\t\tlet wscy = wipScales[yScaleKey];\n\n\t\t\t\t\t\t\t// null can happen when only x is zoomed, but y has static range and doesnt get auto-added to pending\n\t\t\t\t\t\t\twscx != null && accScale(wscx, pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\twscy != null && accScale(wscy, pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min ==  inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : distr == 100 ? sc.fwd(sc.min) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : distr == 100 ? sc.fwd(sc.max) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (showCursor && cursor.left >= 0)\n\t\t\t\tshouldSetCursor = shouldSetLegend = true;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tlet shouldAlpha = series.some(s => s._focus) && ctxAlpha != focus.alpha;\n\n\t\t\tif (shouldAlpha)\n\t\t\t\tctx.globalAlpha = ctxAlpha = focus.alpha;\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\tif (s._paths == null) {\n\t\t\t\t\t\tlet _ctxAlpha = ctxAlpha;\n\n\t\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t\tlet _idxs = mode == 2 ? [0, data[i][0].length - 1] : getOuterIdxs(data[i]);\n\t\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\n\t\t\t\t\t\tif (ctxAlpha != _ctxAlpha)\n\t\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = _ctxAlpha;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet _ctxAlpha = ctxAlpha;\n\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\ts._paths != null && drawPath(i, false);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tlet _gaps = s._paths != null ? s._paths.gaps : null;\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1, _gaps);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, _gaps);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != _ctxAlpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = _ctxAlpha;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (shouldAlpha)\n\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill   = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet {\n\t\t\tstroke,\n\t\t\tfill,\n\t\t\tclip: gapsClip,\n\t\t\tflags,\n\n\t\t\t_stroke: strokeStyle = s._stroke,\n\t\t\t_fill:   fillStyle   = s._fill,\n\t\t\t_width:  width       = s.width,\n\t\t} = s._paths;\n\n\t\twidth = roundDec(width * pxRatio, 3);\n\n\t\tlet boundsClip = null;\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1 && offset > 0;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft - width / 2,\n\t\t\t\ttop = plotTop - width / 2,\n\t\t\t\twid = plotWid + width,\n\t\t\t\thgt = plotHgt + width;\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tflags != 0 && bands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs    = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace    = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr   = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\t// axis label\n\t\t\tif (axis.label != null) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tlet _label = isFn(axis.label) ? axis.label(self, i, _incr, _space) : axis.label;\n\n\t\t\t\tctx.fillText(_label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr   = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet _tickSize = ticks.show ? ticks.size : 0;\n\t\t\tlet tickSize = round(_tickSize * pxRatio);\n\t\t\tlet axisGap = round((axis.alignTo == 2 ? axis._size - _tickSize - axis.gap : axis.gap) * pxRatio);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos  = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t    y        = ori == 0 ? finalPos : 0;\n\t\t\t    x        = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font         = axis.font[0];\n\t\t\tlet textAlign    = axis.align == 1 ? LEFT :\n\t\t\t                   axis.align == 2 ? RIGHT :\n\t\t\t                   angle > 0 ? LEFT :\n\t\t\t                   angle < 0 ? RIGHT :\n\t\t\t                   ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t                   ori == 1 ? \"middle\" : side == 2 ? TOP   : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * axis.lineGap;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\tlet deferHooks = false;\n\tlet hooksQueue = [];\n\n\tfunction flushHooks() {\n\t\tdeferHooks = false;\n\n\t\tfor (let i = 0; i < hooksQueue.length; i++)\n\t\t\tfire(...hooksQueue[i]);\n\n\t\thooksQueue.length = 0;\n\t}\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\t// manual batching (aka immediate mode), skips microtask queue\n\tfunction batch(fn, _deferHooks = false) {\n\t\tqueuedCommit = true;\n\t\tdeferHooks = _deferHooks;\n\n\t\tfn(self);\n\t\t_commit();\n\n\t\tif (_deferHooks && hooksQueue.length > 0)\n\t\t\tqueueMicrotask(flushHooks);\n\t}\n\n\tself.batch = batch;\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT,   plotLftCss);\n\t\t\tsetStylePx(under, TOP,    plotTopCss);\n\t\t\tsetStylePx(under, WIDTH,  plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT,    plotLftCss);\n\t\t\tsetStylePx(over, TOP,     plotTopCss);\n\t\t\tsetStylePx(over, WIDTH,   plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT,  plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH,   fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT,  fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width  = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\"   : \"top\",    _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\"  : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\"    : \"left\",   isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\",  isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tif (\n\t\t\t\tplotLftCss != _plotLftCss ||\n\t\t\t\tplotTopCss != _plotTopCss ||\n\t\t\t\tplotWidCss != _plotWidCss ||\n\t\t\t\tplotHgtCss != _plotHgtCss\n\t\t\t) {\n\t\t\t\tresetYSeries(false);\n\n\t\t\t\tlet pctWid = plotWidCss / _plotWidCss;\n\t\t\t\tlet pctHgt = plotHgtCss / _plotHgtCss;\n\n\t\t\t\tif (showCursor && !shouldSetCursor && cursor.left >= 0) {\n\t\t\t\t\tcursor.left *= pctWid;\n\t\t\t\t\tcursor.top  *= pctHgt;\n\n\t\t\t\t\tvCursor && elTrans(vCursor, round(cursor.left), 0, plotWidCss, plotHgtCss);\n\t\t\t\t\thCursor && elTrans(hCursor, 0, round(cursor.top), plotWidCss, plotHgtCss);\n\n\t\t\t\t\tfor (let i = 0; i < cursorPts.length; i++) {\n\t\t\t\t\t\tlet pt = cursorPts[i];\n\n\t\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\t\tcursorPtsLft[i] *= pctWid;\n\t\t\t\t\t\t\tcursorPtsTop[i] *= pctHgt;\n\t\t\t\t\t\t\telTrans(pt, ceil(cursorPtsLft[i]), ceil(cursorPtsTop[i]), plotWidCss, plotHgtCss);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (select.show && !shouldSetSelect && select.left >= 0 && select.width > 0) {\n\t\t\t\t\tselect.left   *= pctWid;\n\t\t\t\t\tselect.width  *= pctWid;\n\t\t\t\t\tselect.top    *= pctHgt;\n\t\t\t\t\tselect.height *= pctHgt;\n\n\t\t\t\t\tfor (let prop in _hideProps)\n\t\t\t\t\t\tsetStylePx(selectDiv, prop, select[prop]);\n\t\t\t\t}\n\n\t\t\t\t_plotLftCss = plotLftCss;\n\t\t\t\t_plotTopCss = plotTopCss;\n\t\t\t\t_plotWidCss = plotWidCss;\n\t\t\t\t_plotHgtCss = plotHgtCss;\n\t\t\t}\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t\tif (select.show && shouldSetSelect) {\n\t\t\tsetSelect(select);\n\t\t\tshouldSetSelect = false;\n\t\t}\n\n\t\tif (showCursor && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t\tif (legend.show && legend.live && shouldSetLegend) {\n\t\t\tsetLegend();\n\t\t\tshouldSetLegend = false; // redundant currently\n\t\t}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (showCursor) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow:   true,\n\t\tover:   true,\n\t\tleft:   0,\n\t\twidth:  0,\n\t\ttop:    0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts) {\n\t\t\t\tselect[prop] = opts[prop];\n\n\t\t\t\tif (prop in _hideProps)\n\t\t\t\t\tsetStylePx(selectDiv, prop, opts[prop]);\n\t\t\t}\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i) {\n\t\tlet s = series[i];\n\n\t\tif (s.show)\n\t\t\tshowLegend && remClass(legendRows[i], OFF);\n\t\telse {\n\t\t\tshowLegend && addClass(legendRows[i], OFF);\n\n\t\t\tif (showCursor) {\n\t\t\t\tlet pt = cursorOnePt ? cursorPts[0] : cursorPts[i];\n\t\t\t\tpt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si);\n\n\t\t\t\t\tif (mode == 2) {\n\t\t\t\t\t\t_setScale(s.facets[0].scale, null, null);\n\t\t\t\t\t\t_setScale(s.facets[1].scale, null, null);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_setScale(s.scale, null, null);\n\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (showCursor && cursorPts[i] != null)\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE  = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tif (mode == 1 || i2 > 0) {\n\t\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\tonMouse(mouseleave, legendTable, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tsetCursorEvent(e);\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tdistr == 100 ? sc.bwd(sv) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\tself.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t};\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT,  select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP,    select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tif (opts.idxs) {\n\t\t\t\topts.idxs.forEach((didx, sidx) => {\n\t\t\t\t\tactiveIdxs[sidx] = didx;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (!isUndef(opts.idx))\n\t\t\t\tactiveIdxs.fill(opts.idx);\n\n\t\t\tlegend.idx = activeIdxs[0];\n\t\t}\n\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let sidx = 0; sidx < series.length; sidx++) {\n\t\t\t\tif (sidx > 0 || mode == 1 && !multiValLegend)\n\t\t\t\t\tsetLegendValues(sidx, activeIdxs[sidx]);\n\t\t\t}\n\n\t\t\tsyncLegend();\n\t\t}\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet s = series[sidx];\n\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\tlet val;\n\n\t\tif (multiValLegend)\n\t\t\tval = s.values(self, sidx, idx) ?? NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tval = s.value(self, idx == null ? null : src[idx], sidx, idx);\n\t\t\tval = val == null ? NULL_LEGEND_VALUES : {_: val};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (showCursor) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\t\tclosestSeries = null;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = cursor.idx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tlet pt = cursorPts[i];\n\t\t\t\tpt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(idx);\n\t\t\t\tshouldSetLegend = true;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = cursor.idx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = valToPosX(data[0][idx], scaleX, xDim, 0);\n\t\t\t}\n\n\t\t\t// closest pt values\n\t\t\tlet _ptLft = -10;\n\t\t\tlet _ptTop = -10;\n\t\t\tlet _ptWid = 0;\n\t\t\tlet _ptHgt = 0;\n\t\t\tlet _centered = true;\n\t\t\tlet _ptFill = '';\n\t\t\tlet _ptStroke = '';\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1  = activeIdxs[i];\n\t\t\t\tlet yVal1 = idx1 == null ? null : (mode == 1 ? data[i][idx1] : data[i][1][idx1]);\n\n\t\t\t\tlet idx2  = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = idx2 == null ? null : (mode == 1 ? data[i][idx2] : data[i][1][idx2]);\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet xPos2 = idx2 == null ? -10 : idx2 == idx ? xPos : valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0);\n\n\t\t\t\t\t// this doesnt really work for state timeline, heatmap, status history (where the value maps to color, not y coords)\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0);\n\n\t\t\t\t\tif (cursorFocus && yVal2 != null) {\n\t\t\t\t\t\tlet mouseYPos = scaleX.ori == 1 ? mouseLeft1 : mouseTop1;\n\t\t\t\t\t\tlet dist = abs(focus.dist(self, i, idx2, yPos, mouseYPos));\n\n\t\t\t\t\t\tif (dist < closestDist) {\n\t\t\t\t\t\t\tlet bias = focus.bias;\n\n\t\t\t\t\t\t\tif (bias != 0) {\n\t\t\t\t\t\t\t\tlet mouseYVal = posToVal(mouseYPos, s.scale);\n\n\t\t\t\t\t\t\t\tlet seriesYValSign = yVal2     >= 0 ? 1 : -1;\n\t\t\t\t\t\t\t\tlet mouseYValSign  = mouseYVal >= 0 ? 1 : -1;\n\n\t\t\t\t\t\t\t\t// with a focus bias, we will never cross zero when prox testing\n\t\t\t\t\t\t\t\t// it's either closest towards zero, or closest away from zero\n\t\t\t\t\t\t\t\tif (mouseYValSign == seriesYValSign && (\n\t\t\t\t\t\t\t\t\tmouseYValSign == 1 ?\n\t\t\t\t\t\t\t\t\t\t(bias == 1 ? yVal2 >= mouseYVal : yVal2 <= mouseYVal) :  // >= 0\n\t\t\t\t\t\t\t\t\t\t(bias == 1 ? yVal2 <= mouseYVal : yVal2 >= mouseYVal)    //  < 0\n\t\t\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend || cursorOnePt) {\n\t\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tptStroke, ptFill,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tptFill = points.fill(self, i);\n\t\t\t\t\t\tptStroke = points.stroke(self, i);\n\n\t\t\t\t\t\tif (cursorOnePt) {\n\t\t\t\t\t\t\tif (i == closestSeries && closestDist <= focus.prox) {\n\t\t\t\t\t\t\t\t_ptLft = ptLft;\n\t\t\t\t\t\t\t\t_ptTop = ptTop;\n\t\t\t\t\t\t\t\t_ptWid = ptWid;\n\t\t\t\t\t\t\t\t_ptHgt = ptHgt;\n\t\t\t\t\t\t\t\t_centered = centered;\n\t\t\t\t\t\t\t\t_ptFill = ptFill;\n\t\t\t\t\t\t\t\t_ptStroke = ptStroke;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlet pt = cursorPts[i];\n\n\t\t\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\t\t\tcursorPtsLft[i] = ptLft;\n\t\t\t\t\t\t\t\tcursorPtsTop[i] = ptTop;\n\n\t\t\t\t\t\t\t\telSize(pt, ptWid, ptHgt, centered);\n\t\t\t\t\t\t\t\telColor(pt, ptFill, ptStroke);\n\t\t\t\t\t\t\t\telTrans(pt, ceil(ptLft), ceil(ptTop), plotWidCss, plotHgtCss);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if only using single hover point (at cursorPts[0])\n\t\t\t// we have trigger styling at last visible series (once closestSeries is settled)\n\t\t\tif (cursorOnePt) {\n\t\t\t\t// some of this logic is similar to series focus below, since it matches the behavior by design\n\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tlet focusChanged = focusedSeries == null ? closestDist <= p : (closestDist > p || closestSeries != focusedSeries);\n\n\t\t\t\tif (shouldSetLegend || focusChanged) {\n\t\t\t\t\tlet pt = cursorPts[0];\n\n\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\tcursorPtsLft[0] = _ptLft;\n\t\t\t\t\t\tcursorPtsTop[0] = _ptTop;\n\n\t\t\t\t\t\telSize(pt, _ptWid, _ptHgt, _centered);\n\t\t\t\t\t\telColor(pt, _ptFill, _ptStroke);\n\t\t\t\t\t\telTrans(pt, ceil(_ptLft), ceil(_ptTop), plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKeySrc].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc),        sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc),        sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t_fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tObject.defineProperty(self, 'rect', {\n\t\tget() {\n\t\t\tif (rect == null)\n\t\t\t\tsyncRect(false);\n\n\t\t\treturn rect;\n\t\t},\n\t});\n\n\tfunction syncRect(defer = false) {\n\t\tif (defer)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\t// Chrome on Windows has a bug which triggers a stray mousemove event after an initial mousedown event\n\t\t// when clicking into a plot as part of re-focusing the browser window.\n\t\t// we gotta ignore it to avoid triggering a phantom drag / setSelect\n\t\t// However, on touch-only devices Chrome-based browsers trigger a 0-distance mousemove before mousedown\n\t\t// so we don't ignore it when mousedown has set the dragging flag\n\t\tif (dragging && e != null && e.movementX == 0 && e.movementY == 0)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tsetCursorEvent(e);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap && (src == null || src.cursor.event.type == mousemove)) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t\tleft: 0,\n\t\ttop: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tlet downSelectLeft;\n\tlet downSelectTop;\n\tlet downSelectWidth;\n\tlet downSelectHeight;\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp, false);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tdownSelectLeft   = left;\n\t\tdownSelectTop    = top;\n\t\tdownSelectWidth  = width;\n\t\tdownSelectHeight = height;\n\n\t//\thideSelect();\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\t\tlet chgSelect = (\n\t\t\tdownSelectLeft   != left   ||\n\t\t\tdownSelectTop    != top    ||\n\t\t\tdownSelectWidth  != width  ||\n\t\t\tdownSelectHeight != height\n\t\t);\n\n\t\thasSelect && chgSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect && chgSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\t\t\tupdateCursor(src, true, e != null);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tsetCursorEvent(e);\n\n\t\tlet _dragging = dragging;\n\n\t\tif (dragging) {\n\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\tlet snapH = true;\n\t\t\tlet snapV = true;\n\t\t\tlet snapProx = 10;\n\n\t\t\tlet dragH, dragV;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tdragH = dragX;\n\t\t\t\tdragV = dragY;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdragH = dragY;\n\t\t\t\tdragV = dragX;\n\t\t\t}\n\n\t\t\tif (dragH && dragV) {\n\t\t\t\t// maybe omni corner snap\n\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\tsnapV = mouseTop1  <= snapProx || mouseTop1  >= plotHgtCss - snapProx;\n\t\t\t}\n\n\t\t\tif (dragH && snapH)\n\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\tif (dragV && snapV)\n\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tdragging = false;\n\t\t}\n\n\t\tmouseLeft1 = -10;\n\t\tmouseTop1 = -10;\n\n\t\tactiveIdxs.fill(null);\n\n\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\tupdateCursor(null, true, true);\n\n\t\tif (_dragging)\n\t\t\tdragging = _dragging;\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tsetCursorEvent(e);\n\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tlet seriesIdxMatcher = syncOpts.match[2];\n\t\tidx = seriesIdxMatcher(self, src, idx);\n\t\tidx != -1 && setSeries(idx, opts, true, false);\n\t};\n\n\tif (showCursor) {\n\t\tonMouse(mousedown,  over, mouseDown);\n\t\tonMouse(mousemove,  over, mouseMove);\n\t\tonMouse(mouseenter, over, e => {\n\t\t\tsetCursorEvent(e);\n\t\t\tsyncRect(false);\n\t\t});\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (deferHooks)\n\t\t\thooksQueue.push([evName, a1, a2]);\n\t\telse {\n\t\t\tif (evName in hooks) {\n\t\t\t\thooks[evName].forEach(fn => {\n\t\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst seriesIdxMatcher = (self, src, srcSeriesIdx) => srcSeriesIdx;\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq, seriesIdxMatcher],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\tif (syncOpts.match.length == 2)\n\t\tsyncOpts.match.push(seriesIdxMatcher);\n\n\tcursor.sync = syncOpts;\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\tself.pub = pub;\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tlegendTable?.remove(); // in case mounted outside of root\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\tshouldSetSelect = select.show && (select.width > 0 || select.height > 0);\n\t\tshouldSetCursor = shouldSetLegend = true;\n\n\t\t_setSize(opts.width, opts.height);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient   = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate  = tzDate;\n}\n\nuPlot.sync = _sync;\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear  = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars    = bars);\n\t(paths.spline  = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import type {Scale as uScale, DrawOrderKey as uDrawOrderKey, Axis as uAxis} from 'uplot';\n\nexport const DrawOrderKey: Record<keyof typeof uDrawOrderKey, uDrawOrderKey> = {\n    Series: 'series' as uDrawOrderKey.Series,\n    Axes: 'axes' as uDrawOrderKey.Axes,\n};\n\ninterface YScale {\n    Distr: Record<keyof typeof uScale.Distr, uScale.Distr>;\n}\n\nexport const Scale: YScale = {\n    Distr: {\n        Linear: 1 as uScale.Distr.Linear,\n        Ordinal: 2 as uScale.Distr.Ordinal,\n        Logarithmic: 3 as uScale.Distr.Logarithmic,\n        ArcSinh: 4 as uScale.Distr.ArcSinh,\n        Custom: 5 as uScale.Distr.Custom,\n    },\n};\n\ninterface YAxis {\n    Side: Record<keyof typeof uAxis.Side, uAxis.Side>;\n    Align: Record<keyof typeof uAxis.Align, uAxis.Align>;\n}\n\nexport const Axis: YAxis = {\n    Side: {\n        Top: 0 as uAxis.Side.Top,\n        Right: 1 as uAxis.Side.Right,\n        Bottom: 2 as uAxis.Side.Bottom,\n        Left: 3 as uAxis.Side.Left,\n    },\n    Align: {\n        Right: 0 as uAxis.Align.Right,\n        Left: 1 as uAxis.Align.Left,\n    },\n};\n", "import uPlot from 'uplot';\nimport type {Axis} from 'uplot';\nimport * as defaults from '../defaults';\nimport type Yagr from '../../';\nimport {YagrConfig, AxisOptions} from '../types';\n\nimport {asFn, getUnitSuffix, isNil, px, toFixed} from './common';\nimport {Axis as TypedAxis} from './types';\n\nconst YAGR_AXIS_TO_UPLOT_AXIS = {\n    right: TypedAxis.Side.Right,\n    top: TypedAxis.Side.Top,\n    bottom: TypedAxis.Side.Bottom,\n    left: TypedAxis.Side.Left,\n};\n\nconst AXIS_SIDE_TO_ALIGN = {\n    left: TypedAxis.Align.Right,\n    right: TypedAxis.Align.Left,\n    top: undefined,\n    bottom: undefined,\n};\n\nexport const getAxisPositioning = (side: AxisOptions['side'], align: Axis['align']) => {\n    return {\n        side: side ? YAGR_AXIS_TO_UPLOT_AXIS[side] : TypedAxis.Side.Left,\n        align: align || (side ? AXIS_SIDE_TO_ALIGN[side] : undefined),\n    };\n};\n\nexport const getDefaultNumberFormatter = (precision: 'auto' | number, nullValue = '') => {\n    return (n: number | null) => {\n        if (isNil(n)) {\n            return nullValue;\n        }\n\n        if (n === 0) {\n            return '0';\n        }\n\n        const abs = Math.abs(n);\n        const precisionNum = precision === 'auto' ? 2 : precision;\n\n        const [pow, suffix] = getUnitSuffix(abs);\n        const transformedValue = n / pow;\n\n        return (\n            (precision === 'auto'\n                ? String(transformedValue).replace(/\\.(\\d{5,})/, (match) => {\n                      return match.slice(0, 6);\n                  })\n                : toFixed(transformedValue, precisionNum)) + suffix\n        );\n    };\n};\n\n/*\n * Generates ticks labels values\n */\nconst getNumericValueFormatter = (axisConfig: AxisOptions) => {\n    const p = axisConfig.precision;\n    const numFormatter = getDefaultNumberFormatter(typeof p === 'number' ? p : p || 'auto', '');\n    return function defaultNumericValueFormatter(_: unknown, ticks: number[]) {\n        return ticks.map(numFormatter);\n    };\n};\n\nconst dayTimeFormatter = uPlot.fmtDate('{DD}.{MM}.{YYYY}');\nconst dateTimeFormatter = uPlot.fmtDate('{HH}:{mm}:{ss}');\nconst minuteFormatter = uPlot.fmtDate('{mm}:{ss}');\nconst secondFormatter = uPlot.fmtDate('{mm}:{ss}.{fff}');\nconst yearFormatter = uPlot.fmtDate('{YYYY}');\n\nfunction getTimeFormatterByRange(range: number, ticksCount: number) {\n    let formatter = dayTimeFormatter;\n    const minRange = Math.ceil(range / ticksCount);\n\n    if (minRange <= defaults.SECOND) {\n        formatter = secondFormatter;\n    } else if (minRange <= defaults.MINUTE) {\n        formatter = minuteFormatter;\n    } else if (minRange <= defaults.DAY) {\n        formatter = dateTimeFormatter;\n    } else if (minRange >= defaults.YEAR) {\n        formatter = yearFormatter;\n    }\n\n    return (x: number) => formatter(new Date(x));\n}\n\nexport const getTimeFormatter = (config: YagrConfig) => {\n    const msm = config.chart.timeMultiplier || defaults.TIME_MULTIPLIER;\n    return (_: unknown, ticks: number[]) => {\n        const range = ticks[ticks.length - 1] - ticks[0];\n        const rangeMs = range / msm;\n        const formatter = getTimeFormatterByRange(rangeMs, ticks.length);\n\n        return ticks.map((rawValue) => {\n            return formatter(rawValue / msm);\n        });\n    };\n};\n\nfunction getSplits(splitsCount: number) {\n    return (_: uPlot, __: number, scaleMin: number, scaleMax: number) => {\n        if (splitsCount <= 2) {\n            return [scaleMin, scaleMax];\n        }\n\n        const dist = Math.abs(scaleMax - scaleMin);\n        const step = dist / (splitsCount - 1);\n        let i = step;\n        const splits = [];\n        while (scaleMin + i < scaleMax) {\n            splits.push(scaleMin + i);\n            i += step;\n        }\n        return [scaleMin, ...splits, scaleMax];\n    };\n}\n\n// eslint-disable-next-line complexity\nfunction getAxis(axisConfig: AxisOptions, yagr: Yagr): Axis {\n    const theme = yagr.utils.theme;\n    const config = yagr.config;\n\n    const axis: Axis = {\n        splits: axisConfig.splitsCount ? getSplits(axisConfig.splitsCount) : axisConfig.splits,\n        show: typeof axisConfig.show === 'undefined' ? true : axisConfig.show,\n        label: axisConfig.label || undefined,\n        labelSize: axisConfig.labelSize || defaults.Y_AXIS_LABEL_SIZE,\n        labelFont: axisConfig.labelFont || defaults.AXIS_LABEL_FONT,\n        font: axisConfig.font || defaults.AXIS_VALUES_FONT,\n        stroke: axisConfig.stroke || (() => theme.AXIS_STROKE),\n        ticks: axisConfig.ticks ? {...theme.Y_AXIS_TICKS, ...axisConfig.ticks} : theme.Y_AXIS_TICKS,\n        grid: config.grid || axisConfig.grid || theme.GRID,\n    };\n\n    if (axisConfig.scale === defaults.DEFAULT_X_SCALE) {\n        return Object.assign(axis, {\n            getFormatter: getTimeFormatterByRange,\n            gap: axisConfig.gap ?? defaults.X_AXIS_TICK_GAP,\n            size: asFn(axisConfig.size) || (() => defaults.X_AXIS_SIZE),\n            values: axisConfig.values || getTimeFormatter(config),\n            ticks: axisConfig.ticks ? {...theme.X_AXIS_TICKS, ...axisConfig.ticks} : theme.X_AXIS_TICKS,\n            scale: defaults.DEFAULT_X_SCALE,\n            space: axisConfig.space || (() => defaults.X_AXIS_SPACE),\n            incrs: axisConfig.incrs || (() => defaults.X_AXIS_INCRS.map((i) => i * (config.chart.timeMultiplier || defaults.TIME_MULTIPLIER))),\n            ...(axisConfig.side\n                ? getAxisPositioning(axisConfig.side, axisConfig.align)\n                : {side: TypedAxis.Side.Bottom}),\n            stroke: axisConfig.stroke || (() => theme.AXIS_STROKE),\n        });\n    }\n\n    Object.assign(axis, {\n        gap: axisConfig.gap ?? defaults.Y_AXIS_TICK_GAP,\n        size: asFn(axisConfig.size) || defaults.Y_AXIS_SIZE,\n        values: axisConfig.values || getNumericValueFormatter(axisConfig),\n        scale: axisConfig.scale || defaults.DEFAULT_Y_SCALE,\n        getFormatter: () =>\n            getDefaultNumberFormatter(\n                typeof axisConfig.precision === 'number' ? axisConfig.precision : axisConfig.precision || 'auto',\n                '',\n            ),\n        ...getAxisPositioning(axisConfig.side || 'left', axisConfig.align),\n    });\n\n    if (axisConfig.space) {\n        axis.space = axisConfig.space;\n    }\n\n    return axis;\n}\n\nexport function getRedrawOptionsForAxesUpdate(axes: YagrConfig['axes']) {\n    const options: [series: boolean, axes: boolean] = [false, true];\n\n    Object.values(axes).forEach((s) => {\n        const uOpts: (keyof AxisOptions)[] = ['align', 'side', 'size', 'label', 'labelFont', 'labelGap', 'labelSize'];\n        if (uOpts.some((t) => s[t] !== undefined)) {\n            options[1] = true;\n        }\n    });\n\n    return options;\n}\n\n\nfunction pxRatioFont(font: string) {\n\tlet fontSize, fontSizeCss;\n    // eslint-disable-next-line no-return-assign\n\tfont = font.replace(/(\\d+)px/, (_, p1) => px((fontSize = Math.round((fontSizeCss = Number(p1)) * window.devicePixelRatio))));\n\treturn [font, fontSize, fontSizeCss];\n}\n\nexport function updateAxis(yagr: Yagr, uAxis: Axis, axisConfig: AxisOptions) {\n    const upd = getAxis(\n        {\n            ...axisConfig,\n            font: uAxis.font,\n        },\n        yagr,\n    );\n\n    upd.ticks = {...uAxis.ticks, ...upd.ticks};\n    upd.grid = {...uAxis.grid, ...upd.grid};\n    upd.border = {...uAxis.border, ...upd.border};\n    upd.splits = upd.splits || uAxis.splits;\n\n    /**\n     * uPlot implicitly converts theese properties and mutate axis.font and axis.labelFont\n     * but doesn't cover it with typings.\n     * @see https://github.com/leeoniya/uPlot/blob/378faf6fab9b84d86fd25a5b4425dc44d486b64d/src/uPlot.js#L275\n     */\n    if (axisConfig.font && axisConfig.font !== uAxis.font?.[0]) {\n        //@ts-ignore \n        upd.font = pxRatioFont(axisConfig.font);\n    }\n    if (axisConfig.labelFont && axisConfig.labelFont !== uAxis.labelFont?.[0]) {\n        //@ts-ignore\n        upd.labelFont = pxRatioFont(axisConfig.labelFont);\n    }\n\n    Object.assign(uAxis, upd);\n\n    yagr.plugins.plotLines?.update(axisConfig.plotLines, axisConfig.scale);\n}\n\nexport function configureAxes(yagr: Yagr, config: YagrConfig) {\n    const axes: Axis[] = [];\n\n    Object.entries(config.axes).forEach(([scale, axisConfig]) => {\n        axes.push(getAxis({...axisConfig, scale}, yagr));\n    });\n\n    const x = defaults.DEFAULT_X_SCALE;\n    const y = defaults.DEFAULT_Y_SCALE;\n\n    if (!config.axes[x]) {\n        axes.push(getAxis({scale: x}, yagr));\n    }\n\n    if (!axes.find(({scale}) => scale !== x)) {\n        axes.push(getAxis({scale: y}, yagr));\n    }\n\n    return axes;\n}\n", "/* eslint-disable no-nested-ternary */\nimport UPlot, {Range} from 'uplot';\nimport {YagrConfig, Scale} from '../types';\nimport {\n    DEFAULT_MAX_TICKS,\n    DEFAULT_Y_AXIS_OFFSET,\n    DEFAULT_SCALE_MIN_RANGE,\n    DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE,\n    DEFAULT_X_SCALE,\n} from '../defaults';\nimport type Yagr from '../index';\nimport {Scale as YScale} from './types';\n\ntype ScaleRangeType = (\n    min: number,\n    max: number,\n    scfg: Scale,\n    ycfg: YagrConfig,\n) => {min: number; max: number};\n\nexport const getScaleRange = (scale: Scale, config: YagrConfig) => {\n    const range = scale.range;\n    if (typeof range === 'function') {\n        return (u: UPlot, dataMin: number, dataMax: number) => {\n            return range(u, dataMin, dataMax, config);\n        };\n    }\n\n    if (scale.normalize) {\n        return [0, scale.normalizeBase || 100] as Range.MinMax;\n    }\n\n    if (scale.range === 'auto') {\n        return undefined;\n    }\n\n    let rangeFn: ScaleRangeType;\n\n    switch (scale.range) {\n        case undefined:\n        case 'nice': {\n            rangeFn = niceScale;\n            break;\n        }\n        case 'offset': {\n            rangeFn = offsetScale;\n            break;\n        }\n        default:\n            throw new Error(`Unknown scale range type ${scale.range}`);\n    }\n\n    return (_: UPlot, dMin: number, dMax: number): Range.MinMax => {\n        let {min, max} = rangeFn(dMin, dMax, scale, config);\n\n        const minRange = scale.minRange || DEFAULT_SCALE_MIN_RANGE;\n\n        if (Math.abs(max - min) < minRange) {\n            if (min >= 0) {\n                max += minRange;\n            } else {\n                max += minRange / 2;\n                min -= minRange / 2;\n            }\n        }\n\n        min = typeof scale.min === 'number' ? scale.min : min;\n        max = typeof scale.max === 'number' ? scale.max : max;\n\n        /** Protect logarithmic scale from impossible min values */\n        if (scale.type === 'logarithmic') {\n            const isScaleMinDefined = typeof scale.min === 'number';\n\n            if (min <= 0) {\n                min = DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE;\n            } else if (!isScaleMinDefined) {\n                min = Math.min(min, DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE);\n            }\n        }\n\n        if (min >= max || max <= min) {\n            if (typeof scale.max === 'number') {\n                min = max - (niceNum(max - max * 0.1, false) || 1);\n            } else {\n                max = min + (niceNum(min + min * 0.1, false) || 1);\n            }\n        }\n\n        return [min, max];\n    };\n};\n\nexport function offsetScale(dataMin: number, dataMax: number, scaleConfig: Scale) {\n    const startFromZero = dataMin >= 0 && scaleConfig.stacking;\n    const endWithZero = dataMax <= 0 && scaleConfig.stacking;\n\n    return {\n        min: startFromZero\n            ? 0\n            : Math.round(\n                  dataMin - Math.abs(dataMin) * (scaleConfig.offset || DEFAULT_Y_AXIS_OFFSET),\n              ),\n        max: endWithZero\n            ? 0\n            : Math.round(\n                  dataMax + Math.abs(dataMax) * (scaleConfig.offset || DEFAULT_Y_AXIS_OFFSET),\n              ),\n    };\n}\n\n/*\n * Implementation nice scale (see https://www.baeldung.com/cs/choosing-linear-scale-y-axis#procedure-for-identifying-scale-and-ticks)\n * with extra options inherited from Solomon stacked area visualization\n * with extra options implementing consistent incr proximity if dataMin ~= dataMax. (16.01.2020)\n * with extra options for small ranges between max and min (27.01.2020)\n */\nexport function niceScale(dataMin: number, dataMax: number, scaleConfig: Scale) {\n    const startFromZero = dataMin >= 0 && scaleConfig.stacking;\n    const endWithZero = dataMax <= 0 && scaleConfig.stacking;\n\n    /**\n     * This code handles case when scale has user max/min and niceScale's\n     * range after usage of given max-min from scale config creates not centered lines\n     */\n    const dMax = endWithZero ? 0 : typeof scaleConfig.max === 'number' ? scaleConfig.max : dataMax;\n    const dMin = startFromZero\n        ? 0\n        : typeof scaleConfig.min === 'number'\n          ? scaleConfig.min\n          : dataMin;\n\n    if (dMin === dMax) {\n        return dMin >= 0 ? {min: dMin, max: dMin + 2} : {min: dMin - 1, max: dMin + 1};\n    }\n\n    const difference = dMax - dMin;\n    const range = niceNum(difference, false);\n    const incr = niceNum(range / (DEFAULT_MAX_TICKS - 1), true);\n    let max = Math.ceil(dMax / incr) * incr;\n    max = isNaN(max) ? 100 : max;\n    let min = (startFromZero ? Math.min(0, dMin) : Math.floor(dMin / incr) * incr) || 0;\n\n    /** Workaround for weird ranges */\n    if (min === max) {\n        min -= 1;\n        max += 1;\n    }\n\n    return {\n        min,\n        max,\n    };\n}\n\nfunction niceNum(delta: number, round: boolean) {\n    const exp = Math.floor(Math.log10(delta));\n    const frac = delta / 10 ** exp;\n\n    const niceFrac = round\n        ? frac < 1.5\n            ? 1\n            : frac < 3\n              ? 2\n              : frac < 7\n                ? 5\n                : 10\n        : frac <= 1\n          ? 1\n          : frac <= 2\n            ? 2\n            : frac <= 5\n              ? 5\n              : 10;\n\n    return niceFrac * 10 ** exp;\n}\n\nexport function configureScales(yagr: Yagr, scales: UPlot.Scales, config: YagrConfig) {\n    const scalesToMap = config.scales ? {...config.scales} : {};\n\n    if (!Object.keys(config.scales).length) {\n        scalesToMap.y = {};\n    }\n\n    Object.entries(scalesToMap).forEach(([scaleName, scaleConfig]) => {\n        scales[scaleName] = scales[scaleName] || {};\n        const scale = scales[scaleName];\n\n        if (scaleConfig.time !== undefined) {\n            scale.time = scaleConfig.time;\n        }\n\n        if (scaleConfig.ori !== undefined) {\n            scale.ori = scaleConfig.ori;\n        }\n\n        if (scaleConfig.dir !== undefined) {\n            scale.dir = scaleConfig.dir;\n        }\n\n        const isLogScale = scaleConfig.type === 'logarithmic';\n\n        if (isLogScale) {\n            scale.distr = YScale.Distr.Logarithmic;\n        }\n\n        // The x scale range is managed by uPlot. Keep Yagr's range processing\n        // off it, while still forwarding the native scale options above.\n        if (scaleName === DEFAULT_X_SCALE) {\n            return;\n        }\n\n        const forceMin = typeof scaleConfig.min === 'number' ? scaleConfig.min : null;\n        const forceMax = typeof scaleConfig.max === 'number' ? scaleConfig.max : null;\n\n        /** At first handle case when scale has setted min and max */\n        if (forceMax !== null && forceMin !== null) {\n            if (forceMax <= forceMin) {\n                throw new Error('Invalid scale config. .max should be > .min');\n            }\n            scale.range = [forceMin, forceMax];\n        }\n\n        if (isLogScale) {\n            scale.range = getScaleRange(scaleConfig, config);\n\n            return;\n        }\n\n        if (yagr.isEmpty) {\n            scale.range = [\n                forceMin === null ? (isLogScale ? 1 : 0) : forceMin,\n                forceMax === null ? 100 : forceMax,\n            ];\n            return;\n        }\n\n        scale.range = getScaleRange(scaleConfig, config);\n    });\n\n    if (!scales.x) {\n        scales.x = {\n            time: true,\n        };\n    }\n\n    return scales;\n}\n", "const LOCALIZATIONS: Record<string, Record<string, string>> = {\n    ru: {\n        'hide-all': '\u0421\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0435',\n        'show-all': '\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435',\n        sum: '\u0421\u0443\u043C\u043C\u0430',\n        scale: '\u0428\u043A\u0430\u043B\u0430',\n        series: '\u041B\u0438\u043D\u0438\u044F',\n        weekend: '\u0412\u044B\u0445\u043E\u0434\u043D\u043E\u0439',\n        nodata: '\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445',\n    },\n    en: {\n        'hide-all': 'Hide all',\n        'show-all': 'Show all',\n        sum: 'Total',\n        scale: 'Scale',\n        series: 'Series',\n        weekend: 'Weekend',\n        nodata: 'No data',\n    },\n};\n\nexport default (locale: keyof typeof LOCALIZATIONS | Record<string, string> = 'en') => {\n    if (typeof locale !== 'string') {\n        LOCALIZATIONS.custom = locale;\n        locale = 'custom';\n    }\n\n    return (key: string) => {\n        return LOCALIZATIONS[locale as string][key] || key;\n    };\n};\n", "/* eslint-disable complexity, no-nested-ternary */\n\nimport uPlot, {Series} from 'uplot';\n\nimport {CursorOptions} from '../cursor/cursor';\nimport {placement as placementFn} from './placement';\n\nimport Yagr from '../../index';\nimport {DataSeries, ProcessingInterpolation, YagrPlugin} from '../../types';\n\nimport {\n    TOOLTIP_Y_OFFSET,\n    TOOLTIP_X_OFFSET,\n    TOOLTIP_DEFAULT_MAX_LINES,\n    DEFAULT_Y_SCALE,\n} from '../../defaults';\n\nimport {findInRange, findDataIdx, findSticky, px, isNil, inBetween} from '../../utils/common';\nimport {\n    TooltipOptions,\n    TooltipRow,\n    TrackingOptions,\n    ValueFormatter,\n    TooltipSection,\n    TooltipHandler,\n    TooltipData,\n    TooltipState,\n    TooltipAction,\n    SelectionRange,\n} from './types';\n\nimport {renderTooltip} from './render';\nimport {getOptionValue} from './utils';\n\n// eslint-disable-next-line complexity\nconst findValue = (\n    cursor: CursorOptions,\n    data: DataSeries,\n    serie: Series,\n    idx: number,\n    interpolation?: ProcessingInterpolation,\n) => {\n    const source = Array.isArray(serie.$c) ? serie.$c : data;\n    let value = source[idx];\n\n    if (interpolation && value === interpolation.value) {\n        const snapTo = interpolation.snapToValues ?? 'closest';\n        const nonNullIdx = findDataIdx(source, serie, idx, snapTo, interpolation.value);\n        value = source[nonNullIdx];\n    } else if (value === null) {\n        const cursorSnapToValues = cursor.snapToValues ?? 'closest';\n        const snapTo = serie.snapToValues ?? cursorSnapToValues;\n        const nonNullIdx = findDataIdx(source, serie, idx, snapTo, null);\n        value = source[nonNullIdx];\n    }\n\n    return value;\n};\n\nconst DEFAULT_TOOLTIP_OPTIONS = {\n    maxLines: TOOLTIP_DEFAULT_MAX_LINES,\n    highlight: true,\n    sum: false,\n    render: renderTooltip,\n    pinable: true,\n    strategy: 'pin',\n    sort: undefined,\n    showIndicies: false,\n    hideNoData: false,\n    className: 'yagr-tooltip_default',\n    xOffset: TOOLTIP_X_OFFSET,\n    yOffset: TOOLTIP_Y_OFFSET,\n    virtual: false,\n    showEmpty: false,\n    onUpdate: 'reset',\n} as const;\n\nexport type TooltipPlugin = YagrPlugin<\n    {\n        state: TooltipState;\n        pin(pinState: boolean, position?: {x: number; y: number}): void;\n        show(): void;\n        hide(): void;\n        updateOptions: (o: Partial<TooltipOptions>) => void;\n        on: (event: TooltipAction, handler: TooltipHandler) => void;\n        off: (event: TooltipAction, handler: TooltipHandler) => void;\n        display: (props: {left: number; top: number; idx: number}) => void;\n        tooltip: YagrTooltip;\n        dispose: () => void;\n        reInit: (u: uPlot) => void;\n        reset: () => void;\n    },\n    [Partial<TooltipOptions>]\n>;\n\nclass YagrTooltip {\n    handlers: Record<TooltipAction, TooltipHandler[]> = {\n        init: [],\n        mount: [],\n        show: [],\n        pin: [],\n        unpin: [],\n        hide: [],\n        render: [],\n        destroy: [],\n        reset: [],\n    };\n\n    private placement: Function = placementFn;\n    private renderTooltipCloses = () => {};\n\n    private tOverlay: HTMLDivElement;\n    private bound: HTMLElement;\n    private renderNode: HTMLElement;\n    /**\n     * Flag to skip next mouseup event, used for unpinning\n     * tooltip on any mousedown, but continiously pinning on drag\n     */\n    private skipNextMouseUp = false;\n\n    yagr: Yagr;\n    opts: TooltipOptions;\n    state: TooltipState;\n    over: HTMLDivElement;\n\n    private bLeft: number;\n    private bTop: number;\n    private bWidth: number;\n\n    constructor(yagr: Yagr, options: Partial<TooltipOptions> = {}) {\n        this.yagr = yagr;\n        this.over = yagr?.uplot?.over;\n        this.opts = {\n            ...DEFAULT_TOOLTIP_OPTIONS,\n            strategy: options.pinable ? 'pin' : DEFAULT_TOOLTIP_OPTIONS.strategy,\n            tracking: yagr.config.chart.series?.type === 'area' ? 'area' : 'sticky',\n            value: this.defaultTooltipValueFormatter,\n            ...options,\n        };\n\n        this.bound = this.opts.boundClassName\n            ? document.querySelector(this.opts.boundClassName) || document.body\n            : document.body;\n        this.renderNode = this.opts.renderClassName\n            ? document.querySelector(this.opts.renderClassName) || document.body\n            : document.body;\n        this.tOverlay = document.createElement('div');\n\n        this.tOverlay.id = `${yagr.id}_tooltip`;\n        this.tOverlay.className = `yagr-tooltip ${this.opts.className || ''}`;\n        this.tOverlay.style.display = 'none';\n\n        this.state = {\n            mounted: false,\n            pinned: false,\n            visible: false,\n            range: null,\n            focusedSeries: null,\n        };\n\n        this.bLeft = 0;\n        this.bTop = 0;\n        this.bWidth = 0;\n\n        if (this.opts.virtual) {\n            this.placement = () => {};\n        }\n    }\n\n    emit = (action: TooltipAction, data?: TooltipData) => {\n        this.handlers[action].forEach((handler) => {\n            handler(this.tOverlay, {\n                state: this.state,\n                actions: {\n                    pin: this.pin,\n                    show: this.show,\n                    hide: this.hide,\n                    dispose: this.dispose,\n                    reset: this.reset,\n                },\n                data,\n                yagr: this.yagr,\n                event: action,\n            });\n        });\n    };\n\n    reset = () => {\n        if (this.opts.onUpdate === 'none') {\n            this.yagr.plugins.cursor?.pin(false);\n            return;\n        }\n\n        if (this.state.visible) {\n            this.hide();\n        }\n\n        if (this.state.pinned) {\n            this.pin(false);\n        }\n        this.emit('reset');\n    };\n\n    show = () => {\n        const shouldEmit = !this.state.visible;\n        this.state.visible = true;\n        this.tOverlay.style.display = 'block';\n        shouldEmit && this.emit('show');\n    };\n\n    hide = () => {\n        const shouldEmit = this.state.visible;\n        this.state.visible = false;\n        this.tOverlay.style.display = 'none';\n        this.emit('hide');\n        shouldEmit && this.emit('show');\n    };\n\n    pin = (pinState: boolean, position?: {x: number; y: number}) => {\n        this.state.pinned = pinState;\n        const range = this.state.range || [];\n\n        this.yagr.plugins.cursor?.pin(pinState && (range[1] === null || range.length < 2));\n\n        if (this.opts.virtual) {\n            return this.emit(pinState ? 'pin' : 'unpin');\n        }\n\n        if (position) {\n            this.placement(\n                this.tOverlay,\n                {\n                    left: position.x + this.bLeft,\n                    top: this.bTop + position.y - (this.opts.yOffset || 0),\n                },\n                'right',\n                {\n                    bound: this.bound,\n                    xOffset: this.opts.xOffset,\n                    yOffset: this.opts.yOffset,\n                },\n            );\n        }\n\n        const list = this.tOverlay.querySelector('._tooltip-list') as HTMLElement;\n\n        if (pinState) {\n            if (!this.state.visible) {\n                this.show();\n            }\n\n            this.tOverlay.classList.add('yagr-tooltip_pinned');\n            if (list && list?.clientHeight) {\n                list.style.height = px(list.clientHeight);\n            }\n\n            if (this.opts.render === renderTooltip) {\n                document.addEventListener('mousemove', this.checkFocus);\n                document.addEventListener('mousedown', this.detectClickOutside);\n            }\n        } else {\n            this.tOverlay.classList.remove('yagr-tooltip_pinned');\n\n            if (this.opts.render === renderTooltip) {\n                document.removeEventListener('mousemove', this.checkFocus);\n                document.removeEventListener('mousedown', this.detectClickOutside);\n            }\n        }\n\n        this.emit(pinState ? 'pin' : 'unpin');\n    };\n\n    checkFocus = (event: MouseEvent) => {\n        const target = event.target as HTMLElement | null;\n        let serieIdx: string | undefined;\n\n        if (\n            target &&\n            this.tOverlay.contains(target) &&\n            target.classList.contains('yagr-tooltip__item')\n        ) {\n            serieIdx = target.dataset['series'];\n        }\n\n        const serie = serieIdx ? this.yagr.uplot.series[Number(serieIdx)] : null;\n\n        if (serieIdx && serie) {\n            this.state.focusedSeries = serieIdx;\n            this.yagr.setFocus(serie.id, true);\n        } else if (this.state.focusedSeries) {\n            this.state.focusedSeries = null;\n            this.yagr.setFocus(null, true);\n        }\n    };\n\n    render = (props: {left: number; top: number; idx: number}) => {\n        const u = this.yagr.uplot;\n        let {left, top} = props;\n        const {idx} = props;\n        const {opts, state} = this;\n\n        if (opts.show && typeof opts.show === 'function' && opts.show(this.yagr) === false) {\n            this.hide();\n            return;\n        }\n\n        if ((left < 0 || top < 0) && !state.pinned && this.isNotInDrag) {\n            this.hide();\n        }\n\n        top = inBetween(top, 0, (u.bbox.top + u.bbox.height) / window.devicePixelRatio);\n        left = inBetween(left, 0, (u.bbox.left + u.bbox.width) / window.devicePixelRatio);\n\n        const {data} = u;\n\n        if (data === null || isNil(idx) || top === undefined) {\n            return;\n        }\n\n        const x = data[0][idx];\n\n        const sum: Record<string, number> = {};\n        const sections: Record<string, TooltipSection> = {};\n\n        const rowsBySections: Record<string, number[]> = {};\n\n        let i = u.series.length - 1;\n        while (i >= 1) {\n            const serie = u.series[i];\n\n            // Skip only if really hidden (not temporarily hidden for showInGraph)\n            if (!serie.show && !serie._tempHidden) {\n                i -= 1;\n                continue;\n            }\n\n            const scale = serie.scale || DEFAULT_Y_SCALE;\n\n            rowsBySections[scale] = rowsBySections[scale] || [];\n            rowsBySections[scale].push(i);\n            i -= 1;\n        }\n\n        const rowEntries = Object.entries(rowsBySections);\n\n        rowEntries.forEach(([scale, serieIndicies]) => {\n            sections[scale] = sections[scale] || {\n                rows: [],\n            };\n            const section = sections[scale];\n            const cursorPosition = u.scales[scale].ori === 0 ? left : top;\n            const cursorValue = Number(u.posToVal(cursorPosition, scale).toFixed(2));\n\n            const valueRender = getOptionValue<ValueFormatter>(opts.value, scale);\n\n            for (const seriesIdx of serieIndicies) {\n                const seriesData = u.data[seriesIdx] as DataSeries;\n                const serie = u.series[seriesIdx];\n\n                let value = findValue(\n                    this.yagr.config.cursor,\n                    seriesData,\n                    serie,\n                    idx,\n                    this.interpolation,\n                );\n                let dValue = value;\n\n                if (typeof value === 'string') {\n                    dValue = value;\n                    value = null;\n                }\n\n                if (getOptionValue(opts.sum, scale)) {\n                    sum[scale] = sum[scale] || 0;\n                    sum[scale] += value || 0;\n                }\n\n                const realY = seriesData[idx];\n                const yValue = serie.$c && serie.$c[idx] === this.stripValue ? value : realY;\n\n                if ((value === null && opts.hideNoData) || serie.showInTooltip === false) {\n                    continue;\n                }\n\n                const seriesPrecision = serie.precision ?? getOptionValue(opts.precision, scale);\n\n                const displayValue = serie.formatter\n                    ? serie.formatter(dValue, serie)\n                    : valueRender(dValue, seriesPrecision);\n\n                const rowData: TooltipRow = {\n                    id: serie.id,\n                    name: serie.name,\n                    dataValue: serie.$c[idx],\n                    originalValue: value,\n                    value: displayValue,\n                    y: yValue,\n                    displayY: realY,\n                    color: this.yagr.getSerieLegendColor(serie),\n                    seriesIdx,\n                    rowIdx: section.rows.length\n                        ? section.rows[section.rows.length - 1].rowIdx + 1\n                        : 0,\n                };\n\n                if (serie.normalizedData) {\n                    rowData.transformed = serie.normalizedData[idx];\n                }\n\n                if (serie._transformed) {\n                    rowData.transformed = seriesData[idx];\n                }\n\n                if (opts.omitBy && opts.omitBy(rowData)) {\n                    continue;\n                }\n\n                section.rows.push(rowData);\n            }\n\n            if (getOptionValue(opts.highlight, scale) && section.rows.length) {\n                const tracking = getOptionValue<TrackingOptions>(opts.tracking, scale);\n                let activeIndex: number | null = 0;\n                if (tracking === 'area') {\n                    activeIndex = findInRange(\n                        section,\n                        cursorValue,\n                        getOptionValue<boolean | undefined>(opts.stickToRanges, scale),\n                    );\n                } else if (tracking === 'sticky') {\n                    activeIndex = findSticky(section, cursorValue);\n                } else if (typeof tracking === 'function') {\n                    activeIndex = tracking(section, cursorValue, {\n                        x: u.posToVal(left, 'x'),\n                        y: u.posToVal(top, scale),\n                        idx,\n                        scale,\n                        series: this.yagr.series,\n                        serieIndicies,\n                        interpolation: this.interpolation,\n                    });\n                }\n\n                if (activeIndex !== null) {\n                    section.rows[activeIndex].active = true;\n                }\n            }\n\n            const sort = getOptionValue(opts.sort, scale);\n            if (sort) {\n                section.rows.sort(sort);\n            }\n        });\n\n        const hasOneRow = Object.values(sections).some(({rows}) => rows.length > 0);\n\n        if (hasOneRow || opts.showEmpty) {\n            this.onMouseEnter();\n        } else {\n            this.hide();\n            return;\n        }\n\n        const bbox = this.over.getBoundingClientRect();\n\n        this.bLeft = bbox.left;\n        this.bTop = bbox.top;\n        this.bWidth = bbox.width;\n\n        const anchor = {\n            left: left + this.bLeft,\n            top: this.bTop + top - (opts.yOffset || 0),\n        };\n\n        this.renderTooltipCloses = () => {\n            const renderData = {\n                scales: Object.entries(sections).map(([scale, sec]) => {\n                    return {\n                        scale,\n                        rows: sec.rows,\n                        sum: sum[scale],\n                    };\n                }),\n                options: opts,\n                x,\n            };\n\n            const hasDataNow = Object.values(sections).some(\n                ({rows}) => rows.filter(({id}) => this.yagr.getSeriesById(id)?.show).length > 0,\n            );\n\n            if (!hasDataNow && !opts.showEmpty) {\n                this.hide();\n                return;\n            }\n\n            if (!opts.virtual) {\n                this.tOverlay.innerHTML = opts.render({\n                    ...renderData,\n                    state,\n                    yagr: this.yagr,\n                    defaultRender: DEFAULT_TOOLTIP_OPTIONS.render,\n                });\n\n                this.placement(this.tOverlay, anchor, 'right', {\n                    bound: this.bound,\n                    xOffset: opts.xOffset,\n                    yOffset: opts.yOffset,\n                });\n            }\n\n            this.emit('render', {...renderData, anchor});\n        };\n\n        if (state.pinned) {\n            return;\n        }\n\n        this.renderTooltipCloses();\n    };\n\n    initWithUplot = (u: uPlot) => {\n        this.over = u.root.querySelector('.u-over') as HTMLDivElement;\n\n        this.over.addEventListener('mousedown', this.onMouseDown);\n        this.over.addEventListener('mousemove', this.onMouseMove);\n        this.over.addEventListener('mouseenter', this.onMouseEnter);\n        this.over.addEventListener('mouseleave', this.onMouseLeave);\n\n        document.addEventListener('mouseup', this.onMouseUp);\n\n        this.mountTooltip();\n    };\n\n    setSize = () => {\n        const bbox = this.over.getBoundingClientRect();\n\n        this.bLeft = bbox.left;\n        this.bTop = bbox.top;\n    };\n\n    dispose = () => {\n        /** Free overlay listeners */\n        this.over.removeEventListener('mousedown', this.onMouseDown);\n        this.over.removeEventListener('mousemove', this.onMouseMove);\n        this.over.removeEventListener('mouseenter', this.onMouseEnter);\n        this.over.removeEventListener('mouseleave', this.onMouseLeave);\n\n        document.removeEventListener('mouseup', this.onMouseUp);\n        document.removeEventListener('mousemove', this.checkFocus);\n        document.removeEventListener('mousedown', this.detectClickOutside);\n\n        /** Removing tooltip on destroy */\n        this.tOverlay.remove();\n        this.state.mounted = false;\n        this.emit('destroy');\n    };\n\n    updateOptions = (newOptions: Partial<TooltipOptions>) => {\n        Object.assign(this.opts, newOptions);\n        this.tOverlay.className = `yagr-tooltip ${this.opts.className || ''}`;\n    };\n\n    on = (event: TooltipAction, handler: TooltipHandler) => {\n        this.handlers[event].push(handler);\n    };\n\n    off = (event: TooltipAction, handler: TooltipHandler) => {\n        this.handlers[event] = this.handlers[event].filter((h) => h !== handler);\n    };\n\n    private mountTooltip = () => {\n        if (!this.opts.virtual) {\n            this.renderNode = this.opts.renderClassName\n                ? document.querySelector(this.opts.renderClassName) || document.body\n                : document.body;\n            this.renderNode.appendChild(this.tOverlay);\n            this.state.mounted = true;\n            this.emit('mount');\n        }\n    };\n\n    private detectClickOutside = (event: MouseEvent) => {\n        const target = event.target;\n\n        if (target instanceof Element) {\n            const isClickInsideTooltip = target && this.tOverlay.contains(target);\n            const isClickOnUplotOver = target && this.over.contains(target);\n\n            if (!isClickInsideTooltip && !isClickOnUplotOver) {\n                this.pin(false);\n                this.hide();\n            }\n        }\n    };\n\n    private onMouseDown = (evt: MouseEvent) => {\n        this.state.range = [this.getCursorPosition(), null];\n\n        if (this.state.pinned) {\n            this.pin(false);\n            this.hide();\n            this.render({\n                left: evt.clientX - this.bLeft,\n                top: evt.clientY - this.bTop,\n                idx: this.yagr.uplot.posToIdx(evt.clientX - this.bLeft),\n            });\n            this.skipNextMouseUp = true;\n        }\n    };\n\n    private onMouseMove = () => {\n        if (this.state.range?.length) {\n            this.state.range[1] = this.getCursorPosition();\n        }\n    };\n\n    /**\n     * Calculates where exactly cursor leaved the chart\n     * and sets range[1] to this position\n     */\n    private setCursorLeaved = (e: MouseEvent) => {\n        const rect = this.over.getBoundingClientRect();\n        const x = e.clientX;\n        const range = this.state.range!;\n        const startPoint = range[0]!;\n        const xInOver = x - rect.left;\n        const end = xInOver > startPoint.clientX;\n        const timeline = this.yagr.config.timeline;\n\n        let result;\n        if (end) {\n            range[1] = {\n                clientX: this.bWidth,\n                value: this.yagr.uplot.posToVal(this.bWidth, 'x'),\n                idx: timeline.length - 1,\n            };\n            result = range[1];\n        } else {\n            /** Swap range[1] and range[0] in case if tooltip leaved chart in begining of element */\n            range[1] = range[0];\n            range[0] = {\n                clientX: 0,\n                value: this.yagr.uplot.posToVal(0, 'x'),\n                idx: 0,\n            };\n\n            result = range[0];\n        }\n\n        this.yagr.uplot.setCursor({\n            left: result.clientX,\n            top: e.clientY - rect.top,\n        });\n    };\n\n    private onMouseUp = (e: MouseEvent) => {\n        if (this.state.range === null) {\n            return;\n        }\n\n        const [from] = this.state.range || [];\n        let cursor: SelectionRange[number];\n\n        if (e.target === this.over) {\n            cursor = this.getCursorPosition();\n        } else {\n            cursor = this.state.range[1];\n        }\n\n        if (this.opts.strategy === 'none') {\n            return;\n        }\n\n        const click = from && from.clientX === cursor?.clientX;\n        const drag = from && from.clientX !== cursor?.clientX;\n\n        const strategy = this.opts.strategy;\n\n        if (\n            (click && !this.skipNextMouseUp && strategy !== 'drag') ||\n            (drag && (strategy === 'all' || strategy === 'drag'))\n        ) {\n            this.pin(!this.state.pinned);\n            this.show();\n            this.renderTooltipCloses();\n        }\n\n        this.state.range = null;\n        this.skipNextMouseUp = false;\n    };\n\n    private onMouseEnter = () => {\n        this.show();\n    };\n\n    private onMouseLeave = (e: MouseEvent) => {\n        const isPinned = this.state.pinned;\n\n        if (this.state.range?.[0]) {\n            this.setCursorLeaved(e);\n        }\n\n        if (!isPinned && this.isNotInDrag) {\n            this.hide();\n        }\n    };\n\n    private defaultTooltipValueFormatter = (n: string | number | null, precision?: number) => {\n        const pSettings = this.yagr.config.processing || {};\n\n        if (typeof n === 'string') {\n            if (pSettings.nullValues && pSettings.nullValues.hasOwnProperty(n)) {\n                return pSettings.nullValues[n] as string;\n            }\n\n            return '-';\n        }\n\n        if (typeof n === 'number') {\n            return n.toFixed(\n                // eslint-disable-next-line no-nested-ternary\n                typeof precision === 'number'\n                    ? precision\n                    : typeof this.opts.precision === 'number'\n                      ? this.opts.precision\n                      : 2,\n            );\n        }\n\n        return '-';\n    };\n\n    private getCursorPosition = (): SelectionRange[number] => {\n        const x = this.yagr.uplot.cursor.left;\n\n        if (x === undefined) {\n            return null;\n        }\n\n        return {\n            clientX: x,\n            value: this.yagr.uplot.posToVal(x, 'x'),\n            idx: this.yagr.uplot.posToIdx(x),\n        };\n    };\n\n    get interpolation() {\n        return this.yagr.config.processing?.interpolation;\n    }\n    get stripValue() {\n        return this.interpolation ? this.interpolation.value : undefined;\n    }\n    get isNotInDrag() {\n        if (this.opts.strategy === 'none' || this.opts.strategy === 'pin') {\n            return true;\n        }\n\n        return !this.state.range?.[1];\n    }\n}\n\n/*\n * Tooltip plugin constructor .\n * Every charts has it's own tooltip plugin instance\n */\nfunction YagrTooltipPlugin(\n    yagr: Yagr,\n    options: Partial<TooltipOptions> = {},\n): ReturnType<TooltipPlugin> {\n    const tooltip = new YagrTooltip(yagr, options);\n\n    const getUplotPlugin = () => ({\n        hooks: {\n            destroy: () => {\n                tooltip.dispose();\n            },\n            init: (u: uPlot) => {\n                tooltip.initWithUplot(u);\n            },\n            setSize: () => {\n                tooltip.setSize();\n            },\n\n            setCursor: (u: uPlot) => {\n                tooltip.render(u.cursor as Parameters<typeof tooltip.render>[0]);\n            },\n        },\n    });\n\n    const uPlotPlugin = getUplotPlugin();\n\n    function reInit(u: uPlot) {\n        const uPlugin = getUplotPlugin();\n\n        tooltip.reset();\n\n        u.hooks.init!.push(uPlugin.hooks.init);\n        u.hooks.destroy!.push(uPlugin.hooks.destroy);\n        u.hooks.setSize!.push(uPlugin.hooks.setSize);\n        u.hooks.setCursor!.push(uPlugin.hooks.setCursor);\n    }\n\n    return {\n        state: tooltip.state,\n        pin: tooltip.pin,\n        show: tooltip.show,\n        hide: tooltip.hide,\n        uplot: uPlotPlugin,\n        display: tooltip.render,\n        updateOptions: tooltip.updateOptions,\n        on: tooltip.on,\n        off: tooltip.off,\n        tooltip,\n        dispose: tooltip.dispose,\n        reInit,\n        reset: tooltip.reset,\n    };\n}\n\nexport default YagrTooltipPlugin;\n", "import type Yagr from '../../index';\nimport UPlot, {Plugin, Series} from 'uplot';\n\nimport {DEFAULT_X_SCALE, DEFAULT_Y_SCALE, DEFAULT_POINT_SIZE} from '../../defaults';\nimport {DotsSeriesOptions, YagrConfig} from '../../types';\nimport {isNil} from '../..//utils/common';\n\nexport const renderCircle = (\n    u: UPlot,\n    x: number,\n    y: number,\n    r: number,\n    s: number,\n    color: string,\n    strokeColor: string,\n    yScale?: string,\n) => {\n    const {ctx} = u;\n    const cx = Math.round(u.valToPos(x, DEFAULT_X_SCALE, true));\n    const cy = Math.round(u.valToPos(y, yScale || DEFAULT_Y_SCALE, true));\n\n    ctx.beginPath();\n    ctx.arc(cx, cy, r * 2, 0, 2 * Math.PI);\n\n    ctx.fillStyle = color;\n\n    if (s) {\n        const lineWidth = ctx.lineWidth;\n        const strokeStyle = ctx.strokeStyle;\n        ctx.lineWidth = s;\n        ctx.strokeStyle = strokeColor;\n        ctx.stroke();\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = strokeStyle;\n    }\n\n    ctx.fill();\n    ctx.closePath();\n};\n\n// Same as uPlot with clipping line content\nconst drawWithinPlot = (u: UPlot, draw: () => void) => {\n    const {ctx, bbox} = u;\n\n    ctx.save();\n    ctx.beginPath();\n    ctx.rect(bbox.left, bbox.top, bbox.width, bbox.height);\n    // here we're clipping all dots outside the rect\n    ctx.clip();\n\n    try {\n        draw();\n    } finally {\n        ctx.restore();\n    }\n};\n\nexport function drawMarkersIfRequired(u: UPlot, i: number, i0: number, i1: number) {\n    const {color, scale, spanGaps, count, pointsSize} = u.series[i];\n\n    if (spanGaps && count > 1) {\n        return false;\n    }\n\n    let j = i0;\n    let prev: number | null | undefined;\n\n    drawWithinPlot(u, () => {\n        while (j <= i1) {\n            const val = u.data[i][j];\n\n            if (val === null) {\n                prev = val;\n                j++;\n                continue;\n            }\n\n            const nextIdx = j + 1;\n            const next = u.data[i][nextIdx];\n\n            if (isNil(prev) && isNil(next)) {\n                renderCircle(\n                    u,\n                    u.data[0][j] as number,\n                    val as number,\n                    pointsSize ?? DEFAULT_POINT_SIZE / 2,\n                    0,\n                    color,\n                    color,\n                    scale || DEFAULT_Y_SCALE,\n                );\n            }\n            prev = val;\n            j++;\n        }\n    });\n\n    return undefined;\n}\n\n/*\n * This plugin configures points markers\n */\nexport default function YagrMarkersPlugin(yagr: Yagr, config: YagrConfig): Plugin {\n    const {\n        size = DEFAULT_POINT_SIZE,\n        strokeWidth = 2,\n        strokeColor = '#ffffff',\n        show,\n    } = config.markers;\n\n    const chartSeriesOptions = config.chart?.series as DotsSeriesOptions;\n    const defaultDotsSize = chartSeriesOptions?.pointsSize || DEFAULT_POINT_SIZE;\n\n    function drawCircles(u: UPlot, i: number, i0: number, i1: number) {\n        const {scale, _focus, color, getFocusedColor, type} = u.series[i];\n\n        let j = i0;\n\n        // eslint-disable-next-line no-nested-ternary\n        const pointSize = type === 'dots' ? (show ? size : defaultDotsSize) : size;\n\n        drawWithinPlot(u, () => {\n            while (j <= i1) {\n                const val = u.data[i][j];\n                if (val !== null) {\n                    renderCircle(\n                        u,\n                        u.data[0][j] as number,\n                        val as number,\n                        pointSize,\n                        strokeWidth,\n                        (_focus || _focus === null ? color : getFocusedColor(yagr, i)) || color,\n                        strokeColor,\n                        scale || DEFAULT_Y_SCALE,\n                    );\n                }\n                j++;\n            }\n        });\n\n        return undefined;\n    }\n\n    const markSeries = (idx: number | null, s: Series) => {\n        if (idx === 0 || idx === null) {\n            return;\n        }\n\n        if (s.type === 'dots' || config.markers.show) {\n            s.points = s.points || {};\n            s.points.show = drawCircles;\n        }\n    };\n\n    return {\n        opts: (_, opts) => {\n            if (!(config.markers.show || opts.series.some((s) => s.type === 'dots'))) {\n                return;\n            }\n            opts.series.forEach((s, i) => markSeries(i, s));\n        },\n\n        hooks: {\n            addSeries: (uplot, seriesIdx) => {\n                const series = uplot.series[seriesIdx];\n                markSeries(seriesIdx, series);\n            },\n            setSeries: (_, idx, series) => {\n                markSeries(idx, series);\n            },\n        },\n    };\n}\n", "import UPlot from 'uplot';\nimport * as defaults from '../defaults';\n\n/*\n * Configures and return apropriate path renderer\n * by given serieIndex and two points\n */\nexport function pathsRenderer(u: UPlot, seriesIdx: number, idx0: number, idx1: number) {\n    const serie = u.series[seriesIdx];\n    const {type, interpolation} = serie;\n\n    let drawer;\n\n    switch (type) {\n        case 'column': {\n            drawer =\n                UPlot.paths.bars &&\n                UPlot.paths.bars({\n                    size: [defaults.BARS_DRAW_FACTOR, defaults.BARS_DRAW_MAX],\n                    ...(u.series[seriesIdx].renderOptions || {}),\n                });\n            break;\n        }\n        case 'dots': {\n            drawer = () => null;\n            break;\n        }\n        case 'line':\n        case 'area':\n        default: {\n            switch (interpolation) {\n                case 'smooth':\n                    drawer = UPlot.paths.spline && UPlot.paths.spline();\n                    break;\n                case 'left':\n                    drawer = UPlot.paths.stepped && UPlot.paths.stepped({align: 1});\n                    break;\n                case 'right': {\n                    drawer = UPlot.paths.stepped && UPlot.paths.stepped({align: -1});\n                    break;\n                }\n                case 'linear':\n                default:\n                    drawer = UPlot.paths.linear && UPlot.paths.linear();\n                    break;\n            }\n        }\n    }\n\n    return drawer ? drawer(u, seriesIdx, idx0, idx1) : null;\n}\n", "import {Series} from 'uplot';\n\nimport * as defaults from '../defaults';\nimport type Yagr from '..';\n\nimport {\n    AreaSeriesOptions,\n    ColumnSeriesOptions,\n    DotsSeriesOptions,\n    LineSeriesOptions,\n    RawSerieData,\n    SeriesOptions,\n} from '../types';\nimport {genId} from './common';\nimport {getFocusedColor, getSerieFocusColors} from './colors';\nimport {drawMarkersIfRequired} from '../plugins/markers';\nimport {pathsRenderer} from './paths';\n\nfunction getCommonProperty<T extends SeriesOptions, K extends keyof T>(\n    series: RawSerieData | Series,\n    yagr: Yagr,\n    key: K,\n    defaultValue?: T[K],\n): T[K] | undefined {\n    if (series[key as keyof typeof series] !== undefined) {\n        return series[key as keyof typeof series] as T[K];\n    }\n\n    const seriesOptions = yagr.config.chart.series;\n    if (seriesOptions && key in seriesOptions) {\n        return seriesOptions[key as keyof SeriesOptions] as T[K];\n    }\n\n    return defaultValue;\n}\n\n// eslint-disable-next-line complexity\nexport function configureSeries(yagr: Yagr, rawSeries: RawSerieData, idx: number): Series {\n    const type = getCommonProperty(rawSeries, yagr, 'type', 'line');\n\n    const serie: Series = {\n        ...rawSeries,\n        type,\n        show: rawSeries.show ?? true,\n        showInGraph: rawSeries.showInGraph ?? true,\n        name: rawSeries.name || `${yagr.utils.i18n('series')} ${idx + 1}`,\n        color: rawSeries.color\n            ? yagr.utils.colors.parse(rawSeries.color)\n            : yagr.utils.theme.DEFAULT_LINE_COLOR,\n        id: (rawSeries.id === undefined ? rawSeries.name : String(rawSeries.id)) || genId(),\n        $c: rawSeries.data,\n        scale: rawSeries.scale || defaults.DEFAULT_Y_SCALE,\n        count: 0,\n        sum: 0,\n        avg: 0,\n        getFocusedColor,\n    };\n\n    serie.points = serie.points || {};\n\n    const colorFn = getSerieFocusColors(yagr, 'color');\n\n    if (serie.type === 'area') {\n        serie.lineColor = yagr.utils.colors.parse(\n            getCommonProperty<AreaSeriesOptions, 'lineColor'>(\n                rawSeries,\n                yagr,\n                'lineColor',\n                defaults.SERIE_AREA_BORDER_COLOR,\n            ),\n        );\n        serie.lineWidth = getCommonProperty<AreaSeriesOptions, 'lineWidth'>(\n            rawSeries,\n            yagr,\n            'lineWidth',\n            defaults.SERIE_AREA_BORDER_WIDTH,\n        );\n\n        serie.fill = colorFn;\n        serie.stroke = getSerieFocusColors(yagr, 'lineColor');\n        serie.width = serie.lineWidth;\n        serie.points.show = drawMarkersIfRequired;\n        serie.interpolation = getCommonProperty<AreaSeriesOptions, 'interpolation'>(\n            rawSeries,\n            yagr,\n            'interpolation',\n            'linear',\n        );\n        serie.spanGaps = getCommonProperty<AreaSeriesOptions, 'spanGaps'>(\n            rawSeries,\n            yagr,\n            'spanGaps',\n            false,\n        );\n    }\n\n    if (serie.type === 'line') {\n        serie.width = getCommonProperty<LineSeriesOptions, 'width'>(\n            rawSeries,\n            yagr,\n            'width',\n            defaults.SERIE_LINE_WIDTH,\n        );\n        serie.width = serie.width || defaults.SERIE_LINE_WIDTH;\n        serie.stroke = colorFn;\n        serie.points.show = drawMarkersIfRequired;\n        serie.interpolation = getCommonProperty<LineSeriesOptions, 'interpolation'>(\n            rawSeries,\n            yagr,\n            'interpolation',\n            'linear',\n        );\n        serie.spanGaps = getCommonProperty<LineSeriesOptions, 'spanGaps'>(\n            rawSeries,\n            yagr,\n            'spanGaps',\n            false,\n        );\n    }\n\n    if (serie.type === 'column') {\n        serie.stroke = colorFn;\n        serie.fill = colorFn;\n        serie.points.show = false;\n        serie.width = serie.width ?? 0;\n        serie.renderOptions = getCommonProperty<ColumnSeriesOptions, 'renderOptions'>(\n            serie,\n            yagr,\n            'renderOptions',\n        );\n    }\n\n    if (serie.type === 'dots') {\n        serie.stroke = () => serie.color;\n        serie.fill = colorFn;\n        serie.width = 2;\n        serie.pointsSize = getCommonProperty<DotsSeriesOptions, 'pointsSize'>(\n            serie,\n            yagr,\n            'pointsSize',\n            defaults.DEFAULT_POINT_SIZE,\n        );\n    }\n\n    serie.paths = pathsRenderer;\n\n    return serie;\n}\n\nexport const overrideSeriesInUpdate = (dest: Series, source: Series) => {\n    dest.$c = source.$c ?? dest.$c;\n    dest.show = source.show ?? dest.show;\n    dest.showInGraph = source.showInGraph ?? dest.showInGraph;\n    dest.data = source.data ?? dest.data;\n    dest.width = source.width ?? dest.width;\n    dest.pointsSize = source.pointsSize ?? dest.pointsSize;\n    dest.color = source.color ?? dest.color;\n    dest.lineColor = source.lineColor ?? dest.lineColor;\n    dest.lineWidth = source.lineWidth ?? dest.lineWidth;\n    dest.stroke = source.stroke ?? dest.stroke;\n    dest.getFocusedColor = source.getFocusedColor ?? dest.getFocusedColor;\n    dest.formatter = source.formatter ?? dest.formatter;\n    dest.paths = source.paths ?? dest.paths;\n};\n", "import {Options, Padding} from 'uplot';\nimport * as defaults from '../defaults';\n\nexport function getPaddingByAxes(options: Options): Padding {\n    let hasLeftAxis = false;\n    let hasRightAxis = false;\n\n    if (options.axes) {\n        options.axes.forEach((axis) => {\n            if (axis.scale === defaults.DEFAULT_X_SCALE) {\n                return;\n            }\n\n            if (axis.side === undefined || axis.side === 3) {\n                hasLeftAxis = true;\n            }\n            if (axis.side === 1) {\n                hasRightAxis = true;\n            }\n        });\n    } else {\n        hasLeftAxis = true;\n    }\n\n    if (hasLeftAxis && !hasRightAxis) {\n        return defaults.PADDING_LEFT;\n    } else if (hasRightAxis && !hasLeftAxis) {\n        return defaults.PADDING_RIGHT;\n    } else {\n        return defaults.PADDING_BOTH;\n    }\n}\n", "import {DEFAULT_X_SCALE} from '../../../defaults';\nimport UPlot from 'uplot';\n\nexport function getPosition(val: number, scale: string, width: number, height: number): number {\n    if (val > 0 && scale === DEFAULT_X_SCALE) {\n        return width;\n    }\n    if (val > 0 && scale !== DEFAULT_X_SCALE) {\n        return 0;\n    }\n    if (val <= 0 && scale === DEFAULT_X_SCALE) {\n        return 0;\n    }\n\n    return height;\n}\n\nexport function calculateFromTo(\n    value: number[],\n    scale: string,\n    timeline: number[] | UPlot.TypedArray,\n    u: UPlot,\n): number[] {\n    return value\n        .map((val) => {\n            if (Math.abs(val) !== Infinity) {\n                if (scale === DEFAULT_X_SCALE) {\n                    return Math.min(Math.max(val, timeline[0]), timeline[timeline.length - 1]);\n                } else {\n                    const scaleCfg = u.scales[scale];\n                    return Math.min(Math.max(val, scaleCfg.min ?? val), scaleCfg.max ?? val);\n                }\n            }\n\n            const pos = getPosition(val, scale, u.width, u.height);\n\n            return u.posToVal(pos, scale);\n        })\n        .map((val) => u.valToPos(val, scale, true));\n}\n", "import type Yagr from '../../';\nimport UPlot, {Plugin} from 'uplot';\nimport {DEFAULT_X_SCALE, DEFAULT_CANVAS_PIXEL_RATIO} from '../../defaults';\nimport {PBandConfig, PLineConfig, PlotLineConfig, YagrPlugin} from '../../types';\nimport {DrawOrderKey} from '../../utils/types';\nimport {deepIsEqual, genId} from '../../utils/common';\nimport {calculateFromTo} from './utils';\n\nconst MAX_X_SCALE_LINE_OFFSET = 0;\nconst DRAW_MAP = {\n    [DrawOrderKey.Series]: 0,\n    [DrawOrderKey.Axes]: 1,\n    plotLines: 2,\n};\n\nconst HOOKS_MAP: Record<string, 'draw' | 'drawClear' | 'drawAxes' | 'drawSeries'> = {\n    '012': 'draw',\n    '102': 'draw',\n    '201': 'drawClear',\n    '210': 'drawClear',\n    '120': 'drawAxes',\n    '021': 'drawSeries',\n};\n\nexport type PlotLinesPlugin = YagrPlugin<{\n    update: (additionalPlotLines?: PlotLineConfig[], scale?: string) => void;\n    add: (additionalPlotLines: PlotLineConfig[], scale?: string) => void;\n    clear: (scale?: string) => void;\n    get: () => PlotLineConfig[];\n    remove: (plotLinesToRemove: PlotLineConfig[], scale?: string) => void;\n}>;\n\nexport interface PlotLineOptions {\n    render: (uPlot: uPlot, p: PlotLineConfig) => void;\n}\n\n/*\n * Plugin renders custom lines and bands on chart based on axis config.\n * Axis should be bound to scale.\n */\nexport default function plotLinesPlugin(options: PlotLineOptions): PlotLinesPlugin {\n    let plotLines = new Map<string, PlotLineConfig>();\n\n    return function (yagr: Yagr) {\n        const drawOrder = yagr.config.chart.appearance?.drawOrder;\n\n        const drawIndicies = (drawOrder ? drawOrder.map((key) => DRAW_MAP[key]) : [0, 1, 2]).join(\n            '',\n        );\n\n        const hook = HOOKS_MAP[drawIndicies] || 'drawClear';\n\n        function getLineId(line: PlotLineConfig): string {\n            if (line.id) {\n                return line.id;\n            }\n            const lineWithoutId = Array.from(plotLines.entries()).find(([_, l]) =>\n                deepIsEqual(l, line),\n            )?.[0];\n            return lineWithoutId || genId();\n        }\n\n        function renderPlotLines(u: UPlot) {\n            const {ctx} = u;\n            const {height, top, width, left} = u.bbox;\n            const timeline = u.data[0];\n\n            for (const plotLineConfig of plotLines.values()) {\n                if (!plotLineConfig.scale) {\n                    continue;\n                }\n\n                if (options.render) {\n                    options.render(u, plotLineConfig);\n                    continue;\n                }\n\n                ctx.save();\n                ctx.fillStyle = yagr.utils.colors.parse(plotLineConfig.color);\n\n                const {scale, value} = plotLineConfig;\n\n                const isBand = Array.isArray(value);\n                const [from, to] = isBand\n                    ? calculateFromTo(value, scale, timeline, u)\n                    : [u.valToPos(value, scale, true), 0];\n\n                if (isBand) {\n                    const accent = (plotLineConfig as PBandConfig).accent;\n                    if (scale === DEFAULT_X_SCALE) {\n                        ctx.fillRect(from, top, to - from, height);\n                        if (accent) {\n                            ctx.fillStyle = accent.color;\n                            ctx.fillRect(from, top - accent.space, to - from, accent.space);\n                        }\n                    } else {\n                        ctx.fillRect(left, from, width, to - from);\n                        if (accent) {\n                            ctx.fillStyle = accent.color;\n                            ctx.fillRect(width + left, from, accent.space, to - from);\n                        }\n                    }\n                } else {\n                    const pConf = plotLineConfig as PLineConfig;\n\n                    ctx.beginPath();\n\n                    if (scale === DEFAULT_X_SCALE) {\n                        /** Workaround to ensure that plot line will not be drawn over axes */\n                        const last = u.data[0][u.data[0].length - 1] as number;\n                        const lastValue = u.valToPos(last, scale, true);\n                        if (from - lastValue > MAX_X_SCALE_LINE_OFFSET) {\n                            continue;\n                        }\n\n                        ctx.moveTo(from, top);\n                        ctx.lineTo(from, height + top);\n                    } else {\n                        ctx.moveTo(left, from);\n                        ctx.lineTo(width + left, from);\n                    }\n\n                    ctx.lineWidth = pConf.width || DEFAULT_CANVAS_PIXEL_RATIO;\n                    ctx.strokeStyle = pConf.color || '#000';\n                    if (pConf.dash) {\n                        ctx.setLineDash(pConf.dash);\n                    }\n\n                    if (pConf.lineCap) {\n                        ctx.lineCap = pConf.lineCap;\n                    }\n                    ctx.stroke();\n                }\n\n                ctx.restore();\n            }\n        }\n\n        const handler =\n            hook === 'drawSeries'\n                ? (u: UPlot, sIdx: number) => {\n                      if (sIdx === u.series.length - 1) {\n                          renderPlotLines(u);\n                      }\n                  }\n                : renderPlotLines;\n\n        function addPlotLines(additionalPlotLines: PlotLineConfig[]) {\n            for (const line of additionalPlotLines) {\n                const lineId = getLineId(line);\n                plotLines.set(lineId, line);\n            }\n        }\n\n        function removePlotLines(plotLinesToRemove: PlotLineConfig[]) {\n            for (const lineToRemove of plotLinesToRemove) {\n                const lineId = getLineId(lineToRemove);\n                plotLines.delete(lineId);\n            }\n        }\n        function getPlotLines(): PlotLineConfig[] {\n            return Array.from(plotLines.values());\n        }\n\n        function updatePlotLines(newPlotLines?: PlotLineConfig[], scale?: string) {\n            if (!newPlotLines || newPlotLines.length === 0) {\n                clearPlotLines(scale);\n                return;\n            }\n\n            const existingKeys = new Set<string>();\n\n            for (const newLine of newPlotLines) {\n                const lineId = getLineId(newLine);\n                plotLines.set(lineId, newLine);\n                existingKeys.add(lineId);\n            }\n\n            // Delete not actual lines from map\n            for (const [key, line] of plotLines.entries()) {\n                if ((!scale || line.scale === scale) && !existingKeys.has(key)) {\n                    plotLines.delete(key);\n                }\n            }\n        }\n\n        function clearPlotLines(scale?: string) {\n            if (scale) {\n                plotLines.forEach((line, key) => {\n                    if (line.scale === scale) {\n                        plotLines.delete(key);\n                    }\n                });\n            } else {\n                plotLines.clear();\n            }\n        }\n\n        const plugin = {\n            get: getPlotLines,\n            clear: clearPlotLines,\n            remove: removePlotLines,\n            add: addPlotLines,\n            update: updatePlotLines,\n            uplot: {\n                opts: () => {\n                    const config = yagr.config;\n                    plotLines = new Map();\n\n                    for (const scale in config.axes) {\n                        if (config.axes.hasOwnProperty(scale)) {\n                            const axisConfig = config.axes[scale];\n                            if (axisConfig.plotLines) {\n                                for (const plotLine of axisConfig.plotLines) {\n                                    plotLines.set(plotLine.id || genId(), {\n                                        ...plotLine,\n                                        scale,\n                                    });\n                                }\n                            }\n                        }\n                    }\n                },\n                hooks: {\n                    // @TODO Add feature to draw plot lines over series\n                    [hook]: handler,\n                },\n            } as Plugin,\n        };\n\n        return plugin;\n    };\n}\n", "/* eslint-disable complexity */\n\nimport uPlot, {Series, Plugin, Options as UPlotOptions, DrawOrderKey as uDrawOrderKey} from 'uplot';\n\nimport type {MinimalValidConfig} from '../types';\nimport Yagr, {YagrMeta} from '..';\n\nimport tooltipPlugin from '../plugins/tooltip/tooltip';\nimport CursorPlugin from '../plugins/cursor/cursor';\nimport {\n    DEFAULT_CANVAS_PIXEL_RATIO,\n    DEFAULT_FOCUS_ALPHA,\n    DEFAULT_X_SCALE,\n    DEFAULT_X_SERIE_NAME,\n    MIN_SELECTION_WIDTH,\n    TIME_MULTIPLIER,\n} from '../defaults';\nimport {configureSeries} from '../utils/series';\nimport markersPlugin from '../plugins/markers';\nimport {configureScales} from '../utils/scales';\nimport {configureAxes} from '../utils/axes';\nimport {getPaddingByAxes} from '../utils/chart';\nimport {DrawOrderKey} from '../utils/types';\nimport plotLinesPlugin from '../plugins/plotLines/plotLines';\n\nfunction setIfNotSet(hooks: uPlot.Hooks.Arrays[keyof uPlot.Hooks.Arrays], fn: (u: uPlot) => void) {\n    for (const hook of hooks || []) {\n        if (hook === fn) {\n            return;\n        }\n    }\n    hooks?.push(fn);\n}\n\nexport class CreateUplotOptionsMixin<T extends MinimalValidConfig> {\n    initMixin(this: Yagr) {\n        this._uHooks.onDraw = () => {\n            if (this.state.stage === 'listen') {\n                return;\n            }\n            this.state.stage = 'listen';\n            this.execHooks('stage', {chart: this, stage: this.state.stage});\n            const renderTime = performance.now() - this._startTime;\n            this._meta.renderTime = renderTime;\n            this.execHooks('load', {\n                chart: this,\n                meta: this._meta as YagrMeta,\n            });\n        };\n\n        this._uHooks.ready = () => {\n            const initTime = performance.now() - this._startTime;\n            this._meta.initTime = initTime;\n            this.execHooks('inited', {\n                chart: this,\n                meta: {\n                    initTime,\n                },\n            });\n        };\n        this._uHooks.drawClear = (u: uPlot) => {\n            const {ctx} = u;\n            ctx.save();\n            ctx.fillStyle = this.utils.theme.BACKGROUND;\n            ctx.fillRect(\n                DEFAULT_CANVAS_PIXEL_RATIO,\n                DEFAULT_CANVAS_PIXEL_RATIO,\n                u.width * DEFAULT_CANVAS_PIXEL_RATIO - 2 * DEFAULT_CANVAS_PIXEL_RATIO,\n                u.height * DEFAULT_CANVAS_PIXEL_RATIO - 2 * DEFAULT_CANVAS_PIXEL_RATIO,\n            );\n            ctx.restore();\n        };\n        this._uHooks.setSelect = (u: uPlot) => {\n            const {left, width} = u.select;\n            const [_from, _to] = [\n                u.posToVal(left, DEFAULT_X_SCALE),\n                u.posToVal(left + width, DEFAULT_X_SCALE),\n            ];\n            const {timeMultiplier = TIME_MULTIPLIER} = this.config.chart || {};\n\n            this.execHooks('onSelect', {\n                from: Math.ceil(_from / timeMultiplier),\n                to: Math.ceil(_to / timeMultiplier),\n                chart: this,\n            });\n            u.setSelect({width: 0, height: 0, top: 0, left: 0}, false);\n        };\n        this._uHooks.setScale = (_u: uPlot) => {\n            const scales = this.getScales();\n            this.execHooks('scaleUpdate', {\n                scales,\n                chart: this,\n            });\n        };\n    }\n\n    /**\n     * @internal\n     * @param reOpt If in reOpt cycle (e.g. batch update), then won't reinit hooks.\n     * @description Creates uPlot options from Yagr config, sets up plugins. Non idempotent.\n     * @returns uPlot options\n     */\n    protected createUplotOptions(this: Yagr<T>, reOpt = false) {\n        const {config} = this;\n        const plugins: Plugin[] = [];\n\n        let tooltipInstance = this.plugins?.tooltip;\n\n        /** Setting up TooltipPugin */\n        if (config.tooltip && config.tooltip.show !== false) {\n            if (tooltipInstance) {\n                tooltipInstance.updateOptions(config.tooltip);\n            } else {\n                tooltipInstance = tooltipPlugin(this, config.tooltip);\n            }\n            plugins.push(tooltipInstance.uplot);\n            this.plugins.tooltip = tooltipInstance;\n        }\n\n        if (reOpt) {\n            this.plugins.plotLines && plugins.push(this.plugins.plotLines.uplot);\n        } else {\n            const plotLinesPluginInstance = plotLinesPlugin(this.config.plotLines || {})(this);\n            this.plugins.plotLines = plotLinesPluginInstance;\n            plugins.push(plotLinesPluginInstance.uplot);\n        }\n\n        Object.entries(config.plugins).forEach(([name, plugin]) => {\n            const pluginInstance = plugin(this);\n            plugins.push(pluginInstance.uplot);\n            Object.assign(this.plugins, {[name]: pluginInstance});\n        });\n\n        const chart = config.chart;\n\n        const options: UPlotOptions = {\n            width: this.root.clientWidth,\n            height: this.clientHeight,\n            title: config.title?.text,\n            plugins: plugins,\n            focus: {alpha: DEFAULT_FOCUS_ALPHA},\n            series: [\n                {\n                    id: DEFAULT_X_SERIE_NAME,\n                    $c: config.timeline,\n                    scale: DEFAULT_X_SCALE,\n                    count: config.timeline.length,\n                } as Series,\n            ],\n            ms: chart.timeMultiplier || TIME_MULTIPLIER,\n            hooks: config.hooks || {},\n        };\n\n        this.state.isEmptyDataSet =\n            config.timeline.length === 0 ||\n            config.series.length === 0 ||\n            config.series.every(({data}) => data.length === 0);\n\n        /**\n         * Setting up cursor - points on cursor, drag behavior, crosshairs\n         */\n        options.cursor = options.cursor || {};\n        options.cursor.points = options.cursor.points || {};\n        options.cursor.drag = options.cursor.drag || {\n            dist: chart.select?.minWidth || MIN_SELECTION_WIDTH,\n            x: options.cursor.y ?? true,\n            y: options.cursor.y ?? false,\n            setScale: chart.select?.zoom ?? true,\n        };\n\n        if (this.utils.sync) {\n            options.cursor.sync = options.cursor.sync || {\n                key: this.utils.sync.key,\n            };\n        }\n\n        if (config.cursor) {\n            const cPlugin = CursorPlugin(this, config.cursor);\n            this.plugins.cursor = cPlugin;\n            plugins.push(cPlugin.uplot);\n        }\n\n        const seriesOptions = config.series || [];\n        const resultingSeriesOptions: Series[] = options.series;\n\n        /**\n         * Prepare series options\n         */\n        for (let i = seriesOptions.length - 1; i >= 0; i--) {\n            const serie = configureSeries(this, seriesOptions[i] || {}, i);\n\n            /**\n             * Series with showInGraph: false must not contribute to scale\n             * auto-range calculation. uPlot computes dataMin/dataMax from\n             * series that have show !== false before any draw hook fires,\n             * so the only way to exclude these series from the scale is to\n             * give uPlot show: false from the very beginning. We preserve\n             * the user-facing visibility through _tempHidden, which the\n             * tooltip and other internals already respect.\n             */\n            if (serie.showInGraph === false && serie.show !== false) {\n                serie._tempHidden = true;\n                serie.show = false;\n            }\n\n            const uIdx = resultingSeriesOptions.push(serie);\n            this.state.y2uIdx[serie.id || i] = uIdx - 1;\n        }\n\n        /** Setting up markers plugin after default points renderers to be settled */\n        const markersPluginInstance = markersPlugin(this, config);\n        plugins.push(markersPluginInstance);\n\n        options.series = resultingSeriesOptions;\n\n        if (!config.scales || Object.keys(config.scales).length === 0) {\n            config.scales = {\n                x: {},\n                y: {},\n            };\n        }\n\n        /** Setting up scales */\n        options.scales = options.scales || {};\n        options.scales = configureScales(this, options.scales, config);\n\n        /** Setting up minimal axes */\n        options.axes = options.axes || [];\n        const axes = options.axes;\n\n        axes.push(...configureAxes(this, config));\n\n        /** Setting up hooks */\n        options.hooks = config.hooks || {};\n        options.hooks.draw = options.hooks.draw || [];\n        options.hooks.ready = options.hooks.ready || [];\n        options.hooks.drawClear = options.hooks.drawClear || [];\n        options.hooks.setSelect = options.hooks.setSelect || [];\n        options.hooks.setScale = options.hooks.setScale || [];\n\n        setIfNotSet(options.hooks.draw, this._uHooks.onDraw);\n        setIfNotSet(options.hooks.ready, this._uHooks.ready);\n        setIfNotSet(options.hooks.drawClear, this._uHooks.drawClear);\n        setIfNotSet(options.hooks.setSelect, this._uHooks.setSelect);\n        setIfNotSet(options.hooks.setScale, this._uHooks.setScale);\n\n        options.drawOrder = chart.appearance?.drawOrder\n            ? (chart.appearance?.drawOrder.filter(\n                  (key) => key === DrawOrderKey.Series || key === DrawOrderKey.Axes,\n              ) as uDrawOrderKey[])\n            : [DrawOrderKey.Series, DrawOrderKey.Axes];\n\n        /** Disabling uPlot legend. */\n        options.legend = {show: false};\n        options.padding = config.chart.size?.padding || getPaddingByAxes(options);\n\n        /**\n         * Pre-initialization  of legend allows to calculate\n         * legend's height before actual uPlot instance\n         * will be rendered, to avoid blinking height changes\n         */\n        this.plugins.legend?.preInit(this, this.config.legend, options);\n        options.height = this.clientHeight;\n        options.bands = config.bands;\n\n        this.options = options;\n\n        return options;\n    }\n}\n", "/* eslint-disable complexity */\n\nimport type {AlignedData} from 'uplot';\nimport type {DataSeries, MinimalValidConfig} from '../types';\nimport type Yagr from '..';\n\nimport {DEFAULT_Y_SCALE} from '../defaults';\nimport {getSumByIdx, preprocess} from '../utils/common';\n\nexport class TransformSeriesMixin<T extends MinimalValidConfig> {\n    /**\n     * @internal\n     * @param this Yagr instance\n     * @description Transforms series data according to config\n     * @returns uPlot series data\n     */\n    protected transformSeries(this: Yagr<T>) {\n        const processingStartTime = performance.now();\n\n        const result = [];\n        const config = this.config;\n        const timeline = config.timeline;\n        let processing = config.processing || false;\n\n        let series: DataSeries[] = this.config.series.map(({data}) => data) as DataSeries[];\n\n        if (processing && processing.interpolation) {\n            series = preprocess(series, timeline, processing);\n            processing = false;\n        }\n\n        const shouldMapNullValues = Boolean(processing && processing.nullValues);\n        const nullValues = (processing && processing.nullValues) || {};\n\n        /**\n         * Stacks are represented as:\n         * {\n         *    [scale]: {\n         *        [],  // stacking group idx 0 (default for all on scale),\n         *        [],  // stacking group idx 1\n         *    ]\n         * }\n         *\n         * All stacked points are accumulating inside of series' scale group\n         */\n        const stacks: Record<string, number[][]> = {};\n\n        for (let sIdx = 0; sIdx < series.length; sIdx++) {\n            let dataLine: (number | null)[] = [];\n            const realSerieIdx = sIdx + 1;\n            const serie = series[sIdx];\n\n            const serieConfigIndex = this.options.series.length - realSerieIdx;\n            const serieOptions = this.options.series[serieConfigIndex];\n            const scale = serieOptions.scale || DEFAULT_Y_SCALE;\n            const scaleConfig = this.config.scales[scale] || {};\n            const isStacking = scaleConfig.stacking;\n            const sGroup = serieOptions.stackGroup || 0;\n\n            let empty = true;\n\n            if (isStacking && !stacks[scale]) {\n                this.options.focus = this.options.focus || {alpha: 1.1};\n                this.options.focus.alpha = 1.1;\n                stacks[scale] = [];\n            }\n\n            if (isStacking && !stacks[scale][sGroup]) {\n                stacks[scale][sGroup] = new Array(timeline.length).fill(0);\n            }\n\n            serieOptions.count = 0;\n\n            for (let idx = 0; idx < serie.length; idx++) {\n                let value = serie[idx];\n\n                if (shouldMapNullValues && nullValues[String(value)]) {\n                    value = null;\n                }\n\n                if (serieOptions.transform) {\n                    serieOptions._transformed = true;\n                    value = serieOptions.transform(value, series, idx);\n                }\n\n                if (scaleConfig.transform) {\n                    serieOptions._transformed = true;\n                    value = scaleConfig.transform(value, series, idx);\n                }\n\n                if (value === null) {\n                    if (serieOptions.type === 'line' || serieOptions.type === 'dots') {\n                        dataLine.push(null);\n                        continue;\n                    } else {\n                        value = isStacking ? 0 : null;\n                    }\n                }\n\n                empty = false;\n\n                if (scaleConfig.normalize) {\n                    const sum = getSumByIdx(this.options.series, idx, scale);\n                    value = sum && ((value ?? 0) / sum) * (scaleConfig.normalizeBase || 100);\n\n                    serieOptions.normalizedData = serieOptions.normalizedData || [];\n                    serieOptions.normalizedData[idx] = value;\n                }\n\n                if (scaleConfig.stacking) {\n                    if (serieOptions.show === false || serieOptions.showInGraph === false) {\n                        value = 0;\n                    }\n\n                    value = stacks[scale][sGroup][idx] += (value ?? 0);\n                }\n\n                if (scaleConfig.type === 'logarithmic' && value === 0) {\n                    value = 1;\n                }\n\n                serieOptions.sum = (serieOptions.sum || 0) + (value || 0);\n\n                const originalValue = serieOptions.$c[idx];\n                if (typeof originalValue === 'number') {\n                    serieOptions.count += 1;\n                }\n                dataLine.push(value);\n            }\n\n            serieOptions.avg = (serieOptions.sum || 0) / serieOptions.count;\n            serieOptions.empty = empty;\n\n            if (serieOptions.postProcess) {\n                dataLine = serieOptions.postProcess(dataLine, sIdx, this);\n            }\n            result.unshift(dataLine);\n        }\n\n        result.unshift(this.config.timeline);\n\n        this.series = result as AlignedData;\n\n        this.execHooks('processed', {\n            chart: this,\n            meta: {\n                processTime: performance.now() - processingStartTime,\n            },\n        });\n\n        return this.series;\n    }\n}\n", "/* eslint-disable complexity */\n\nimport type {\n    MinimalValidConfig,\n    RawSerieData,\n    Scale,\n    SupportedLocales,\n    YagrConfig,\n    YagrTheme,\n} from '../types';\nimport Yagr from '..';\n\nimport i18n from '../locale';\nimport {DEFAULT_X_SCALE, DEFAULT_Y_SCALE} from '../defaults';\nimport {overrideSeriesInUpdate, configureSeries} from '../utils/series';\nimport {getRedrawOptionsForAxesUpdate, updateAxis} from '../utils/axes';\nimport {Paths, deepIsEqual, get} from '../utils/common';\nimport {Batch} from './batch-updates';\n\ninterface UpdateOptions {\n    incremental?: boolean;\n    splice?: boolean;\n}\n\nfunction setLocaleImpl(\n    yagr: Yagr,\n    batch: Batch,\n    locale: SupportedLocales | Record<string, string>,\n) {\n    yagr.utils.i18n = i18n(locale);\n    batch.redrawLegend = true;\n}\n\nfunction setThemeImpl(yagr: Yagr, themeValue: YagrTheme, batch: Batch) {\n    yagr.utils.theme.setTheme(themeValue);\n    const availableThemes: YagrTheme[] = ['light', 'light-hc', 'dark', 'dark-hc'];\n    const classesToRemove = availableThemes.map((theme) => `yagr_theme_${theme}`);\n    yagr.root.classList.remove(...classesToRemove);\n    yagr.root.classList.add('yagr_theme_' + themeValue);\n    batch.redraw = [false, true];\n}\n\nfunction setAxesImpl(yagr: Yagr, batch: Batch, axes: YagrConfig['axes']) {\n    const {x, ...rest} = axes;\n\n    if (x) {\n        const xAxis = yagr.uplot.axes.find(({scale}) => scale === DEFAULT_X_SCALE);\n\n        if (xAxis) {\n            updateAxis(yagr, xAxis, {scale: DEFAULT_X_SCALE, ...x});\n        }\n    }\n\n    Object.entries(rest).forEach(([scaleName, scaleConfig]) => {\n        const axis = yagr.uplot.axes.find(({scale}) => scale === scaleName);\n\n        if (axis) {\n            updateAxis(yagr, axis, {scale: scaleName, ...scaleConfig});\n        }\n    });\n\n    batch.redraw = getRedrawOptionsForAxesUpdate(axes);\n}\n\nfunction setFocusImpl(yagr: Yagr, lineId: string | null, focus: boolean) {\n    const seriesIdx = lineId === null ? null : yagr.state.y2uIdx[lineId];\n    yagr.plugins.cursor?.focus(seriesIdx, focus);\n    yagr.uplot.setSeries(seriesIdx, {focus});\n}\n\nfunction setVisibleImpl(\n    yagr: Yagr,\n    lineId: string | null,\n    show: boolean,\n    updateLegend: boolean,\n    batch: Batch,\n) {\n    const seriesIdx = lineId === null ? null : yagr.state.y2uIdx[lineId];\n    const seriesCfg =\n        lineId === null ? yagr.config.series : [yagr.config.series.find(({id}) => id === lineId)];\n\n    seriesCfg.forEach((serie) => {\n        if (serie) {\n            serie.show = show;\n        }\n    });\n\n    batch.fns.push(() => {\n        yagr.uplot.setSeries(seriesIdx, {\n            show,\n        });\n    });\n\n    yagr.options.series = yagr.uplot.series;\n\n    let shouldRebuildStacks = false;\n\n    if (seriesIdx) {\n        const series = yagr.uplot.series[seriesIdx];\n        series.show = show;\n        const scaleName = series.scale || DEFAULT_Y_SCALE;\n        const scale = yagr.config.scales[scaleName];\n        shouldRebuildStacks = Boolean(scale && scale.stacking);\n    } else {\n        shouldRebuildStacks = yagr.options.series.reduce((acc, serie) => {\n            const {scale} = serie;\n            serie.show = show;\n            return Boolean((scale && yagr.config.scales[scale]?.stacking) || acc);\n        }, false as boolean);\n    }\n\n    if (shouldRebuildStacks) {\n        // batch.reopt = true;\n        batch.recalc = true;\n        batch.fns.push(() => {\n            yagr.uplot.setData(yagr.series, true);\n            updateLegend && yagr.plugins.legend?.update();\n        });\n    }\n}\n\nfunction setScalesImpl(yagr: Yagr, scales: YagrConfig['scales'], batch: Batch) {\n    let stackingIsChanged = false;\n    let normalizationIsChanged = false;\n\n    Object.entries(scales).forEach(([scaleName, scaleConfig]) => {\n        const scale = yagr.config.scales[scaleName];\n\n        if (scale) {\n            const {stacking} = scale;\n            const {stacking: newStacking} = scaleConfig;\n\n            if (stacking !== newStacking) {\n                stackingIsChanged = true;\n            }\n\n            if (\n                scaleConfig.normalize !== scale.normalize ||\n                scaleConfig.normalizeBase !== scale.normalizeBase\n            ) {\n                normalizationIsChanged = true;\n            }\n        }\n    });\n\n    const isChangingOnlyMinMax = Object.entries(scales).every(\n        ([key, scaleConfig]: [string, Scale]) => {\n            const cfg = yagr.config.scales[key];\n\n            const {min: pMin, max: pMax, ...pRest} = cfg;\n            const {min: nMin, max: nMax, ...nRest} = scaleConfig;\n            const isChangedSomething = deepIsEqual(nRest, pRest) === false;\n\n            return !isChangedSomething && (pMin !== nMin || pMax !== nMax);\n        },\n    );\n\n    const isChangingXAxis = Object.keys(scales).includes(DEFAULT_X_SCALE);\n\n    /**\n     * In case if we change only min/max on data-scales, then we can just use uplot.setScale,\n     * otherwise we need to rebuild all series and stacks in order to apply new scales;\n     */\n    if (isChangingOnlyMinMax && !isChangingXAxis) {\n        return Object.entries(scales).forEach(([scaleName, scaleConfig]) => {\n            batch.fns.push(() => {\n                yagr.uplot.setScale(scaleName, {\n                    min: scaleConfig.min!,\n                    max: scaleConfig.max!,\n                });\n            });\n        });\n    }\n\n    if (stackingIsChanged || normalizationIsChanged) {\n        batch.reinit = true;\n    }\n\n    yagr.config.scales = scales;\n    batch.reinit = true;\n}\n\nfunction isChanged(oldConfig: YagrConfig, newConfig: Partial<YagrConfig>) {\n    return function isChangedPath(\n        path: Paths<YagrConfig>,\n        predicate?: (oldValue: unknown, newValue: unknown) => boolean,\n    ) {\n        const oldValue = get(oldConfig, path);\n        const newValue = get(newConfig, path);\n\n        return predicate ? !predicate(oldValue, newValue) : oldValue !== newValue;\n    };\n}\n\nfunction areSeriesChanged(a: YagrConfig['series'], b?: YagrConfig['series']) {\n    if (a.length !== b?.length) {\n        return true;\n    }\n\n    const mapA = new Map<string, YagrConfig['series'][0]>();\n    const mapB = new Map<string, YagrConfig['series'][0]>();\n\n    a.forEach((serie) => {\n        mapA.set(serie.id!, serie);\n    });\n\n    b.forEach((serie) => {\n        mapB.set(serie.id!, serie);\n    });\n\n    if (b.some(({id}) => !mapA.has(id!)) || a.some(({id}) => !mapB.has(id!))) {\n        return true;\n    }\n\n    return false;\n}\n\nfunction setConfigImpl(\n    yagr: Yagr,\n    batch: Batch,\n    newConfig: Partial<YagrConfig>,\n    fullUpdate = false,\n) {\n    if (fullUpdate) {\n        yagr.config = {...yagr.config, ...newConfig};\n        batch.reinit = true;\n        return;\n    }\n\n    const isChangedKey = isChanged(yagr.config, newConfig);\n\n    if (newConfig.title && isChangedKey('title')) {\n        yagr.setTitle(newConfig.title);\n    }\n\n    if (newConfig.chart?.appearance?.theme && isChangedKey('chart.appearance.theme')) {\n        yagr.setTheme(newConfig.chart?.appearance?.theme);\n    }\n\n    if (newConfig.chart?.appearance?.locale && isChangedKey('chart.appearance.locale')) {\n        yagr.setLocale(newConfig.chart?.appearance?.locale);\n    }\n\n    if (newConfig.axes && isChangedKey('axes', deepIsEqual)) {\n        yagr.setAxes(newConfig.axes);\n    }\n\n    if (newConfig.scales && isChangedKey('scales', deepIsEqual)) {\n        yagr.setScales(newConfig.scales);\n    }\n\n    const isChangedSeries =\n        Boolean(newConfig.series) && areSeriesChanged(yagr.config.series, newConfig.series);\n\n    if (isChangedSeries) {\n        batch.redrawLegend = true;\n    }\n\n    if (newConfig.series || newConfig.timeline) {\n        yagr.setSeries(\n            newConfig.timeline ?? yagr.config.timeline,\n            newConfig.series ?? yagr.config.series,\n            {\n                incremental: false,\n            },\n        );\n    }\n\n    if (newConfig.tooltip && isChangedKey('tooltip')) {\n        yagr.plugins.tooltip?.updateOptions(newConfig.tooltip);\n    }\n\n    if (newConfig.legend && isChangedKey('legend')) {\n        batch.reinit = true;\n    }\n\n    yagr.plugins.tooltip?.reset();\n\n    batch.reopt = true;\n    yagr.config = {...yagr.config, ...newConfig};\n}\n\nfunction setSeriesImpl(\n    this: Yagr,\n    batch: Batch,\n    timelineOrSeriesOrId: Partial<RawSerieData>[] | number[] | number | string,\n    maybeSeries?: Partial<RawSerieData>[] | Partial<RawSerieData>,\n    options: UpdateOptions = {\n        incremental: true,\n        splice: false,\n    },\n) {\n    let timeline: number[] = [],\n        series: RawSerieData[] = [],\n        updateId: null | string | number = null,\n        useIncremental = false,\n        shouldRecalcData = false,\n        useFullyRedraw;\n\n    if (['number', 'string'].includes(typeof timelineOrSeriesOrId)) {\n        useIncremental = false;\n        useFullyRedraw = false;\n        series = [maybeSeries] as RawSerieData[];\n        updateId = timelineOrSeriesOrId as number | string;\n    } else if (typeof (timelineOrSeriesOrId as Array<number | RawSerieData>)[0] === 'number') {\n        timeline = timelineOrSeriesOrId as number[];\n        series = maybeSeries as RawSerieData[];\n        useIncremental = Boolean(options.incremental);\n        useFullyRedraw = !options.incremental;\n    } else {\n        series = timelineOrSeriesOrId as RawSerieData[];\n        useFullyRedraw = true;\n    }\n\n    if (this.isEmpty && series.some(({data}) => data?.length)) {\n        batch.reinit = true;\n        return;\n    }\n\n    if (useFullyRedraw === false) {\n        let shouldUpdateCursror = false;\n\n        useIncremental && this.config.timeline.push(...timeline);\n        series.forEach((serie) => {\n            let matched =\n                typeof updateId === 'number'\n                    ? this.config.series[0]\n                    : this.config.series.find(({id}) => id === serie.id || id === updateId);\n\n            let id: number | string | undefined = matched?.id;\n\n            if (typeof updateId === 'number' && this.state.y2uIdx[updateId]) {\n                matched = this.config.series[updateId];\n                id = updateId;\n            }\n\n            if (matched && id) {\n                const {data, ...rest} = serie;\n                const seriesIdx = this.state.y2uIdx[id];\n\n                /** @TODO fixme (see Annotations.1) */\n                if (\n                    matched.type === 'dots' ||\n                    serie.type === 'dots' ||\n                    this.config.chart.series?.type === 'dots'\n                ) {\n                    batch.reinit = true;\n                }\n\n                if (useIncremental) {\n                    matched.data = data ? matched.data.concat(data) : matched.data;\n                } else if (data?.length) {\n                    matched.data = data;\n                    /**\n                     * We're reprocessing data on every series' data change,\n                     * cause we don't know is it required to process current line or not\n                     * Possible non clear pattern:\n                     *  - series may contain string values to process out with `interpolate` option\n                     *  - series may be in stack group\n                     * @TODO fixme when you got a good idea\n                     */\n                    shouldRecalcData = true;\n                }\n\n                const newSeries = configureSeries(this, Object.assign(matched, rest), seriesIdx);\n                const opts = this.options.series[seriesIdx];\n                const uOpts = this.uplot.series[seriesIdx];\n\n                if (uOpts._focus === null ? true : uOpts._focus !== newSeries.focus) {\n                    batch.fns.push(() => {\n                        this.uplot.setSeries(seriesIdx, {focus: newSeries.focus});\n                    });\n                }\n\n                if (uOpts.color !== newSeries.color) {\n                    shouldUpdateCursror = true;\n                }\n\n                if (newSeries.scale && this.config.scales[newSeries.scale]?.stacking) {\n                    shouldRecalcData = true;\n                }\n\n                overrideSeriesInUpdate(opts, newSeries);\n                overrideSeriesInUpdate(uOpts, newSeries);\n\n                /**\n                 * Handle showInGraph transitions. uPlot uses `series.show` to\n                 * determine which series contribute to scale auto-range; there\n                 * is no pre-scale hook, so the only correct way to exclude a\n                 * series is to keep it `show: false` in uPlot while marking it\n                 * as `_tempHidden` so that Yagr-side consumers (tooltip etc.)\n                 * still treat it as visible.\n                 *\n                 * Snapshot the previous uPlot `show` value BEFORE\n                 * `overrideSeriesInUpdate` mutates it below, then derive the\n                 * target uPlot `show` value and the expected `_tempHidden`\n                 * state. After the override we restore the correct uPlot-side\n                 * `show` and only queue a `setSeries` call if uPlot actually\n                 * needs to react (otherwise we'd just thrash the batch).\n                 */\n                const prevUplotShow = uOpts.show;\n                const userShow = newSeries.show !== false;\n                const hideForGraph = newSeries.showInGraph === false && userShow;\n                const targetUplotShow = hideForGraph ? false : userShow;\n                const targetTempHidden = hideForGraph;\n\n                /**\n                 * `overrideSeriesInUpdate` just synchronously copied\n                 * `newSeries.show` (the user-facing value) into `uOpts.show`.\n                 * For showInGraph handling we instead want uPlot to see\n                 * `targetUplotShow`. Apply our chosen state on top of the\n                 * override, and queue an actual `setSeries` call only when\n                 * the value visible to uPlot really changed \u2014 this is what\n                 * forces uPlot to recompute the scale, and it avoids\n                 * re-entrant setSeries storms that could freeze the UI.\n                 */\n                uOpts.show = targetUplotShow;\n                uOpts._tempHidden = targetTempHidden;\n                opts._tempHidden = targetTempHidden;\n\n                if (prevUplotShow !== targetUplotShow) {\n                    batch.fns.push(() => {\n                        this.uplot.setSeries(seriesIdx, {show: targetUplotShow});\n                    });\n                }\n            } else {\n                batch.fns.push(() => {\n                    const newSeries = configureSeries(this, serie, this.config.series.length);\n                    this.state.y2uIdx[newSeries.id] = this.uplot.series.length;\n                    this.uplot.addSeries(newSeries, this.config.series.length);\n                });\n                this.config.series.push(serie);\n            }\n        });\n\n        if (shouldUpdateCursror) {\n            batch.fns.push(() => {\n                this.plugins.cursor?.updatePoints();\n            });\n        }\n\n        if (options.splice) {\n            const sliceLength = series[0].data.length;\n            this.config.series.forEach((s) => {\n                s.data.splice(0, sliceLength);\n            });\n            this.config.timeline.splice(0, timeline.length);\n        }\n    } else {\n        this.config.timeline = timeline;\n        this.config.series = series;\n        batch.reinit = true;\n    }\n\n    if (!batch.reinit) {\n        this._batch.fns.push(() => this.plugins?.tooltip?.reset());\n\n        if (shouldRecalcData || timeline.length) {\n            batch.recalc = true;\n            batch.fns.push(() => {\n                this.uplot.setData(this.series);\n            });\n        }\n    }\n}\n\nexport class DynamicUpdatesMixin<T extends MinimalValidConfig> {\n    /**\n     * @public\n     * @param locale string | Record<string, string>\n     * @description Set's locale of chart and redraws all locale-dependent elements.\n     */\n    setLocale(this: Yagr<T>, locale: SupportedLocales | Record<string, string>) {\n        this.batch((batch) => setLocaleImpl(this, batch, locale));\n    }\n\n    /**\n     * @public\n     * @param title YagrTitleConfig\n     * @description Set's title of chart and redraws all title-dependent elements.\n     */\n    setTitle(this: Yagr<T>, title: YagrConfig['title']) {\n        this.batch((batch) => {\n            this.config.title = title;\n            this.initTitle();\n            batch.redraw = [true, true];\n        });\n    }\n\n    /**\n     * @public\n     * @param themeValue YagrTheme\n     * @description Set's theme of chart and redraws all theme-dependent elements.\n     */\n    setTheme(this: Yagr<T>, themeValue: YagrTheme) {\n        this.batch((batch) => setThemeImpl(this, themeValue, batch));\n    }\n\n    /**\n     * @public\n     * @param axes axes config\n     * @description Sets new axes config and redraws all axes.\n     */\n    setAxes(this: Yagr<T>, axes: YagrConfig['axes']) {\n        this.batch((batch) => setAxesImpl(this, batch, axes));\n    }\n\n    /**\n     * @public\n     * @param seriesId string\n     * @param series Partial<RawSerieData>\n     * @description Sets new series by series id and redraws series.\n     */\n    setSeries(this: Yagr<T>, seriesId: string, series: Partial<RawSerieData>): void;\n    /**\n     * @public\n     * @param seriesIdx number\n     * @param series Partial<RawSerieData>\n     * @description Sets new series by series index and redraws series.\n     */\n    setSeries(this: Yagr<T>, seriesIdx: number, series: Partial<RawSerieData>): void;\n    /**\n     * @public\n     * @param series Partial<RawSerieData>\n     * @description Sets new series dataset (matching to current timeline) and redraws.\n     */\n    setSeries(this: Yagr<T>, series: Partial<RawSerieData>[]): void;\n    /**\n     * @public\n     * @param timeline number[]\n     * @param series Partial<RawSerieData>\n     * @param options UpdateOptions\n     * @description Sets new series dataset with different timeline and redraws.\n     */\n    setSeries(\n        this: Yagr<T>,\n        timeline: number[],\n        series: Partial<RawSerieData>[],\n        options: UpdateOptions,\n    ): void;\n    setSeries(\n        this: Yagr<T>,\n        timelineOrSeriesOrId: Partial<RawSerieData>[] | number[] | number | string,\n        maybeSeries?: Partial<RawSerieData>[] | Partial<RawSerieData>,\n        options: UpdateOptions = {\n            incremental: true,\n            splice: false,\n        },\n    ) {\n        this.batch((batch) =>\n            setSeriesImpl.call(this, batch, timelineOrSeriesOrId, maybeSeries, options),\n        );\n    }\n\n    /**\n     * @public\n     * @param lineId string | null\n     * @param focus boolean\n     * @description Sets focus on line with given id. If id is null, removes focus from all lines.\n     * @returns void\n     */\n    setFocus(this: Yagr<T>, lineId: string | null, focus: boolean) {\n        this.batch(() => setFocusImpl(this, lineId, focus));\n    }\n\n    /**\n     * @public\n     * @param lineId string | null\n     * @param show boolean\n     * @description Sets visibility of line with given id. If id is null, sets visibility of all lines.\n     */\n    setVisible(this: Yagr<T>, lineId: string | null, show: boolean, updateLegend = true) {\n        this.batch((batch) => setVisibleImpl(this, lineId, show, updateLegend, batch));\n    }\n\n    /**\n     * @public\n     * @param scales Record<string, Partial<ScaleConfi>>\n     * @description Sets new scales config and redraws.\n     */\n    setScales(this: Yagr<T>, scales: Record<string, Partial<YagrConfig['scales'][string]>>) {\n        this.batch((batch) => setScalesImpl(this, scales, batch));\n    }\n\n    /**\n     * @public\n     * @experimental\n     * @param newConfig Partial<YagrConfig>\n     * @descriptino Sets new config and redraws.\n     */\n    setConfig(this: Yagr<T>, newConfig: Partial<YagrConfig>, fullUpdate = false) {\n        this.batch((batch) => setConfigImpl(this, batch, newConfig, fullUpdate));\n    }\n}\n\n/**\n * Annotations:\n * 1. If we're operating with dots type then uPlot will be reinitialized\n *    cause it's not possible to re-render dot's markers without reinit\n *\n */\n", "import Yagr from '..';\n\ntype YagrConstructor = new (...args: any[]) => Yagr;\nexport type YMixin<T extends unknown = unknown> = new () => T;\n\nexport function applyMixins(derivedCtor: YagrConstructor, constructors: YMixin[]) {\n    const inits: (() => void)[] = [];\n\n    constructors.forEach((baseCtor) => {\n        Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n            Object.defineProperty(\n                derivedCtor.prototype,\n                name,\n                Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null),\n            );\n        });\n\n        if (baseCtor.prototype.initMixin) {\n            inits.push(baseCtor.prototype.initMixin);\n        }\n    });\n\n    derivedCtor.prototype.initMixins = function () {\n        inits.forEach((init) => init.call(this));\n    };\n}\n", "import type {MinimalValidConfig} from '../types';\nimport type Yagr from '..';\nimport UPlot from 'uplot';\nimport LegendPlugin from '../plugins/legend/legend';\n\nexport interface Batch {\n    active: boolean;\n    fns: ((s: Batch) => void)[];\n    /** If true then uPlot options will be re-configured  */\n    reopt?: boolean;\n    /** If true then data will be recalculated (use for stacks/normalization/other calculations) */\n    recalc?: boolean;\n    /** False or redraw uPlot redraw arguments */\n    redraw?: false | [series: boolean, axes: boolean];\n    /** If batch will end with full re-instantiation of uPlot */\n    reinit?: boolean;\n    /** If true, legend will be fully redrawn instead of re-initialization  */\n    redrawLegend?: boolean;\n}\n\nexport class BatchMixin<T extends MinimalValidConfig> {\n    protected _batch!: Batch;\n\n    initMixin() {\n        this._batch = {\n            active: false,\n            fns: [],\n        };\n    }\n\n    /**\n     * @public\n     * @param fn batch funcion.\n     * @experimental\n     * @descriptoin Batch wrapper. Batch function accepts batch state, it can be modified to change batch execution behaviour.\n     * @example\n     * ```typescript\n     * yagr.batch((s) => {\n     *    s.reopt = true; // reinit uPlot options\n     *    s.recalc = true; // recalculate series\n     *    s.redraw = [true, true]; // redraw chart\n     *    s.reinit = true; // reinit uPlot chart\n     * });\n     * ```\n     */\n    batch(this: Yagr<T>, fn: (s: Batch) => void) {\n        if (this._batch.active) {\n            return fn(this._batch);\n        }\n\n        this._batch.active = true;\n        fn(this._batch);\n\n        if (this._batch.reinit) {\n            return this.fullUpdate();\n        }\n\n        if (this._batch.redrawLegend) {\n            this.plugins.legend?.redraw();\n        }\n\n        if (this._batch.reopt) {\n            this.createUplotOptions(true);\n        }\n\n        if (this._batch.recalc) {\n            this.inStage('processing', () => {\n                this.transformSeries();\n            }).inStage('listen');\n        }\n\n        this._batch.fns.length && this.uplot.batch(() => this._batch.fns.forEach((fn) => fn(this._batch)));\n\n        if (this._batch.redraw && this.uplot) {\n            this.redraw(...this._batch.redraw);\n        }\n\n        this._batch = {active: false, fns: []};\n    }\n\n    /**\n     *\n     * @internal\n     * @description Full update of chart. Used when config is changed totally.\n     */\n    protected fullUpdate(this: Yagr<T>) {\n        let left: number | undefined;\n        let top: number | undefined;\n\n        this.inStage('dispose', () => {\n            if (this.uplot) {\n                const cursor = this.uplot.cursor;\n                left = cursor.left;\n                top = cursor.top;\n                // uplot may be undefined if chart is not rendered yet, but got update\n                this.uplot.destroy();\n            }\n            this.plugins.legend?.destroy();\n        })\n            .inStage('config', () => {\n                this.plugins.legend = new LegendPlugin();\n                this._batch = {active: false, fns: []};\n                this.createUplotOptions(true);\n                this.options = this.config.editUplotOptions ? this.config.editUplotOptions(this.options) : this.options;\n            })\n            .inStage('processing', () => {\n                this.transformSeries();\n            })\n            .inStage('uplot', () => {\n                this.uplot = new UPlot(this.options, this.series, this.initRender);\n                if (left && top && left > 0 && top > 0) {\n                    this.uplot.setCursor({left, top});\n                }\n\n                // by default uPlot subsribes self to cursor, if we don't need it, we should unsubscribe manually\n                if (!this.state.subscribed) {\n                    this.unsubscribe();\n                }\n            })\n            .inStage('listen');\n    }\n}\n", "import UPlot, {Options as UPlotOptions, AlignedData, Series, SyncPubSub} from 'uplot';\n\nimport LegendPlugin from './plugins/legend/legend';\nimport {TooltipPlugin} from './plugins/tooltip/tooltip';\nimport cursorPlugin from './plugins/cursor/cursor';\nimport {PlotLinesPlugin} from './plugins/plotLines/plotLines';\n\nimport {YagrConfig, MinimalValidConfig, InternalYargHooks} from './types';\n\nimport {debounce, genId, px} from './utils/common';\nimport ColorParser from './utils/colors';\n\nimport ThemedDefaults, {DEFAULT_SYNC_KEY, DEFAULT_TITLE_FONT_SIZE} from './defaults';\nimport i18n from './locale';\n\nimport {CreateUplotOptionsMixin} from './mixins/create-options';\nimport {TransformSeriesMixin} from './mixins/transform-series';\nimport {DynamicUpdatesMixin} from './mixins/dynamic-updates';\n\nimport {applyMixins} from './utils/mixins';\nimport {BatchMixin} from './mixins/batch-updates';\n\nexport interface YagrEvent {\n    chart: Yagr;\n    meta: YagrMeta;\n}\n\nexport type YagrMeta = {\n    renderTime: number;\n    processTime: number;\n    initTime: number;\n};\n\ntype CachedProps = {\n    width: number;\n    height: number;\n};\n\nexport interface YagrState {\n    isEmptyDataSet: boolean;\n    isMouseOver: boolean;\n    stage: 'config' | 'processing' | 'uplot' | 'render' | 'listen' | 'dispose';\n    inBatch?: boolean;\n    y2uIdx: Record<string, number>;\n    subscribed: boolean;\n}\n\n/*\n * Main core-module of Yagr.\n * Implements data processing and autoconfigurable wrapper\n * for uPlot chart.\n * Entrypoint of every Yagr chart.\n */\nclass Yagr<TConfig extends MinimalValidConfig = MinimalValidConfig> {\n    id!: string;\n    options!: UPlotOptions;\n    uplot!: UPlot;\n    root!: HTMLElement;\n    series!: AlignedData;\n    config!: YagrConfig;\n    resizeOb?: ResizeObserver;\n    canvas!: HTMLCanvasElement;\n    plugins: {\n        tooltip?: ReturnType<TooltipPlugin>;\n        plotLines?: ReturnType<PlotLinesPlugin>;\n        cursor?: ReturnType<typeof cursorPlugin>;\n        legend?: LegendPlugin;\n    } & Partial<\n        TConfig['plugins'] extends YagrConfig['plugins']\n            ? {[key in keyof TConfig['plugins']]: ReturnType<TConfig['plugins'][key]>}\n            : {}\n    > = {};\n    state!: YagrState;\n    utils!: {\n        colors: ColorParser;\n        sync?: SyncPubSub;\n        theme: ThemedDefaults;\n        i18n: ReturnType<typeof i18n>;\n    };\n\n    get isEmpty() {\n        return this.state.isEmptyDataSet;\n    }\n\n    protected _startTime!: number;\n    protected _meta: Partial<YagrMeta> = {};\n\n    /** Create uPlot options methods */\n    protected createUplotOptions!: CreateUplotOptionsMixin<TConfig>['createUplotOptions'];\n    protected transformSeries!: TransformSeriesMixin<TConfig>['transformSeries'];\n    protected _uHooks: Record<string, (u: uPlot) => void> = {};\n\n    /** Dynamic update methods */\n    setTheme!: DynamicUpdatesMixin<TConfig>['setTheme'];\n    setLocale!: DynamicUpdatesMixin<TConfig>['setLocale'];\n    setAxes!: DynamicUpdatesMixin<TConfig>['setAxes'];\n    setSeries!: DynamicUpdatesMixin<TConfig>['setSeries'];\n    setVisible!: DynamicUpdatesMixin<TConfig>['setVisible'];\n    setFocus!: DynamicUpdatesMixin<TConfig>['setFocus'];\n    setScales!: DynamicUpdatesMixin<TConfig>['setScales'];\n    setTitle!: DynamicUpdatesMixin<TConfig>['setTitle'];\n    setConfig!: DynamicUpdatesMixin<TConfig>['setConfig'];\n\n    /** Batch update methods */\n    batch!: BatchMixin<TConfig>['batch'];\n    protected fullUpdate!: BatchMixin<TConfig>['fullUpdate'];\n    protected _batch!: BatchMixin<TConfig>['_batch'];\n\n    protected _cache!: CachedProps;\n\n    /** Mixin methods */\n    private initMixins!: () => void;\n\n    constructor(root: HTMLElement, pConfig: TConfig) {\n        this.initMixins();\n\n        this._startTime = performance.now();\n        this.state = {\n            isEmptyDataSet: false,\n            isMouseOver: false,\n            stage: 'config',\n            y2uIdx: {},\n            subscribed: false,\n        };\n\n        const config: YagrConfig = Object.assign(\n            {\n                title: {},\n                data: [],\n                axes: {},\n                series: [],\n                scales: {},\n                hooks: {},\n                settings: {},\n                chart: {},\n                cursor: {},\n                plugins: {},\n                legend: {\n                    show: false,\n                },\n                tooltip: {\n                    show: true,\n                },\n                grid: null,\n                markers: {},\n            },\n            pConfig,\n        );\n\n        this.config = config;\n\n        this.inStage('config', () => {\n            this.id = root.id || genId();\n            this.root = root;\n            this.root.classList.add('yagr');\n\n            if (!this.root.id) {\n                this.root.id = this.id;\n            }\n\n            const colorParser = new ColorParser();\n            const sync = this.config.cursor.sync;\n\n            const chart = this.config.chart;\n\n            chart.series ||= {type: 'line'};\n            chart.size ||= {adaptive: true};\n            chart.appearance ||= {locale: 'en'};\n            chart.select ||= {};\n\n            this.utils = {\n                colors: colorParser,\n                i18n: i18n(config.chart.appearance?.locale || 'en'),\n                theme: new ThemedDefaults(colorParser),\n            };\n\n            colorParser.setContext(root);\n\n            if (sync) {\n                this.utils.sync = UPlot.sync(typeof sync === 'string' ? sync : DEFAULT_SYNC_KEY);\n            }\n\n            if (!chart.size.adaptive && chart.size.width && chart.size.height) {\n                root.style.width = px(chart.size.width);\n                root.style.height = px(chart.size.height);\n            }\n\n            this.plugins.legend = new LegendPlugin();\n            this.setTheme(chart.appearance.theme || 'light');\n            this.createUplotOptions();\n            this._cache = {\n                height: this.options.height,\n                width: this.options.width,\n            };\n            if (config.editUplotOptions) {\n                this.options = config.editUplotOptions(this.options);\n            }\n        })\n            .inStage('processing', () => {\n                this.transformSeries();\n            })\n            .inStage('uplot', () => {\n                this.uplot = new UPlot(this.options, this.series, this.initRender);\n                this.canvas = root.querySelector('canvas') as HTMLCanvasElement;\n\n                this.init();\n\n                const processTime = performance.now() - this._startTime;\n                this._meta.processTime = processTime;\n            })\n            .inStage('render');\n    }\n\n    /**\n     * Redraws Yagr instance by given options.\n     */\n    redraw(series = true, axes = true) {\n        this.uplot.redraw(series, axes);\n    }\n\n    /**\n     * Get current scale ranges (min/max values)\n     * @param scaleName - Optional scale name. If not provided, returns all scales\n     * @returns Object with min/max values for each scale\n     */\n    getScales(scaleName?: string): Record<string, {min: number; max: number}> {\n        if (!this.uplot || !this.uplot.scales) {\n            return {};\n        }\n\n        const scales = this.uplot.scales;\n        const result: Record<string, {min: number; max: number}> = {};\n\n        if (scaleName) {\n            const scale = scales[scaleName];\n            if (scale && scale.min !== undefined && scale.max !== undefined) {\n                result[scaleName] = {\n                    min: scale.min,\n                    max: scale.max,\n                };\n            }\n        } else {\n            Object.keys(scales).forEach((key) => {\n                const scale = scales[key];\n                if (scale && scale.min !== undefined && scale.max !== undefined) {\n                    result[key] = {\n                        min: scale.min,\n                        max: scale.max,\n                    };\n                }\n            });\n        }\n\n        return result;\n    }\n\n    /**\n     *  Get uPlot's Series from series id\n     */\n    getSeriesById(id: string): Series {\n        return this.uplot.series[this.state.y2uIdx[id]];\n    }\n\n    getSerieLegendColor(serie: Series) {\n        const {legendColorKey, color, lineColor} = serie;\n\n        let serieColor = color;\n\n        switch (legendColorKey) {\n            case 'lineColor': {\n                if (lineColor) {\n                    serieColor = lineColor;\n                }\n                break;\n            }\n            case 'color': {\n                serieColor = color;\n            }\n        }\n\n        return serieColor;\n    }\n\n    dispose() {\n        this.resizeOb && this.resizeOb.unobserve(this.root);\n        this.unsubscribe();\n        this.plugins?.tooltip?.dispose();\n        this.plugins?.legend?.destroy();\n        this.uplot.destroy();\n        this._uHooks = {};\n        this.execHooks('dispose', {chart: this});\n    }\n\n    toDataUrl() {\n        return this.canvas.toDataURL('img/png');\n    }\n\n    subscribe() {\n        if (this.state.subscribed) {\n            return;\n        }\n\n        this.utils.sync?.sub(this.uplot);\n        this.state.subscribed = true;\n    }\n\n    unsubscribe() {\n        this.utils.sync?.unsub(this.uplot);\n        this.state.subscribed = false;\n    }\n\n    protected init = () => {\n        if (this.config.chart.size?.adaptive && !this.resizeOb) {\n            this.resizeOb = new ResizeObserver(\n                debounce(this.onResize, this.config.chart.size.resizeDebounceMs || 100),\n            );\n            this.resizeOb.observe(this.root);\n        }\n\n        if (!this.config.hooks.dispose) {\n            this.config.hooks.dispose = [];\n        }\n\n        /** Unsubscribe in init required to avoid chars been synced without action from developer */\n        this.unsubscribe();\n        this.config.hooks.dispose.push(this.trackMouse());\n    };\n\n    protected execHooks = <T extends keyof InternalYargHooks>(\n        hookName: T,\n        ...args: Parameters<Required<InternalYargHooks>[T][0]>\n    ) => {\n        const hooks = this.config.hooks[hookName];\n        if (Array.isArray(hooks)) {\n            for (const hook of hooks) {\n                if (!hook) {\n                    continue;\n                }\n\n                typeof hook === 'function' && hook(...args);\n            }\n        }\n    };\n\n    protected inStage(stage: YagrState['stage'], fn?: () => void) {\n        this.state.stage === stage;\n        this.execHooks('stage', {chart: this, stage});\n        try {\n            fn && fn();\n        } catch (error) {\n            console.error(error);\n            this.onError(error as Error);\n        }\n        return this;\n    }\n\n    protected initRender = (u: uPlot, done: Function) => {\n        /**\n         * Reimplementing appending u.root to root\n         * and ensure that uPlot instance will be placed\n         * correctly relative to legend\n         */\n        const position = this.config.legend?.position;\n        if (this.root.firstChild) {\n            !position || position === 'bottom'\n                ? this.root.insertBefore(u.root, this.root.firstChild)\n                : this.root.appendChild(u.root);\n        } else {\n            !position || position === 'bottom'\n                ? this.root.appendChild(u.root)\n                : this.root.insertBefore(u.root, this.root.firstChild);\n        }\n\n        if (this.config.legend?.show) {\n            this.plugins.legend?.init(u);\n            this.reflow(false);\n        }\n\n        this.initTitle();\n\n        done();\n    };\n\n    protected initTitle() {\n        /** Setup font size for title if required */\n        if (this.config.title && this.config.title.fontSize) {\n            const size = this.config.title.fontSize;\n            const t = this.root.querySelector('.u-title') as HTMLElement;\n            t.setAttribute('style', `font-size:${size}px;line-height:${size}px;`);\n            t.innerHTML = this.config.title.text;\n        }\n    }\n\n    private onError(error: Error) {\n        this.execHooks('error', {\n            stage: this.state.stage,\n            error,\n            chart: this,\n        });\n        return error;\n    }\n\n    private trackMouse() {\n        const mouseOver = () => {\n            this.state.isMouseOver = true;\n        };\n        const mouseLeave = () => {\n            this.state.isMouseOver = false;\n        };\n        this.root.addEventListener('mouseover', mouseOver);\n        this.root.addEventListener('mouseleave', mouseLeave);\n\n        return () => {\n            this.root.removeEventListener('mouseover', mouseOver);\n            this.root.removeEventListener('mouseleave', mouseLeave);\n        };\n    }\n\n    /*\n     * Resize handler. Should cache height and width to avoid unneccesary resize handling,\n     * when actial width and height of contentRect doesn't changed\n     */\n    private onResize = (args: ResizeObserverEntry[]) => {\n        const [resize] = args;\n\n        if (\n            this._cache.height === resize.contentRect.height &&\n            this._cache.width === resize.contentRect.width\n        ) {\n            return;\n        }\n\n        this.plugins.tooltip?.reset();\n\n        this.reflow();\n        this.execHooks('resize', {entries: args, chart: this});\n    };\n\n    get clientHeight() {\n        const MARGIN = 8;\n        const offset = this.config.title.text\n            ? (this.config.title.fontSize || DEFAULT_TITLE_FONT_SIZE) + MARGIN\n            : 0;\n        // https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements#how_much_room_does_it_use_up\n        // getBoundingClientRect() provides more precise decimal point values.\n        // To prevent extra scroll we need round to floor\n        return (\n            Math.floor(this.root.getBoundingClientRect().height) -\n            offset -\n            (this.plugins.legend?.state.totalSpace || 0)\n        );\n    }\n\n    reflow(redraw = true) {\n        const width = this.root.clientWidth;\n        const height = this.clientHeight;\n\n        this._cache.width = width;\n        this.options.width = width;\n        this._cache.height = height;\n        this.options.height = height;\n        redraw &&\n            this.uplot.setSize({\n                width: this.options.width,\n                height: this.options.height,\n            });\n        redraw && this.uplot.redraw();\n    }\n}\n\napplyMixins(Yagr, [CreateUplotOptionsMixin, TransformSeriesMixin, DynamicUpdatesMixin, BatchMixin]);\n\nexport default Yagr;\n", "export * from './YagrCore/types';\nexport * from './YagrCore/plugins/tooltip/types';\nexport * from './plugins/aggregates/aggregates';\nexport * from './YagrCore/plugins/tooltip';\n\nexport {default as aggregatesPlugin} from './plugins/aggregates/aggregates';\n\nexport {CursorOptions} from './YagrCore/plugins/cursor/cursor';\nexport {\n    LegendOptions,\n    getSeriesInLegend,\n    hasOneVisibleLine,\n} from './YagrCore/plugins/legend/legend';\n\nexport * from './YagrCore/utils';\n\nimport * as DEF from './YagrCore/defaults';\nexport const defaults = DEF;\n\nimport Yagr from './YagrCore/index';\n\nif (typeof window !== 'undefined') {\n    Object.assign(window, {\n        Yagr,\n    });\n}\n\nexport default Yagr;\n"],
  "mappings": "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",
  "names": ["defaults_exports", "__export", "AXIS_LABEL_FONT", "AXIS_VALUES_FONT", "BARS_DRAW_FACTOR", "BARS_DRAW_MAX", "CURSOR_STYLE", "DARK_DEFAULT_LINE_COLOR", "DAY", "DECADE", "DEFAULT_AXIS_FONT_SIZE", "DEFAULT_CANVAS_PIXEL_RATIO", "DEFAULT_FOCUS_ALPHA", "DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE", "DEFAULT_MAX_TICKS", "DEFAULT_POINT_SIZE", "DEFAULT_SCALE_MIN_RANGE", "DEFAULT_SYNC_KEY", "DEFAULT_TITLE_FONT_SIZE", "DEFAULT_X_SCALE", "DEFAULT_X_SERIE_NAME", "DEFAULT_Y_AXIS_LABEL_PADDING", "DEFAULT_Y_AXIS_OFFSET", "DEFAULT_Y_AXIS_PADDING", "DEFAULT_Y_AXIS_SIZE", "DEFAULT_Y_SCALE", "HOUR", "LIGHT_DEFAULT_LINE_COLOR", "MARKER_DIAMETER", "MINUTE", "MIN_SELECTION_WIDTH", "PADDING_BOTH", "PADDING_LEFT", "PADDING_RIGHT", "SECOND", "SERIE_AREA_BORDER_COLOR", "SERIE_AREA_BORDER_WIDTH", "SERIE_COLOR", "SERIE_LINE_WIDTH", "TIME_MULTIPLIER", "TOOLTIP_DEFAULT_MAX_LINES", "TOOLTIP_X_OFFSET", "TOOLTIP_Y_OFFSET", "TYPES_ORDER", "X_AXIS_INCRS", "X_AXIS_SIZE", "X_AXIS_SPACE", "X_AXIS_TICK_GAP", "YEAR", "Y_AXIS_LABEL_SIZE", "Y_AXIS_SIZE", "Y_AXIS_TICK_GAP", "ThemedDefaults", "self", "values", "axisIdx", "longesValue", "l", "c", "ctx", "axis", "textSize", "labelSize", "labelText", "size", "LIGHTEN_COLOR_SHIFT", "DARKEN_COLOR_SHIFT", "colors", "theme", "_a", "integrate", "timestamps", "t0", "x0", "t1", "x1", "integral", "i", "dt", "dx", "area", "countNumbers", "from", "to", "cnt", "getLast", "val", "safeMin", "min", "v", "safeMax", "max", "safeSum", "sum", "DataRef", "opst", "yagr", "aggrs", "pluginMethods", "fromIdx", "toIdx", "result", "scale", "id", "total", "acc", "count", "seriesId", "seriesIdx", "avg", "last", "u", "key", "$c", "numericValues", "rowSum", "rowIntegral", "aggregates_default", "getOptionValue", "option", "escapeHTML", "html", "elem", "renderItems", "rows", "opts", "rowsMax", "value", "name", "color", "active", "transformed", "renderTooltip", "data", "allTitle", "sectionTitle", "sections", "x", "xScaleTitle", "sectionTitleBody", "scaleBody", "findInRange", "section", "stickToRanges", "positive", "maxIdx", "minIdx", "diffs", "r", "row", "y", "rowIdx", "diff", "currentMin", "nextMin", "getSumByIdx", "seriesOptions", "idx", "seriesValues", "findSticky", "nearestIndex", "nearestValue", "getUnitSuffix", "toFixed", "num", "fixed", "int", "frac", "findDataIdx", "series", "defaultSnapTo", "skipValue", "corL", "corR", "direction", "interpolateImpl", "timeline", "y1", "y2", "x2", "xIdx", "iGroup", "type", "lD", "rD", "genId", "preprocess", "settings", "nullValues", "interpolation", "sIdx", "line", "resultLine", "iIdx", "debounce", "func", "timeout", "timer", "args", "px", "tag", "attrs", "content", "el", "attr", "a", "b", "get", "obj", "_b", "deepIsEqual", "isNil", "aObject", "bObject", "aKeys", "bKeys", "asFn", "t", "inBetween", "start", "end", "NAMES", "normalizeRect", "rect", "placement", "initialAnchor", "side", "options", "anchor", "anchorRect", "boundRect", "elemStyle", "primary", "secondary", "offset", "secondaryMarginBefore", "secondaryMarginAfter", "secondaryMargin", "secondaryMaxSize", "styledSecondaryMaxSize", "margin", "roomBefore", "roomAfter", "primaryMaxSize", "styledPrimaryMaxSize", "maxOffset", "scrollOffset", "boundPrimaryPos", "pos", "boundSecondaryPos", "maxSecondaryOffset", "secondaryScrollOffset", "DEFAULT_SHADE_COLOR", "ColorParser", "rgbaColor", "m", "isVar", "res", "pure", "prop", "pColor", "context", "fallbackRgba", "g", "tOffset", "transition", "_r", "_g", "getFocusedColor", "shift", "s", "mainColor", "getSerieFocusColors", "field", "MAX_CURSORS", "paintCursorPoint", "pt", "span", "colorRgba", "cursorPoint", "seriesIndex", "serie", "getPointsByIdx", "over", "CursorPlugin", "_c", "processing", "pInterpolation", "iValue", "snapToNulls", "snapToInterpolated", "mem", "snapOnValues", "hoveredIdx", "seriesData", "pinState", "pointsHolder", "newElem", "serieIdx", "focus", "item", "_", "uplotOptions", "emptyLines", "hiddenLines", "totalLines", "maxCursors", "seriesValue", "cX", "cY", "preventMouseEvents", "escapeAttribute", "ALL_SERIES_IDX", "PAGINATION_BUTTON_HEIGHT", "TOTAL_LEGEND_VERTICAL_PADDING_BOTTOM", "TOTAL_LEGEND_VERTICAL_PADDING_TOP", "DEFAULT_FONT_SIZE", "DEFAULT_LEGEND_PLACE_RATIO", "getSeriesInLegend", "showInLegend", "hasOneVisibleLine", "show", "showInGraph", "hasAnySeriesWithShowTrue", "isSeriesVisibleOnGraph", "isLegendItemDisabled", "shouldRestoreShowAfterShowAll", "getPrependingTitle", "i18n", "getPrependingTitleId", "LegendPlugin", "serieNode", "serieId", "hidden", "disabled", "body", "rootEl", "pseudo", "state", "unsubsribe", "onSerieClick", "seriesToToggle", "isShowAll", "nextToggleState", "nextState", "node", "allSeriesItem", "title", "changeVisibility", "visibility", "toggleSerie", "selectSerie", "otherSeries", "otherVisibility", "selectRange", "range", "e", "onSerieMouseEnter", "targetSerie", "onSerieMouseLeave", "onClick", "onFocus", "destroy", "fn", "reRender", "legendEl", "pagination", "nextPage", "prevPage", "upClassName", "downClassName", "serieNameElement", "seriesInLegend", "titleId", "serieContent", "sId", "additionalCn", "icon", "isHidden", "isDisabled", "itemClass", "chartHeight", "requiredHeight", "rowHeight", "maxPossiblePlace", "rowsPerPage", "itemsRowsPerPage", "itemsPageSize", "paginatedPageSize", "paginated", "requiredSpace", "pages", "additionalSpace", "FEAT_TIME", "pre", "UPLOT", "ORI_HZ", "ORI_VT", "TITLE", "WRAP", "UNDER", "OVER", "AXIS", "OFF", "SELECT", "CURSOR_X", "CURSOR_Y", "CURSOR_PT", "LEGEND", "LEGEND_LIVE", "LEGEND_INLINE", "LEGEND_SERIES", "LEGEND_MARKER", "LEGEND_LABEL", "LEGEND_VALUE", "WIDTH", "HEIGHT", "TOP", "BOTTOM", "LEFT", "RIGHT", "hexBlack", "transparent", "mousemove", "mousedown", "mouseup", "mouseenter", "mouseleave", "dblclick", "resize", "scroll", "change", "dppxchange", "LEGEND_DISP", "domEnv", "doc", "win", "nav", "pxRatio", "query", "setPxRatio", "_pxRatio", "off", "on", "addClass", "cl", "remClass", "setStylePx", "placeTag", "cls", "targ", "refEl", "placeDiv", "xformCache", "elTrans", "xPos", "yPos", "xMax", "yMax", "xform", "xformOld", "colorCache", "elColor", "background", "borderColor", "newColor", "oldColor", "sizeCache", "elSize", "newWid", "newHgt", "centered", "newSize", "oldSize", "evOpts", "evOpts2", "ev", "cb", "capt", "closestIdx", "arr", "lo", "hi", "mid", "bitwise", "floor", "makeIndexOfs", "predicate", "_i0", "_i1", "i0", "i1", "notNullish", "isPositive", "nonNullIdxs", "positiveIdxs", "getMinMax", "sorted", "log", "getEdgeIdxs", "_min", "_max", "inf", "rangeLog", "base", "fullMags", "minSign", "sign", "maxSign", "logFn", "log10", "log2", "growMinAbs", "ceil", "growMaxAbs", "minExp", "abs", "maxExp", "minIncr", "pow", "maxIncr", "roundDec", "incrRoundDn", "incrRoundUp", "rangeAsinh", "minMax", "rangePad", "autoRangePart", "_eqRangePart", "_eqRange", "rangeNum", "mult", "extra", "isObj", "_rangeNum", "ifNull", "lh", "rh", "hasData", "idx0", "idx1", "cfg", "cmin", "cmax", "padMin", "padMax", "hardMin", "hardMax", "softMin", "softMax", "softMinMode", "softMaxMode", "delta", "deltaMag", "scalarMax", "scalarMag", "scalarMagDelta", "nonZeroDelta", "mag", "_padMin", "_newMin", "_softMin", "minLim", "_padMax", "_newMax", "_softMax", "maxLim", "numFormatter", "fmtNum", "M", "PI", "round", "sinh", "linthresh", "asinh", "numIntDigits", "clamp", "isFn", "fnOrSelf", "noop", "retArg0", "_0", "retArg1", "_1", "retNull", "retTrue", "retEq", "regex6", "fixFloat", "isInt", "fixedDec", "str", "match", "len", "exp", "incrRound", "incr", "dec", "p", "guessDec", "genIncrs", "mults", "incrs", "multDec", "expa", "_incr", "EMPTY_OBJ", "EMPTY_ARR", "nullNullTuple", "isArr", "isUndef", "isStr", "is", "fastIsObj", "TypedArray", "__proto__", "copy", "o", "_isObj", "out", "k", "assign", "src", "NULL_REMOVE", "NULL_RETAIN", "NULL_EXPAND", "nullExpand", "yVals", "nullIdxs", "alignedLen", "xi", "lastNullIdx", "nullIdx", "join", "tables", "nullModes", "allHeadersSame", "table", "isAsc", "sortCols", "xVals", "ti", "xs", "xIdxs", "si", "ys", "nullMode", "yVal", "alignedIdx", "microTask", "head", "rlen", "idxs", "table2", "row2", "j", "vals0", "len0", "vals1", "vals", "samples", "firstIdx", "lastIdx", "stride", "prevVal", "months", "days", "slice3", "days3", "months3", "engNames", "zeroPad2", "zeroPad3", "subs", "d", "names", "h", "fmtDate", "tpl", "parts", "R", "localTz", "tzDate", "date", "tz", "date2", "onlyWhole", "allMults", "decIncrs", "oneIncrs", "wholeIncrs", "numIncrs", "NL", "yyyy", "NLyyyy", "md", "NLmd", "NLmdyy", "aa", "hmm", "hmmaa", "NLhmmaa", "ss", "genTimeStuffs", "ms", "mo", "timeIncrs", "_timeAxisStamps", "timeAxisSplits", "scaleMin", "scaleMax", "foundIncr", "foundSpace", "splits", "isYr", "isMo", "minDate", "minDateTs", "minMin", "mkDate", "minMinTs", "moIncr", "yrIncr", "split", "splitDate", "baseYear", "baseMonth", "next", "offs", "incr0", "tzOffset", "date0", "prevHour", "incrHours", "minSpace", "pctSpace", "expectedHour", "dstShift", "prevSplit", "timeIncrsMs", "_timeAxisStampsMs", "timeAxisSplitsMs", "timeIncrsS", "_timeAxisStampsS", "timeAxisSplitsS", "timeAxisStamps", "stampCfg", "timeAxisVals", "stamps", "prevYear", "prevMnth", "prevDate", "prevMins", "prevSecs", "newYear", "newMnth", "newDate", "newHour", "newMins", "newSecs", "stamp", "timeAxisVal", "dateTpl", "timeSeriesStamp", "_timeSeriesStamp", "timeSeriesVal", "dataIdx", "legendStroke", "legendFill", "legendOpts", "cursorPointShow", "mar", "width", "cursorPointFill", "sp", "cursorPointStroke", "cursorPointSize", "moveTuple", "cursorMove", "mouseLeft1", "mouseTop1", "filtBtn0", "handle", "onlyTarg", "filtTarg", "cursorOpts", "valPos", "curPos", "axisLines", "grid", "ticks", "border", "font", "labelFont", "lineGap", "xAxisOpts", "numSeriesLabel", "timeSeriesLabel", "xSeriesOpts", "numAxisVals", "numAxisSplits", "forceMin", "numDec", "logAxisSplits", "logBase", "nextMagIncr", "asinhAxisSplits", "posSplits", "zero", "RE_ALL", "RE_12357", "RE_125", "RE_1", "_filt", "distr", "re", "keepMod", "log10AxisValsFilt", "scaleKey", "sc", "valToPos", "_10", "magSpace", "log2AxisValsFilt", "numSeriesVal", "yAxisOpts", "ptDia", "dia", "seriesPointsShow", "xData", "p0", "p1", "dim", "maxPts", "facet", "gaps", "nullGaps", "xySeriesOpts", "ySeriesOpts", "clampScale", "xScaleOpts", "yScaleOpts", "syncs", "_sync", "plot", "w", "BAND_CLIP_FILL", "BAND_CLIP_STROKE", "orient", "mode", "scales", "bbox", "dy", "sx", "sy", "H", "V", "moveToH", "lineToH", "rectH", "arcH", "bezierCurveToH", "moveToV", "lineToV", "rectV", "arcV", "bezierCurveToV", "bandFillClipDirs", "fillDir", "clipDirs", "bands", "seriesFillTo", "dataMin", "dataMax", "bandFillDir", "clipBandLine", "strokePath", "clipDir", "dataX", "dataY", "scaleX", "scaleY", "valToPosX", "valToPosY", "xOff", "yOff", "xDim", "yDim", "pxRound", "dir", "lineTo", "frIdx", "y0", "yLimit", "clip", "clipGaps", "ori", "plotLft", "plotTop", "plotWid", "plotHgt", "prevGapEnd", "maxStrokeWidth", "addGap", "fromX", "toX", "prevGap", "findGaps", "pixelForX", "align", "fr", "frPx", "toPx", "fri2", "toi2", "pxRoundGen", "pxAlign", "moveTo", "arcTo", "endRad", "baseRad", "startAngle", "endAngle", "bp1x", "bp1y", "bp2x", "bp2y", "p2x", "p2y", "points", "filtIdxs", "arc", "rad", "fill", "lft", "top", "wid", "hgt", "drawPoint", "pi", "_drawAcc", "stroke", "accX", "minY", "maxY", "inY", "outY", "drawAccH", "drawAccV", "linear", "alignGaps", "pixelForY", "drawAcc", "_paths", "hasGap", "xForPixel", "drawnAtX", "idx0px", "idx1px", "nextAccXVal", "xVal", "bandClipDir", "fillToVal", "fillToY", "frX", "stepped", "ascDesc", "extend", "left", "prevYPos", "firstXPos", "prevXPos", "firstXPosExt", "yVal1", "prevXPosExt", "fillTo", "halfStroke", "startsOffset", "endsOffset", "findColWidth", "colWid", "prevIdx", "minDelta", "bars", "_extraGap", "ro", "radiusFn", "gapFactor", "_maxWidth", "_minWidth", "disp", "_each", "dispFills", "dispStrokes", "_align", "extraGap", "maxWidth", "minWidth", "valRadius", "baseRadius", "_dirX", "each", "band", "xShift", "barWid", "fullGap", "strokeWidth", "multiPath", "fillColors", "fillPaths", "strokeColors", "strokePaths", "pct", "sizes", "insetStroke", "rawBarWid", "dataY0", "radVal", "radBase", "yVal0", "btm", "barHgt", "rv", "rb", "splineInterp", "interp", "bezierCurveTo", "xCoords", "yCoords", "monotoneCubic", "_monotoneCubic", "n", "path", "ds", "dys", "dxs", "cursorPlots", "invalidateRects", "uPlot", "linearPath", "pointsPath", "setDefaults", "xo", "yo", "initY", "setDefault", "setDefaults2", "xyo", "snapNumX", "snapTimeX", "snapNumY", "snapLogY", "snapLogX", "snapAsinhY", "snapAsinhX", "findIncr", "minVal", "maxVal", "intDigits", "incrIdx", "pxRatioFont", "fontSize", "fontSizeCss", "syncFontSize", "f", "then", "getHPos", "getVPos", "getPos", "ready", "root", "can", "wrap", "mouseLeft0", "mouseTop0", "drag", "under", "axes", "xScaleKey", "drawOrderMap", "drawAxesGrid", "drawSeries", "drawOrder", "initValToPct", "getVal", "_val", "initScale", "scaleOpts", "isTime", "rn", "rangeIsArr", "xScaleDistr", "pendScales", "_tzDate", "ts", "_fmtDate", "_timeAxisSplits", "_timeAxisVals", "_timeSeriesVal", "activeIdxs", "legend", "cursor", "showLegend", "showCursor", "markers", "legendTable", "legendHead", "legendBody", "legendRows", "legendCells", "legendCols", "multiValLegend", "NULL_LEGEND_VALUES", "getMultiVals", "son", "soff", "initLegendRow", "cells", "label", "indic", "text", "onMouse", "setCursorEvent", "isolate", "setSeries", "syncOpts", "cursorFocus", "FOCUS_TRUE", "mouseListeners", "targListeners", "listener", "offMouse", "fullWidCss", "fullHgtCss", "plotWidCss", "plotHgtCss", "plotLftCss", "plotTopCss", "_plotLftCss", "_plotTopCss", "_plotWidCss", "_plotHgtCss", "shouldSetScales", "shouldSetSize", "shouldConvergeSize", "shouldSetCursor", "shouldSetSelect", "shouldSetLegend", "_setSize", "height", "force", "calcSize", "resetYSeries", "commit", "calcPlotRect", "calcAxesRects", "bb", "CYCLE_LIMIT", "convergeSize", "converged", "cycleNum", "axesConverged", "axesCalc", "paddingConverged", "paddingCalc", "setSize", "hasTopAxis", "hasBtmAxis", "hasRgtAxis", "hasLftAxis", "_size", "isVt", "fullSize", "sidesWithAxes", "_padding", "off1", "off2", "off3", "off0", "incrOffset", "hov", "skip", "prox", "bias", "cursorIdx", "valAtPosX", "idx2", "_prox", "withProx", "cursorLft", "xValues", "yValues", "nonNullLft", "nonNullRgt", "lftPos", "rgtPos", "lftDelta", "rgtDelta", "cursorOnePt", "cursorPts", "cursorPtsLft", "cursorPtsTop", "initCursorPt", "initSeries", "sv", "_ptDia", "rowCells", "fire", "addSeries", "delSeries", "tr", "initAxis", "av", "autoPadSide", "padding", "dataLen", "data0", "viaAutoScaleX", "setData", "_data", "_resetScales", "scaleData", "_data0", "xsc", "autoScaleX", "_setScale", "ctxStroke", "ctxFill", "ctxWidth", "ctxDash", "ctxJoin", "ctxCap", "ctxFont", "ctxAlign", "ctxBaseline", "ctxAlpha", "setCtxStyle", "dash", "cap", "setFontStyle", "baseline", "accScale", "wsc", "psc", "AUTOSCALE", "setScales", "wipScales", "xFacet", "yFacet", "yScaleKey", "yData", "wscx", "wscy", "changed", "anyChanged", "getOuterIdxs", "ydata", "shouldAlpha", "cacheStrokeFill", "_ctxAlpha", "_idxs", "drawPath", "_gaps", "_points", "gapsClip", "flags", "strokeStyle", "fillStyle", "boundsClip", "_pxAlign", "strokeFill", "fillStroke", "lineWidth", "lineDash", "lineCap", "fillPath", "didStrokeFill", "bi", "lowerEdge", "lowerData", "bandClip", "gapsClip2", "_fillStyle", "CLIP_FILL_STROKE", "doFill", "doStroke", "getIncrSpace", "fullDim", "incrSpace", "drawOrthoLines", "filts", "pos0", "pos1", "_space", "_splits", "_p", "shiftDir", "shiftAmt", "baseLpos", "_label", "plotDim", "plotOff", "_tickSize", "tickSize", "axisGap", "angle", "basePos", "finalPos", "textAlign", "textBaseline", "lineHeight", "canOffs", "_values", "_parts", "queuedCommit", "deferHooks", "hooksQueue", "flushHooks", "_commit", "batch", "_deferHooks", "_el", "_show", "_pos", "posOffset", "syncRect", "pctWid", "pctHgt", "vCursor", "hCursor", "select", "_hideProps", "selectDiv", "setSelect", "updateCursor", "setLegend", "rebuildPaths", "recalcAxes", "setScale", "xCursor", "yCursor", "rawMouseLeft0", "rawMouseTop0", "rawMouseLeft1", "rawMouseTop1", "dragging", "dragX", "dragY", "_fire", "toggleDOM", "_pub", "setFocus", "pubSync", "setBand", "addBand", "delBand", "setAlpha", "closestDist", "closestSeries", "focusedSeries", "allFocused", "_setAlpha", "i2", "isFocused", "posToVal", "closestIdxFromXpos", "setSelH", "setSelV", "setSelX", "setSelY", "syncLegend", "didx", "sidx", "setLegendValues", "noDataInRange", "mouseXPos", "_ptLft", "_ptTop", "_ptWid", "_ptHgt", "_centered", "_ptFill", "_ptStroke", "yVal2", "xPos2", "mouseYPos", "dist", "mouseYVal", "seriesYValSign", "mouseYValSign", "hPos", "vPos", "ptWid", "ptHgt", "ptLft", "ptTop", "ptStroke", "ptFill", "getBBox", "focusChanged", "xKey", "yKey", "matchXKeys", "matchYKeys", "xKeySrc", "yKeySrc", "sdrag", "sori", "sPosToVal", "sOff", "sDim", "matchingX", "matchingY", "hideSelect", "rawDX", "rawDY", "_rawDX", "uni", "syncKey", "xSyncKey", "ySyncKey", "shouldPub", "defer", "mouseMove", "_l", "_t", "_w", "_h", "_i", "cacheMouse", "initial", "snap", "syncOptsSrc", "xValSrc", "yValSrc", "rotSrc", "_xDim", "_yDim", "_xPos", "_yPos", "__l", "downSelectLeft", "downSelectTop", "downSelectWidth", "downSelectHeight", "mouseDown", "mouseUp", "hasSelect", "chgSelect", "mouseLeave", "_dragging", "snapH", "snapV", "snapProx", "dragH", "dragV", "dblClick", "syncPxRatio", "events", "seriesIdxMatcher", "hooks", "evName", "a1", "a2", "srcSeriesIdx", "sync", "pub", "_init", "paths", "DrawOrderKey", "Scale", "Axis", "YAGR_AXIS_TO_UPLOT_AXIS", "AXIS_SIDE_TO_ALIGN", "getAxisPositioning", "getDefaultNumberFormatter", "precision", "nullValue", "precisionNum", "suffix", "transformedValue", "getNumericValueFormatter", "axisConfig", "dayTimeFormatter", "dateTimeFormatter", "minuteFormatter", "secondFormatter", "yearFormatter", "getTimeFormatterByRange", "ticksCount", "formatter", "minRange", "getTimeFormatter", "config", "msm", "rangeMs", "rawValue", "getSplits", "splitsCount", "__", "step", "getAxis", "getRedrawOptionsForAxesUpdate", "updateAxis", "uAxis", "upd", "configureAxes", "getScaleRange", "rangeFn", "niceScale", "offsetScale", "dMin", "dMax", "isScaleMinDefined", "niceNum", "scaleConfig", "startFromZero", "endWithZero", "difference", "configureScales", "scalesToMap", "scaleName", "isLogScale", "forceMax", "LOCALIZATIONS", "locale_default", "locale", "findValue", "source", "snapTo", "nonNullIdx", "cursorSnapToValues", "DEFAULT_TOOLTIP_OPTIONS", "YagrTooltip", "action", "handler", "shouldEmit", "position", "list", "event", "target", "props", "rowsBySections", "serieIndicies", "cursorPosition", "cursorValue", "valueRender", "dValue", "realY", "yValue", "seriesPrecision", "displayValue", "rowData", "tracking", "activeIndex", "sort", "renderData", "sec", "newOptions", "isClickInsideTooltip", "isClickOnUplotOver", "evt", "startPoint", "click", "strategy", "isPinned", "pSettings", "YagrTooltipPlugin", "tooltip", "getUplotPlugin", "uPlotPlugin", "reInit", "uPlugin", "tooltip_default", "renderCircle", "strokeColor", "yScale", "cx", "cy", "drawWithinPlot", "draw", "drawMarkersIfRequired", "spanGaps", "pointsSize", "prev", "nextIdx", "YagrMarkersPlugin", "chartSeriesOptions", "defaultDotsSize", "drawCircles", "_focus", "pointSize", "markSeries", "uplot", "pathsRenderer", "drawer", "getCommonProperty", "defaultValue", "configureSeries", "rawSeries", "colorFn", "overrideSeriesInUpdate", "dest", "_d", "_e", "_f", "_j", "_k", "_m", "getPaddingByAxes", "hasLeftAxis", "hasRightAxis", "getPosition", "calculateFromTo", "scaleCfg", "MAX_X_SCALE_LINE_OFFSET", "DRAW_MAP", "HOOKS_MAP", "plotLinesPlugin", "plotLines", "drawIndicies", "hook", "getLineId", "renderPlotLines", "plotLineConfig", "isBand", "accent", "pConf", "lastValue", "addPlotLines", "additionalPlotLines", "lineId", "removePlotLines", "plotLinesToRemove", "lineToRemove", "getPlotLines", "updatePlotLines", "newPlotLines", "clearPlotLines", "existingKeys", "newLine", "plotLine", "setIfNotSet", "CreateUplotOptionsMixin", "renderTime", "initTime", "_from", "_to", "timeMultiplier", "_u", "reOpt", "plugins", "tooltipInstance", "plotLinesPluginInstance", "plugin", "pluginInstance", "chart", "cPlugin", "resultingSeriesOptions", "uIdx", "markersPluginInstance", "TransformSeriesMixin", "processingStartTime", "shouldMapNullValues", "stacks", "dataLine", "realSerieIdx", "serieConfigIndex", "serieOptions", "isStacking", "sGroup", "empty", "setLocaleImpl", "setThemeImpl", "themeValue", "classesToRemove", "setAxesImpl", "rest", "xAxis", "setFocusImpl", "setVisibleImpl", "updateLegend", "shouldRebuildStacks", "setScalesImpl", "stackingIsChanged", "normalizationIsChanged", "stacking", "newStacking", "isChangingOnlyMinMax", "pMin", "pMax", "pRest", "nMin", "nMax", "nRest", "isChangingXAxis", "isChanged", "oldConfig", "newConfig", "oldValue", "newValue", "areSeriesChanged", "mapA", "mapB", "setConfigImpl", "fullUpdate", "isChangedKey", "setSeriesImpl", "timelineOrSeriesOrId", "maybeSeries", "updateId", "useIncremental", "shouldRecalcData", "useFullyRedraw", "shouldUpdateCursror", "matched", "newSeries", "uOpts", "prevUplotShow", "userShow", "hideForGraph", "targetUplotShow", "targetTempHidden", "sliceLength", "DynamicUpdatesMixin", "applyMixins", "derivedCtor", "constructors", "inits", "baseCtor", "init", "BatchMixin", "Yagr", "pConfig", "hookName", "done", "colorParser", "processTime", "legendColorKey", "lineColor", "serieColor", "stage", "error", "mouseOver", "redraw", "YagrCore_default", "defaults", "src_default"]
}
