Hacked By AnonymousFox

Current Path : C:/AppServ/www/financial/stacked/code/modules/
Upload File :
Current File : C:/AppServ/www/financial/stacked/code/modules/marker-clusters.js.map

{"version":3,"sources":["<anon>"],"sourcesContent":["/**\n * @license Highcharts JS v12.1.2 (2025-01-09)\n * @module highcharts/modules/marker-clusters\n * @requires highcharts\n *\n * Marker clusters module for Highcharts\n *\n * (c) 2010-2024 Wojciech Chmiel\n *\n * License: www.highcharts.com/license\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(root[\"_Highcharts\"]);\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"highcharts/modules/marker-clusters\", [\"highcharts/highcharts\"], function (amd1) {return factory(amd1);});\n\telse if(typeof exports === 'object')\n\t\texports[\"highcharts/modules/marker-clusters\"] = factory(root[\"_Highcharts\"]);\n\telse\n\t\troot[\"Highcharts\"] = factory(root[\"Highcharts\"]);\n})(typeof window === 'undefined' ? this : window, (__WEBPACK_EXTERNAL_MODULE__944__) => {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 944:\n/***/ ((module) => {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__944__;\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"default\": () => (/* binding */ marker_clusters_src)\n});\n\n// EXTERNAL MODULE: external {\"amd\":[\"highcharts/highcharts\"],\"commonjs\":[\"highcharts\"],\"commonjs2\":[\"highcharts\"],\"root\":[\"Highcharts\"]}\nvar highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_ = __webpack_require__(944);\nvar highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default = /*#__PURE__*/__webpack_require__.n(highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_);\n;// ./code/es-modules/Extensions/MarkerClusters/MarkerClusterDefaults.js\n/* *\n *\n *  Marker clusters module.\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  Author: Wojciech Chmiel\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Options for marker clusters, the concept of sampling the data\n * values into larger blocks in order to ease readability and\n * increase performance of the JavaScript charts.\n *\n * Note: marker clusters module is not working with `boost`\n * and `draggable-points` modules.\n *\n * The marker clusters feature requires the marker-clusters.js\n * file to be loaded, found in the modules directory of the download\n * package, or online at [code.highcharts.com/modules/marker-clusters.js\n * ](code.highcharts.com/modules/marker-clusters.js).\n *\n * @sample maps/marker-clusters/europe\n *         Maps marker clusters\n * @sample highcharts/marker-clusters/basic\n *         Scatter marker clusters\n * @sample maps/marker-clusters/optimized-kmeans\n *         Marker clusters with colorAxis\n *\n * @product      highcharts highmaps\n * @since 8.0.0\n * @optionparent plotOptions.scatter.cluster\n *\n * @private\n */\nconst cluster = {\n    /**\n     * Whether to enable the marker-clusters module.\n     *\n     * @sample maps/marker-clusters/basic\n     *         Maps marker clusters\n     * @sample highcharts/marker-clusters/basic\n     *         Scatter marker clusters\n     */\n    enabled: false,\n    /**\n     * When set to `false` prevent cluster overlapping - this option\n     * works only when `layoutAlgorithm.type = \"grid\"`.\n     *\n     * @sample highcharts/marker-clusters/grid\n     *         Prevent overlapping\n     */\n    allowOverlap: true,\n    /**\n     * Options for the cluster marker animation.\n     * @type    {boolean|Partial<Highcharts.AnimationOptionsObject>}\n     * @default { \"duration\": 500 }\n     */\n    animation: {\n        /** @ignore-option */\n        duration: 500\n    },\n    /**\n     * Zoom the plot area to the cluster points range when a cluster is clicked.\n     */\n    drillToCluster: true,\n    /**\n     * The minimum amount of points to be combined into a cluster.\n     * This value has to be greater or equal to 2.\n     *\n     * @sample highcharts/marker-clusters/basic\n     *         At least three points in the cluster\n     */\n    minimumClusterSize: 2,\n    /**\n     * Options for layout algorithm. Inside there\n     * are options to change the type of the algorithm, gridSize,\n     * distance or iterations.\n     */\n    layoutAlgorithm: {\n        /**\n         * Type of the algorithm used to combine points into a cluster.\n         * There are three available algorithms:\n         *\n         * 1) `grid` - grid-based clustering technique. Points are assigned\n         * to squares of set size depending on their position on the plot\n         * area. Points inside the grid square are combined into a cluster.\n         * The grid size can be controlled by `gridSize` property\n         * (grid size changes at certain zoom levels).\n         *\n         * 2) `kmeans` - based on K-Means clustering technique. In the\n         * first step, points are divided using the grid method (distance\n         * property is a grid size) to find the initial amount of clusters.\n         * Next, each point is classified by computing the distance between\n         * each cluster center and that point. When the closest cluster\n         * distance is lower than distance property set by a user the point\n         * is added to this cluster otherwise is classified as `noise`. The\n         * algorithm is repeated until each cluster center not change its\n         * previous position more than one pixel. This technique is more\n         * accurate but also more time consuming than the `grid` algorithm,\n         * especially for big datasets.\n         *\n         * 3) `optimizedKmeans` - based on K-Means clustering technique. This\n         * algorithm uses k-means algorithm only on the chart initialization\n         * or when chart extremes have greater range than on initialization.\n         * When a chart is redrawn the algorithm checks only clustered points\n         * distance from the cluster center and rebuild it when the point is\n         * spaced enough to be outside the cluster. It provides performance\n         * improvement and more stable clusters position yet can be used rather\n         * on small and sparse datasets.\n         *\n         * By default, the algorithm depends on visible quantity of points\n         * and `kmeansThreshold`. When there are more visible points than the\n         * `kmeansThreshold` the `grid` algorithm is used, otherwise `kmeans`.\n         *\n         * The custom clustering algorithm can be added by assigning a callback\n         * function as the type property. This function takes an array of\n         * `processedXData`, `processedYData`, `processedXData` indexes and\n         * `layoutAlgorithm` options as arguments and should return an object\n         * with grouped data.\n         *\n         * The algorithm should return an object like that:\n         * <pre>{\n         *  clusterId1: [{\n         *      x: 573,\n         *      y: 285,\n         *      index: 1 // point index in the data array\n         *  }, {\n         *      x: 521,\n         *      y: 197,\n         *      index: 2\n         *  }],\n         *  clusterId2: [{\n         *      ...\n         *  }]\n         *  ...\n         * }</pre>\n         *\n         * `clusterId` (example above - unique id of a cluster or noise)\n         * is an array of points belonging to a cluster. If the\n         * array has only one point or fewer points than set in\n         * `cluster.minimumClusterSize` it won't be combined into a cluster.\n         *\n         * @sample maps/marker-clusters/optimized-kmeans\n         *         Optimized K-Means algorithm\n         * @sample highcharts/marker-clusters/kmeans\n         *         K-Means algorithm\n         * @sample highcharts/marker-clusters/grid\n         *         Grid algorithm\n         * @sample maps/marker-clusters/custom-alg\n         *         Custom algorithm\n         *\n         * @type {string|Function}\n         * @see [cluster.minimumClusterSize](#plotOptions.scatter.cluster.minimumClusterSize)\n         * @apioption plotOptions.scatter.cluster.layoutAlgorithm.type\n         */\n        /**\n         * When `type` is set to the `grid`,\n         * `gridSize` is a size of a grid square element either as a number\n         * defining pixels, or a percentage defining a percentage\n         * of the plot area width.\n         *\n         * @type    {number|string}\n         */\n        gridSize: 50,\n        /**\n         * When `type` is set to `kmeans`,\n         * `iterations` are the number of iterations that this algorithm will be\n         * repeated to find clusters positions.\n         *\n         * @type    {number}\n         * @apioption plotOptions.scatter.cluster.layoutAlgorithm.iterations\n         */\n        /**\n         * When `type` is set to `kmeans`,\n         * `distance` is a maximum distance between point and cluster center\n         * so that this point will be inside the cluster. The distance\n         * is either a number defining pixels or a percentage\n         * defining a percentage of the plot area width.\n         *\n         * @type    {number|string}\n         */\n        distance: 40,\n        /**\n         * When `type` is set to `undefined` and there are more visible points\n         * than the kmeansThreshold the `grid` algorithm is used to find\n         * clusters, otherwise `kmeans`. It ensures good performance on\n         * large datasets and better clusters arrangement after the zoom.\n         */\n        kmeansThreshold: 100\n    },\n    /**\n     * Options for the cluster marker.\n     * @type      {Highcharts.PointMarkerOptionsObject}\n     * @extends   plotOptions.series.marker\n     * @excluding enabledThreshold, states\n     */\n    marker: {\n        /** @internal */\n        symbol: 'cluster',\n        /** @internal */\n        radius: 15,\n        /** @internal */\n        lineWidth: 0,\n        /** @internal */\n        lineColor: \"#ffffff\" /* Palette.backgroundColor */\n    },\n    /**\n     * Fires when the cluster point is clicked and `drillToCluster` is enabled.\n     * One parameter, `event`, is passed to the function. The default action\n     * is to zoom to the cluster points range. This can be prevented\n     * by calling `event.preventDefault()`.\n     *\n     * @type      {Highcharts.MarkerClusterDrillCallbackFunction}\n     * @product   highcharts highmaps\n     * @see [cluster.drillToCluster](#plotOptions.scatter.cluster.drillToCluster)\n     * @apioption plotOptions.scatter.cluster.events.drillToCluster\n     */\n    /**\n     * An array defining zones within marker clusters.\n     *\n     * In styled mode, the color zones are styled with the\n     * `.highcharts-cluster-zone-{n}` class, or custom\n     * classed from the `className`\n     * option.\n     *\n     * @sample highcharts/marker-clusters/basic\n     *         Marker clusters zones\n     * @sample maps/marker-clusters/custom-alg\n     *         Zones on maps\n     *\n     * @type      {Array<*>}\n     * @product   highcharts highmaps\n     * @apioption plotOptions.scatter.cluster.zones\n     */\n    /**\n     * Styled mode only. A custom class name for the zone.\n     *\n     * @sample highcharts/css/color-zones/\n     *         Zones styled by class name\n     *\n     * @type      {string}\n     * @apioption plotOptions.scatter.cluster.zones.className\n     */\n    /**\n     * Settings for the cluster marker belonging to the zone.\n     *\n     * @see [cluster.marker](#plotOptions.scatter.cluster.marker)\n     * @extends   plotOptions.scatter.cluster.marker\n     * @product   highcharts highmaps\n     * @apioption plotOptions.scatter.cluster.zones.marker\n     */\n    /**\n     * The value where the zone starts.\n     *\n     * @type      {number}\n     * @product   highcharts highmaps\n     * @apioption plotOptions.scatter.cluster.zones.from\n     */\n    /**\n     * The value where the zone ends.\n     *\n     * @type      {number}\n     * @product   highcharts highmaps\n     * @apioption plotOptions.scatter.cluster.zones.to\n     */\n    /**\n     * The fill color of the cluster marker in hover state. When\n     * `undefined`, the series' or point's fillColor for normal\n     * state is used.\n     *\n     * @type      {Highcharts.ColorType}\n     * @apioption plotOptions.scatter.cluster.states.hover.fillColor\n     */\n    /**\n     * Options for the cluster data labels.\n     * @type    {Highcharts.DataLabelsOptions}\n     */\n    dataLabels: {\n        /** @internal */\n        enabled: true,\n        /** @internal */\n        format: '{point.clusterPointsAmount}',\n        /** @internal */\n        verticalAlign: 'middle',\n        /** @internal */\n        align: 'center',\n        /** @internal */\n        style: {\n            color: 'contrast'\n        },\n        /** @internal */\n        inside: true\n    }\n};\nconst tooltip = {\n    /**\n     * The HTML of the cluster point's in the tooltip. Works only with\n     * marker-clusters module and analogously to\n     * [pointFormat](#tooltip.pointFormat).\n     *\n     * The cluster tooltip can be also formatted using\n     * `tooltip.formatter` callback function and `point.isCluster` flag.\n     *\n     * @sample highcharts/marker-clusters/grid\n     *         Format tooltip for cluster points.\n     *\n     * @sample maps/marker-clusters/europe/\n     *         Format tooltip for clusters using tooltip.formatter\n     *\n     * @type      {string}\n     * @default   Clustered points: {point.clusterPointsAmount}\n     * @apioption tooltip.clusterFormat\n     */\n    clusterFormat: '<span>Clustered points: ' +\n        '{point.clusterPointsAmount}</span><br/>'\n};\n/* *\n *\n *  Default Export\n *\n * */\nconst MarkerClusterDefaults = {\n    cluster,\n    tooltip\n};\n/* harmony default export */ const MarkerClusters_MarkerClusterDefaults = (MarkerClusterDefaults);\n\n;// ./code/es-modules/Data/DataTableCore.js\n/* *\n *\n *  (c) 2009-2024 Highsoft AS\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n *  Authors:\n *  - Sophie Bremer\n *  - Gøran Slettemark\n *  - Torstein Hønsi\n *\n * */\n\n\nconst { fireEvent, isArray, objectEach, uniqueKey } = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\n/* *\n *\n *  Class\n *\n * */\n/**\n * Class to manage columns and rows in a table structure. It provides methods\n * to add, remove, and manipulate columns and rows, as well as to retrieve data\n * from specific cells.\n *\n * @class\n * @name Highcharts.DataTable\n *\n * @param {Highcharts.DataTableOptions} [options]\n * Options to initialize the new DataTable instance.\n */\nclass DataTableCore {\n    /**\n     * Constructs an instance of the DataTable class.\n     *\n     * @example\n     * const dataTable = new Highcharts.DataTableCore({\n     *   columns: {\n     *     year: [2020, 2021, 2022, 2023],\n     *     cost: [11, 13, 12, 14],\n     *     revenue: [12, 15, 14, 18]\n     *   }\n     * });\n\n     *\n     * @param {Highcharts.DataTableOptions} [options]\n     * Options to initialize the new DataTable instance.\n     */\n    constructor(options = {}) {\n        /**\n         * Whether the ID was automatic generated or given in the constructor.\n         *\n         * @name Highcharts.DataTable#autoId\n         * @type {boolean}\n         */\n        this.autoId = !options.id;\n        this.columns = {};\n        /**\n         * ID of the table for indentification purposes.\n         *\n         * @name Highcharts.DataTable#id\n         * @type {string}\n         */\n        this.id = (options.id || uniqueKey());\n        this.modified = this;\n        this.rowCount = 0;\n        this.versionTag = uniqueKey();\n        let rowCount = 0;\n        objectEach(options.columns || {}, (column, columnName) => {\n            this.columns[columnName] = column.slice();\n            rowCount = Math.max(rowCount, column.length);\n        });\n        this.applyRowCount(rowCount);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Applies a row count to the table by setting the `rowCount` property and\n     * adjusting the length of all columns.\n     *\n     * @private\n     * @param {number} rowCount The new row count.\n     */\n    applyRowCount(rowCount) {\n        this.rowCount = rowCount;\n        objectEach(this.columns, (column) => {\n            if (isArray(column)) { // Not on typed array\n                column.length = rowCount;\n            }\n        });\n    }\n    /**\n     * Fetches the given column by the canonical column name. Simplified version\n     * of the full `DataTable.getRow` method, always returning by reference.\n     *\n     * @param {string} columnName\n     * Name of the column to get.\n     *\n     * @return {Highcharts.DataTableColumn|undefined}\n     * A copy of the column, or `undefined` if not found.\n     */\n    getColumn(columnName, \n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    asReference) {\n        return this.columns[columnName];\n    }\n    /**\n     * Retrieves all or the given columns. Simplified version of the full\n     * `DataTable.getColumns` method, always returning by reference.\n     *\n     * @param {Array<string>} [columnNames]\n     * Column names to retrieve.\n     *\n     * @return {Highcharts.DataTableColumnCollection}\n     * Collection of columns. If a requested column was not found, it is\n     * `undefined`.\n     */\n    getColumns(columnNames, \n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    asReference) {\n        return (columnNames || Object.keys(this.columns)).reduce((columns, columnName) => {\n            columns[columnName] = this.columns[columnName];\n            return columns;\n        }, {});\n    }\n    /**\n     * Retrieves the row at a given index.\n     *\n     * @param {number} rowIndex\n     * Row index to retrieve. First row has index 0.\n     *\n     * @param {Array<string>} [columnNames]\n     * Column names to retrieve.\n     *\n     * @return {Record<string, number|string|undefined>|undefined}\n     * Returns the row values, or `undefined` if not found.\n     */\n    getRow(rowIndex, columnNames) {\n        return (columnNames || Object.keys(this.columns)).map((key) => this.columns[key]?.[rowIndex]);\n    }\n    /**\n     * Sets cell values for a column. Will insert a new column, if not found.\n     *\n     * @param {string} columnName\n     * Column name to set.\n     *\n     * @param {Highcharts.DataTableColumn} [column]\n     * Values to set in the column.\n     *\n     * @param {number} [rowIndex=0]\n     * Index of the first row to change. (Default: 0)\n     *\n     * @param {Record<string, (boolean|number|string|null|undefined)>} [eventDetail]\n     * Custom information for pending events.\n     *\n     * @emits #setColumns\n     * @emits #afterSetColumns\n     */\n    setColumn(columnName, column = [], rowIndex = 0, eventDetail) {\n        this.setColumns({ [columnName]: column }, rowIndex, eventDetail);\n    }\n    /**\n     * * Sets cell values for multiple columns. Will insert new columns, if not\n     * found. Simplified version of the full `DataTable.setColumns`, limited to\n     * full replacement of the columns (undefined `rowIndex`).\n     *\n     * @param {Highcharts.DataTableColumnCollection} columns\n     * Columns as a collection, where the keys are the column names.\n     *\n     * @param {number} [rowIndex]\n     * Index of the first row to change. Keep undefined to reset.\n     *\n     * @param {Record<string, (boolean|number|string|null|undefined)>} [eventDetail]\n     * Custom information for pending events.\n     *\n     * @emits #setColumns\n     * @emits #afterSetColumns\n     */\n    setColumns(columns, rowIndex, eventDetail) {\n        let rowCount = this.rowCount;\n        objectEach(columns, (column, columnName) => {\n            this.columns[columnName] = column.slice();\n            rowCount = column.length;\n        });\n        this.applyRowCount(rowCount);\n        if (!eventDetail?.silent) {\n            fireEvent(this, 'afterSetColumns');\n            this.versionTag = uniqueKey();\n        }\n    }\n    /**\n     * Sets cell values of a row. Will insert a new row if no index was\n     * provided, or if the index is higher than the total number of table rows.\n     * A simplified version of the full `DateTable.setRow`, limited to objects.\n     *\n     * @param {Record<string, number|string|undefined>} row\n     * Cell values to set.\n     *\n     * @param {number} [rowIndex]\n     * Index of the row to set. Leave `undefind` to add as a new row.\n     *\n     * @param {boolean} [insert]\n     * Whether to insert the row at the given index, or to overwrite the row.\n     *\n     * @param {Record<string, (boolean|number|string|null|undefined)>} [eventDetail]\n     * Custom information for pending events.\n     *\n     * @emits #afterSetRows\n     */\n    setRow(row, rowIndex = this.rowCount, insert, eventDetail) {\n        const { columns } = this, indexRowCount = insert ? this.rowCount + 1 : rowIndex + 1;\n        objectEach(row, (cellValue, columnName) => {\n            const column = columns[columnName] ||\n                eventDetail?.addColumns !== false && new Array(indexRowCount);\n            if (column) {\n                if (insert) {\n                    column.splice(rowIndex, 0, cellValue);\n                }\n                else {\n                    column[rowIndex] = cellValue;\n                }\n                columns[columnName] = column;\n            }\n        });\n        if (indexRowCount > this.rowCount) {\n            this.applyRowCount(indexRowCount);\n        }\n        if (!eventDetail?.silent) {\n            fireEvent(this, 'afterSetRows');\n            this.versionTag = uniqueKey();\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\n/* harmony default export */ const Data_DataTableCore = (DataTableCore);\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * A column of values in a data table.\n * @typedef {Array<boolean|null|number|string|undefined>} Highcharts.DataTableColumn\n */ /**\n* A collection of data table columns defined by a object where the key is the\n* column name and the value is an array of the column values.\n* @typedef {Record<string, Highcharts.DataTableColumn>} Highcharts.DataTableColumnCollection\n*/\n/**\n * Options for the `DataTable` or `DataTableCore` classes.\n * @interface Highcharts.DataTableOptions\n */ /**\n* The column options for the data table. The columns are defined by an object\n* where the key is the column ID and the value is an array of the column\n* values.\n*\n* @name Highcharts.DataTableOptions.columns\n* @type {Highcharts.DataTableColumnCollection|undefined}\n*/ /**\n* Custom ID to identify the new DataTable instance.\n*\n* @name Highcharts.DataTableOptions.id\n* @type {string|undefined}\n*/\n(''); // Keeps doclets above in JS file\n\n;// ./code/es-modules/Extensions/MarkerClusters/MarkerClusterScatter.js\n/* *\n *\n *  Marker clusters module.\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  Author: Wojciech Chmiel\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animObject } = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\n\n\nconst { cluster: clusterDefaults } = MarkerClusters_MarkerClusterDefaults;\n\nconst { addEvent, defined, error, isArray: MarkerClusterScatter_isArray, isFunction, isObject, isNumber, merge, objectEach: MarkerClusterScatter_objectEach, relativeLength, syncTimeout } = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\n/* *\n *\n *  Constants\n *\n * */\nconst markerClusterAlgorithms = {\n    grid: function (dataX, dataY, dataIndexes, options) {\n        const series = this, grid = {}, gridOffset = series.getGridOffset(), scaledGridSize = series.getScaledGridSize(options);\n        let x, y, gridX, gridY, key, i;\n        for (i = 0; i < dataX.length; i++) {\n            const p = valuesToPixels(series, { x: dataX[i], y: dataY[i] });\n            x = p.x - gridOffset.plotLeft;\n            y = p.y - gridOffset.plotTop;\n            gridX = Math.floor(x / scaledGridSize);\n            gridY = Math.floor(y / scaledGridSize);\n            key = gridY + ':' + gridX;\n            grid[key] ?? (grid[key] = []);\n            grid[key].push({\n                dataIndex: dataIndexes[i],\n                x: dataX[i],\n                y: dataY[i]\n            });\n        }\n        return grid;\n    },\n    kmeans: function (dataX, dataY, dataIndexes, options) {\n        const series = this, clusters = [], noise = [], group = {}, pointMaxDistance = options.processedDistance ||\n            clusterDefaults.layoutAlgorithm.distance, iterations = options.iterations, \n        // Max pixel difference beetwen new and old cluster position.\n        maxClusterShift = 1;\n        let currentIteration = 0, repeat = true, pointX = 0, pointY = 0, tempPos, pointClusterDistance = [];\n        options.processedGridSize = options.processedDistance;\n        // Use grid method to get groupedData object.\n        const groupedData = series.markerClusterAlgorithms ?\n            series.markerClusterAlgorithms.grid.call(series, dataX, dataY, dataIndexes, options) : {};\n        // Find clusters amount and its start positions\n        // based on grid grouped data.\n        for (const key in groupedData) {\n            if (groupedData[key].length > 1) {\n                tempPos = getClusterPosition(groupedData[key]);\n                clusters.push({\n                    posX: tempPos.x,\n                    posY: tempPos.y,\n                    oldX: 0,\n                    oldY: 0,\n                    startPointsLen: groupedData[key].length,\n                    points: []\n                });\n            }\n        }\n        // Start kmeans iteration process.\n        while (repeat) {\n            for (const c of clusters) {\n                c.points.length = 0;\n            }\n            noise.length = 0;\n            for (let i = 0; i < dataX.length; i++) {\n                pointX = dataX[i];\n                pointY = dataY[i];\n                pointClusterDistance = series.getClusterDistancesFromPoint(clusters, pointX, pointY);\n                if (pointClusterDistance.length &&\n                    pointClusterDistance[0].distance < pointMaxDistance) {\n                    clusters[pointClusterDistance[0].clusterIndex].points.push({\n                        x: pointX,\n                        y: pointY,\n                        dataIndex: dataIndexes[i]\n                    });\n                }\n                else {\n                    noise.push({\n                        x: pointX,\n                        y: pointY,\n                        dataIndex: dataIndexes[i]\n                    });\n                }\n            }\n            // When cluster points array has only one point the\n            // point should be classified again.\n            for (let i = 0; i < clusters.length; i++) {\n                if (clusters[i].points.length === 1) {\n                    pointClusterDistance = series.getClusterDistancesFromPoint(clusters, clusters[i].points[0].x, clusters[i].points[0].y);\n                    if (pointClusterDistance[1].distance < pointMaxDistance) {\n                        // Add point to the next closest cluster.\n                        clusters[pointClusterDistance[1].clusterIndex].points\n                            .push(clusters[i].points[0]);\n                        // Clear points array.\n                        clusters[pointClusterDistance[0].clusterIndex]\n                            .points.length = 0;\n                    }\n                }\n            }\n            // Compute a new clusters position and check if it\n            // is different than the old one.\n            repeat = false;\n            for (let i = 0; i < clusters.length; i++) {\n                tempPos = getClusterPosition(clusters[i].points);\n                clusters[i].oldX = clusters[i].posX;\n                clusters[i].oldY = clusters[i].posY;\n                clusters[i].posX = tempPos.x;\n                clusters[i].posY = tempPos.y;\n                // Repeat the algorithm if at least one cluster\n                // is shifted more than maxClusterShift property.\n                if (clusters[i].posX > clusters[i].oldX + maxClusterShift ||\n                    clusters[i].posX < clusters[i].oldX - maxClusterShift ||\n                    clusters[i].posY > clusters[i].oldY + maxClusterShift ||\n                    clusters[i].posY < clusters[i].oldY - maxClusterShift) {\n                    repeat = true;\n                }\n            }\n            // If iterations property is set repeat the algorithm\n            // specified amount of times.\n            if (iterations) {\n                repeat = currentIteration < iterations - 1;\n            }\n            currentIteration++;\n        }\n        for (let i = 0, iEnd = clusters.length; i < iEnd; ++i) {\n            group['cluster' + i] = clusters[i].points;\n        }\n        for (let i = 0, iEnd = noise.length; i < iEnd; ++i) {\n            group['noise' + i] = [noise[i]];\n        }\n        return group;\n    },\n    optimizedKmeans: function (processedXData, processedYData, dataIndexes, options) {\n        const series = this, pointMaxDistance = options.processedDistance ||\n            clusterDefaults.layoutAlgorithm.gridSize, extremes = series.getRealExtremes(), clusterMarkerOptions = (series.options.cluster || {}).marker;\n        let distance, group = {}, offset, radius;\n        if (!series.markerClusterInfo || (series.initMaxX && series.initMaxX < extremes.maxX ||\n            series.initMinX && series.initMinX > extremes.minX ||\n            series.initMaxY && series.initMaxY < extremes.maxY ||\n            series.initMinY && series.initMinY > extremes.minY)) {\n            series.initMaxX = extremes.maxX;\n            series.initMinX = extremes.minX;\n            series.initMaxY = extremes.maxY;\n            series.initMinY = extremes.minY;\n            group = series.markerClusterAlgorithms ?\n                series.markerClusterAlgorithms.kmeans.call(series, processedXData, processedYData, dataIndexes, options) : {};\n            series.baseClusters = null;\n        }\n        else {\n            series.baseClusters ?? (series.baseClusters = {\n                clusters: series.markerClusterInfo.clusters,\n                noise: series.markerClusterInfo.noise\n            });\n            for (const cluster of series.baseClusters.clusters) {\n                cluster.pointsOutside = [];\n                cluster.pointsInside = [];\n                for (const dataPoint of cluster.data) {\n                    const dataPointPx = valuesToPixels(series, dataPoint), clusterPx = valuesToPixels(series, cluster);\n                    distance = Math.sqrt(Math.pow(dataPointPx.x - clusterPx.x, 2) +\n                        Math.pow(dataPointPx.y - clusterPx.y, 2));\n                    if (cluster.clusterZone?.marker?.radius) {\n                        radius = cluster.clusterZone.marker.radius;\n                    }\n                    else if (clusterMarkerOptions?.radius) {\n                        radius = clusterMarkerOptions.radius;\n                    }\n                    else {\n                        radius = clusterDefaults.marker.radius;\n                    }\n                    offset = pointMaxDistance - radius >= 0 ?\n                        pointMaxDistance - radius : radius;\n                    if (distance > radius + offset &&\n                        defined(cluster.pointsOutside)) {\n                        cluster.pointsOutside.push(dataPoint);\n                    }\n                    else if (defined(cluster.pointsInside)) {\n                        cluster.pointsInside.push(dataPoint);\n                    }\n                }\n                if (cluster.pointsInside.length) {\n                    group[cluster.id] = cluster.pointsInside;\n                }\n                let i = 0;\n                for (const p of cluster.pointsOutside) {\n                    group[cluster.id + '_noise' + i++] = [p];\n                }\n            }\n            for (const noise of series.baseClusters.noise) {\n                group[noise.id] = noise.data;\n            }\n        }\n        return group;\n    }\n};\n/* *\n *\n *  Variables\n *\n * */\nlet baseGeneratePoints, \n/**\n * Points that ids are included in the oldPointsStateId array are hidden\n * before animation. Other ones are destroyed.\n * @private\n */\noldPointsStateId = [], stateIdCounter = 0;\n/* *\n *\n *  Functions\n *\n * */\n/** @private */\nfunction compose(highchartsDefaultOptions, ScatterSeriesClass) {\n    const scatterProto = ScatterSeriesClass.prototype;\n    if (!scatterProto.markerClusterAlgorithms) {\n        baseGeneratePoints = scatterProto.generatePoints;\n        scatterProto.markerClusterAlgorithms = markerClusterAlgorithms;\n        scatterProto.animateClusterPoint = seriesAnimateClusterPoint;\n        scatterProto.destroyClusteredData = seriesDestroyClusteredData;\n        scatterProto.generatePoints = seriesGeneratePoints;\n        scatterProto.getClusterDistancesFromPoint =\n            seriesGetClusterDistancesFromPoint;\n        scatterProto.getClusteredData = seriesGetClusteredData;\n        scatterProto.getGridOffset = seriesGetGridOffset;\n        scatterProto.getPointsState = seriesGetPointsState;\n        scatterProto.getRealExtremes = seriesGetRealExtremes;\n        scatterProto.getScaledGridSize = seriesGetScaledGridSize;\n        scatterProto.hideClusteredData = seriesHideClusteredData;\n        scatterProto.isValidGroupedDataObject = seriesIsValidGroupedDataObject;\n        scatterProto.preventClusterCollisions = seriesPreventClusterCollisions;\n        // Destroy grouped data on series destroy.\n        addEvent(ScatterSeriesClass, 'destroy', scatterProto.destroyClusteredData);\n        if (highchartsDefaultOptions.plotOptions) {\n            highchartsDefaultOptions.plotOptions.series = merge(highchartsDefaultOptions.plotOptions.series, MarkerClusters_MarkerClusterDefaults);\n        }\n    }\n}\n/**\n * Util function.\n * @private\n */\nfunction destroyOldPoints(oldState) {\n    for (const key of Object.keys(oldState)) {\n        oldState[key].point?.destroy?.();\n    }\n}\n/**\n * Util function.\n * @private\n */\nfunction fadeInElement(elem, opacity, animation) {\n    elem.attr({ opacity }).animate({ opacity: 1 }, animation);\n}\n/**\n * Util function.\n * @private\n */\nfunction fadeInNewPointAndDestoryOld(newPointObj, oldPoints, animation, opacity) {\n    // Fade in new point.\n    fadeInStatePoint(newPointObj, opacity, animation, true, true);\n    // Destroy old animated points.\n    for (const p of oldPoints) {\n        p.point?.destroy?.();\n    }\n}\n/**\n * Util function.\n * @private\n */\nfunction fadeInStatePoint(stateObj, opacity, animation, fadeinGraphic, fadeinDataLabel) {\n    if (stateObj.point) {\n        if (fadeinGraphic && stateObj.point.graphic) {\n            stateObj.point.graphic.show();\n            fadeInElement(stateObj.point.graphic, opacity, animation);\n        }\n        if (fadeinDataLabel && stateObj.point.dataLabel) {\n            stateObj.point.dataLabel.show();\n            fadeInElement(stateObj.point.dataLabel, opacity, animation);\n        }\n    }\n}\n/**\n * Util function.\n * @private\n */\nfunction getClusterPosition(points) {\n    const pointsLen = points.length;\n    let sumX = 0, sumY = 0;\n    for (let i = 0; i < pointsLen; i++) {\n        sumX += points[i].x;\n        sumY += points[i].y;\n    }\n    return {\n        x: sumX / pointsLen,\n        y: sumY / pointsLen\n    };\n}\n/**\n * Util function.Prepare array with sorted data objects to be compared in\n * getPointsState method.\n * @private\n */\nfunction getDataState(clusteredData, stateDataLen) {\n    const state = [];\n    state.length = stateDataLen;\n    clusteredData.clusters.forEach(function (cluster) {\n        cluster.data.forEach(function (elem) {\n            state[elem.dataIndex] = elem;\n        });\n    });\n    clusteredData.noise.forEach(function (noise) {\n        state[noise.data[0].dataIndex] = noise.data[0];\n    });\n    return state;\n}\n/**\n * Util function. Generate unique stateId for a state element.\n * @private\n */\nfunction getStateId() {\n    return Math.random().toString(36).substring(2, 7) + '-' + stateIdCounter++;\n}\n/**\n * Util function.\n * @private\n */\nfunction hideStatePoint(stateObj, hideGraphic, hideDataLabel) {\n    if (stateObj.point) {\n        if (hideGraphic && stateObj.point.graphic) {\n            stateObj.point.graphic.hide();\n        }\n        if (hideDataLabel && stateObj.point.dataLabel) {\n            stateObj.point.dataLabel.hide();\n        }\n    }\n}\n/** @private */\nfunction onPointDrillToCluster(event) {\n    const point = event.point || event.target;\n    point.firePointEvent('drillToCluster', event, function (e) {\n        const point = e.point || e.target, series = point.series, { xAxis, yAxis, chart } = series, { inverted, mapView, pointer } = chart, drillToCluster = series.options.cluster?.drillToCluster;\n        if (drillToCluster && point.clusteredData) {\n            const sortedDataX = point.clusteredData\n                .map((data) => data.x)\n                .sort((a, b) => a - b), sortedDataY = point.clusteredData\n                .map((data) => data.y)\n                .sort((a, b) => a - b), minX = sortedDataX[0], maxX = sortedDataX[sortedDataX.length - 1], minY = sortedDataY[0], maxY = sortedDataY[sortedDataY.length - 1], offsetX = Math.abs((maxX - minX) * 0.1), offsetY = Math.abs((maxY - minY) * 0.1), x1 = Math.min(minX, maxX) - offsetX, x2 = Math.max(minX, maxX) + offsetX, y1 = Math.min(minY, maxY) - offsetY, y2 = Math.max(minY, maxY) + offsetY;\n            if (mapView) {\n                mapView.fitToBounds({ x1, x2, y1, y2 });\n            }\n            else if (xAxis && yAxis) {\n                let x1Px = xAxis.toPixels(x1), x2Px = xAxis.toPixels(x2), y1Px = yAxis.toPixels(y1), y2Px = yAxis.toPixels(y2);\n                if (inverted) {\n                    [x1Px, x2Px, y1Px, y2Px] = [y1Px, y2Px, x1Px, x2Px];\n                }\n                if (x1Px > x2Px) {\n                    [x1Px, x2Px] = [x2Px, x1Px];\n                }\n                if (y1Px > y2Px) {\n                    [y1Px, y2Px] = [y2Px, y1Px];\n                }\n                if (pointer) {\n                    pointer.zoomX = true;\n                    pointer.zoomY = true;\n                }\n                chart.transform({\n                    from: {\n                        x: x1Px,\n                        y: y1Px,\n                        width: x2Px - x1Px,\n                        height: y2Px - y1Px\n                    }\n                });\n            }\n        }\n    });\n}\n/**\n * Util function.\n * @private\n */\nfunction pixelsToValues(series, pos) {\n    const { chart, xAxis, yAxis } = series;\n    if (chart.mapView) {\n        return chart.mapView.pixelsToProjectedUnits(pos);\n    }\n    return {\n        x: xAxis ? xAxis.toValue(pos.x) : 0,\n        y: yAxis ? yAxis.toValue(pos.y) : 0\n    };\n}\n/** @private */\nfunction seriesAnimateClusterPoint(clusterObj) {\n    const series = this, chart = series.chart, mapView = chart.mapView, animation = animObject(series.options.cluster?.animation), animDuration = animation.duration || 500, pointsState = series.markerClusterInfo?.pointsState, newState = pointsState?.newState, oldState = pointsState?.oldState, oldPoints = [];\n    let parentId, oldPointObj, newPointObj, newPointBBox, offset = 0, newX = 0, newY = 0, isOldPointGrahic = false, isCbHandled = false;\n    if (oldState && newState) {\n        newPointObj = newState[clusterObj.stateId];\n        const newPos = valuesToPixels(series, newPointObj);\n        newX = newPos.x - (mapView ? 0 : chart.plotLeft);\n        newY = newPos.y - (mapView ? 0 : chart.plotTop);\n        // Point has one ancestor.\n        if (newPointObj.parentsId.length === 1) {\n            parentId = newState?.[clusterObj.stateId].parentsId[0];\n            oldPointObj = oldState[parentId];\n            // If old and new positions are the same do not animate.\n            if (newPointObj.point?.graphic &&\n                oldPointObj.point?.plotX &&\n                oldPointObj.point.plotY &&\n                (oldPointObj.point.plotX !== newPointObj.point.plotX ||\n                    oldPointObj.point.plotY !== newPointObj.point.plotY)) {\n                newPointBBox = newPointObj.point.graphic.getBBox();\n                // Marker image does not have the offset (#14342).\n                offset = newPointObj.point.graphic?.isImg ?\n                    0 : newPointBBox.width / 2;\n                newPointObj.point.graphic.attr({\n                    x: oldPointObj.point.plotX - offset,\n                    y: oldPointObj.point.plotY - offset\n                });\n                newPointObj.point.graphic.animate({\n                    x: newX - (newPointObj.point.graphic.radius || 0),\n                    y: newY - (newPointObj.point.graphic.radius || 0)\n                }, animation, function () {\n                    isCbHandled = true;\n                    // Destroy old point.\n                    oldPointObj.point?.destroy?.();\n                });\n                // Data label animation.\n                if (newPointObj.point.dataLabel?.alignAttr &&\n                    oldPointObj.point.dataLabel?.alignAttr) {\n                    newPointObj.point.dataLabel.attr({\n                        x: oldPointObj.point.dataLabel.alignAttr.x,\n                        y: oldPointObj.point.dataLabel.alignAttr.y\n                    });\n                    newPointObj.point.dataLabel.animate({\n                        x: newPointObj.point.dataLabel.alignAttr.x,\n                        y: newPointObj.point.dataLabel.alignAttr.y\n                    }, animation);\n                }\n            }\n        }\n        else if (newPointObj.parentsId.length === 0) {\n            // Point has no ancestors - new point.\n            // Hide new point.\n            hideStatePoint(newPointObj, true, true);\n            syncTimeout(function () {\n                // Fade in new point.\n                fadeInStatePoint(newPointObj, 0.1, animation, true, true);\n            }, animDuration / 2);\n        }\n        else {\n            // Point has many ancestors.\n            // Hide new point before animation.\n            hideStatePoint(newPointObj, true, true);\n            newPointObj.parentsId.forEach(function (elem) {\n                if (oldState?.[elem]) {\n                    oldPointObj = oldState[elem];\n                    oldPoints.push(oldPointObj);\n                    if (oldPointObj.point?.graphic) {\n                        isOldPointGrahic = true;\n                        oldPointObj.point.graphic.show();\n                        oldPointObj.point.graphic.animate({\n                            x: newX - (oldPointObj.point.graphic.radius || 0),\n                            y: newY - (oldPointObj.point.graphic.radius || 0),\n                            opacity: 0.4\n                        }, animation, function () {\n                            isCbHandled = true;\n                            fadeInNewPointAndDestoryOld(newPointObj, oldPoints, animation, 0.7);\n                        });\n                        if (oldPointObj.point.dataLabel &&\n                            oldPointObj.point.dataLabel.y !== -9999 &&\n                            newPointObj.point?.dataLabel?.alignAttr) {\n                            oldPointObj.point.dataLabel.show();\n                            oldPointObj.point.dataLabel.animate({\n                                x: newPointObj.point.dataLabel.alignAttr.x,\n                                y: newPointObj.point.dataLabel.alignAttr.y,\n                                opacity: 0.4\n                            }, animation);\n                        }\n                    }\n                }\n            });\n            // Make sure point is faded in.\n            syncTimeout(function () {\n                if (!isCbHandled) {\n                    fadeInNewPointAndDestoryOld(newPointObj, oldPoints, animation, 0.85);\n                }\n            }, animDuration);\n            if (!isOldPointGrahic) {\n                syncTimeout(function () {\n                    fadeInNewPointAndDestoryOld(newPointObj, oldPoints, animation, 0.1);\n                }, animDuration / 2);\n            }\n        }\n    }\n}\n/**\n * Destroy clustered data points.\n * @private\n */\nfunction seriesDestroyClusteredData() {\n    // Clear previous groups.\n    this.markerClusterSeriesData?.forEach((point) => {\n        point?.destroy?.();\n    });\n    this.markerClusterSeriesData = null;\n}\n/**\n * Override the generatePoints method by adding a reference to grouped data.\n * @private\n */\nfunction seriesGeneratePoints() {\n    const series = this, { chart } = series, mapView = chart.mapView, xData = series.getColumn('x'), yData = series.getColumn('y'), clusterOptions = series.options.cluster, realExtremes = series.getRealExtremes(), visibleXData = [], visibleYData = [], visibleDataIndexes = [];\n    let oldPointsState, oldDataLen, oldMarkerClusterInfo, kmeansThreshold, cropDataOffsetX, cropDataOffsetY, seriesMinX, seriesMaxX, seriesMinY, seriesMaxY, type, algorithm, clusteredData, groupedData, layoutAlgOptions, point;\n    // For map point series, we need to resolve lon, lat and geometry options\n    // and project them on the plane in order to get x and y. In the regular\n    // series flow, this is not done until the `translate` method because the\n    // resulting [x, y] position depends on inset positions in the MapView.\n    if (mapView && series.is('mappoint') && xData && yData) {\n        series.options.data?.forEach((p, i) => {\n            const xy = series.projectPoint(p);\n            if (xy) {\n                xData[i] = xy.x;\n                yData[i] = xy.y;\n            }\n        });\n    }\n    if (clusterOptions?.enabled &&\n        xData?.length &&\n        yData?.length &&\n        !chart.polar) {\n        type = clusterOptions.layoutAlgorithm.type;\n        layoutAlgOptions = clusterOptions.layoutAlgorithm;\n        // Get processed algorithm properties.\n        layoutAlgOptions.processedGridSize = relativeLength(layoutAlgOptions.gridSize ||\n            clusterDefaults.layoutAlgorithm.gridSize, chart.plotWidth);\n        layoutAlgOptions.processedDistance = relativeLength(layoutAlgOptions.distance ||\n            clusterDefaults.layoutAlgorithm.distance, chart.plotWidth);\n        kmeansThreshold = layoutAlgOptions.kmeansThreshold ||\n            clusterDefaults.layoutAlgorithm.kmeansThreshold;\n        // Offset to prevent cluster size changes.\n        const halfGrid = layoutAlgOptions.processedGridSize / 2, p1 = pixelsToValues(series, { x: 0, y: 0 }), p2 = pixelsToValues(series, { x: halfGrid, y: halfGrid });\n        cropDataOffsetX = Math.abs(p1.x - p2.x);\n        cropDataOffsetY = Math.abs(p1.y - p2.y);\n        // Get only visible data.\n        for (let i = 0; i < xData.length; i++) {\n            if (!series.dataMaxX) {\n                if (!defined(seriesMaxX) ||\n                    !defined(seriesMinX) ||\n                    !defined(seriesMaxY) ||\n                    !defined(seriesMinY)) {\n                    seriesMaxX = seriesMinX = xData[i];\n                    seriesMaxY = seriesMinY = yData[i];\n                }\n                else if (isNumber(yData[i]) &&\n                    isNumber(seriesMaxY) &&\n                    isNumber(seriesMinY)) {\n                    seriesMaxX = Math.max(xData[i], seriesMaxX);\n                    seriesMinX = Math.min(xData[i], seriesMinX);\n                    seriesMaxY = Math.max(yData[i] || seriesMaxY, seriesMaxY);\n                    seriesMinY = Math.min(yData[i] || seriesMinY, seriesMinY);\n                }\n            }\n            // Crop data to visible ones with appropriate offset to prevent\n            // cluster size changes on the edge of the plot area.\n            if (xData[i] >= (realExtremes.minX - cropDataOffsetX) &&\n                xData[i] <= (realExtremes.maxX + cropDataOffsetX) &&\n                (yData[i] || realExtremes.minY) >=\n                    (realExtremes.minY - cropDataOffsetY) &&\n                (yData[i] || realExtremes.maxY) <=\n                    (realExtremes.maxY + cropDataOffsetY)) {\n                visibleXData.push(xData[i]);\n                visibleYData.push(yData[i]);\n                visibleDataIndexes.push(i);\n            }\n        }\n        // Save data max values.\n        if (defined(seriesMaxX) && defined(seriesMinX) &&\n            isNumber(seriesMaxY) && isNumber(seriesMinY)) {\n            series.dataMaxX = seriesMaxX;\n            series.dataMinX = seriesMinX;\n            series.dataMaxY = seriesMaxY;\n            series.dataMinY = seriesMinY;\n        }\n        if (isFunction(type)) {\n            algorithm = type;\n        }\n        else if (series.markerClusterAlgorithms) {\n            if (type && series.markerClusterAlgorithms[type]) {\n                algorithm = series.markerClusterAlgorithms[type];\n            }\n            else {\n                algorithm = visibleXData.length < kmeansThreshold ?\n                    series.markerClusterAlgorithms.kmeans :\n                    series.markerClusterAlgorithms.grid;\n            }\n        }\n        else {\n            algorithm = () => false;\n        }\n        groupedData = algorithm.call(this, visibleXData, visibleYData, visibleDataIndexes, layoutAlgOptions);\n        clusteredData = groupedData ? series.getClusteredData(groupedData, clusterOptions) : groupedData;\n        // When animation is enabled get old points state.\n        if (clusterOptions.animation &&\n            series.markerClusterInfo?.pointsState?.oldState) {\n            // Destroy old points.\n            destroyOldPoints(series.markerClusterInfo.pointsState.oldState);\n            oldPointsState = series.markerClusterInfo.pointsState.newState;\n        }\n        else {\n            oldPointsState = {};\n        }\n        // Save points old state info.\n        oldDataLen = xData.length;\n        oldMarkerClusterInfo = series.markerClusterInfo;\n        if (clusteredData) {\n            series.dataTable.modified = new Data_DataTableCore({\n                columns: {\n                    x: clusteredData.groupedXData,\n                    y: clusteredData.groupedYData\n                }\n            });\n            series.hasGroupedData = true;\n            series.markerClusterInfo = clusteredData;\n            series.groupMap = clusteredData.groupMap;\n        }\n        baseGeneratePoints.apply(this);\n        if (clusteredData && series.markerClusterInfo) {\n            // Mark cluster points. Safe point reference in the cluster object.\n            series.markerClusterInfo.clusters?.forEach((cluster) => {\n                point = series.points[cluster.index];\n                point.isCluster = true;\n                point.clusteredData = cluster.data;\n                point.clusterPointsAmount = cluster.data.length;\n                cluster.point = point;\n                // Add zoom to cluster range.\n                addEvent(point, 'click', onPointDrillToCluster);\n            });\n            // Safe point reference in the noise object.\n            series.markerClusterInfo.noise?.forEach((noise) => {\n                noise.point = series.points[noise.index];\n            });\n            // When animation is enabled save points state.\n            if (clusterOptions.animation &&\n                series.markerClusterInfo) {\n                series.markerClusterInfo.pointsState = {\n                    oldState: oldPointsState,\n                    newState: series.getPointsState(clusteredData, oldMarkerClusterInfo, oldDataLen)\n                };\n            }\n            // Record grouped data in order to let it be destroyed the next time\n            // processData runs.\n            if (!clusterOptions.animation) {\n                this.destroyClusteredData();\n            }\n            else {\n                this.hideClusteredData();\n            }\n            this.markerClusterSeriesData =\n                this.hasGroupedData ? this.points : null;\n        }\n    }\n    else {\n        baseGeneratePoints.apply(this);\n    }\n}\n/** @private */\nfunction seriesGetClusterDistancesFromPoint(clusters, pointX, pointY) {\n    const pointClusterDistance = [];\n    for (let clusterIndex = 0; clusterIndex < clusters.length; clusterIndex++) {\n        const p1 = valuesToPixels(this, { x: pointX, y: pointY }), p2 = valuesToPixels(this, {\n            x: clusters[clusterIndex].posX,\n            y: clusters[clusterIndex].posY\n        }), distance = Math.sqrt(Math.pow(p1.x - p2.x, 2) +\n            Math.pow(p1.y - p2.y, 2));\n        pointClusterDistance.push({ clusterIndex, distance });\n    }\n    return pointClusterDistance.sort((a, b) => a.distance - b.distance);\n}\n/** @private */\nfunction seriesGetClusteredData(groupedData, options) {\n    const series = this, data = series.options.data, groupedXData = [], groupedYData = [], clusters = [], // Container for clusters.\n    noise = [], // Container for points not belonging to any cluster.\n    groupMap = [], \n    // Prevent minimumClusterSize lower than 2.\n    minimumClusterSize = Math.max(2, options.minimumClusterSize || 2);\n    let index = 0, stateId, point, points, pointUserOptions, pointsLen, marker, clusterPos, pointOptions, clusterTempPos, zoneOptions, clusterZone, clusterZoneClassName;\n    // Check if groupedData is valid when user uses a custom algorithm.\n    if (isFunction(options.layoutAlgorithm.type) &&\n        !series.isValidGroupedDataObject(groupedData)) {\n        error('Highcharts marker-clusters module: ' +\n            'The custom algorithm result is not valid!', false, series.chart);\n        return false;\n    }\n    for (const k in groupedData) {\n        if (groupedData[k].length >= minimumClusterSize) {\n            points = groupedData[k];\n            stateId = getStateId();\n            pointsLen = points.length;\n            // Get zone options for cluster.\n            if (options.zones) {\n                for (let i = 0; i < options.zones.length; i++) {\n                    if (pointsLen >= options.zones[i].from &&\n                        pointsLen <= options.zones[i].to) {\n                        clusterZone = options.zones[i];\n                        clusterZone.zoneIndex = i;\n                        zoneOptions = options.zones[i].marker;\n                        clusterZoneClassName = options.zones[i].className;\n                    }\n                }\n            }\n            clusterTempPos = getClusterPosition(points);\n            if (options.layoutAlgorithm.type === 'grid' &&\n                !options.allowOverlap) {\n                marker = series.options.marker || {};\n                clusterPos = series.preventClusterCollisions({\n                    x: clusterTempPos.x,\n                    y: clusterTempPos.y,\n                    key: k,\n                    groupedData: groupedData,\n                    gridSize: series.getScaledGridSize(options.layoutAlgorithm),\n                    defaultRadius: marker.radius || 3 + (marker.lineWidth || 0),\n                    clusterRadius: (zoneOptions && zoneOptions.radius) ?\n                        zoneOptions.radius :\n                        (options.marker || {}).radius ||\n                            clusterDefaults.marker.radius\n                });\n            }\n            else {\n                clusterPos = {\n                    x: clusterTempPos.x,\n                    y: clusterTempPos.y\n                };\n            }\n            for (let i = 0; i < pointsLen; i++) {\n                points[i].parentStateId = stateId;\n            }\n            clusters.push({\n                x: clusterPos.x,\n                y: clusterPos.y,\n                id: k,\n                stateId,\n                index,\n                data: points,\n                clusterZone,\n                clusterZoneClassName\n            });\n            groupedXData.push(clusterPos.x);\n            groupedYData.push(clusterPos.y);\n            groupMap.push({\n                options: {\n                    formatPrefix: 'cluster',\n                    dataLabels: options.dataLabels,\n                    marker: merge(options.marker, {\n                        states: options.states\n                    }, zoneOptions || {})\n                }\n            });\n            // Save cluster data points options.\n            if (data?.length) {\n                for (let i = 0; i < pointsLen; i++) {\n                    if (isObject(data[points[i].dataIndex])) {\n                        points[i].options = data[points[i].dataIndex];\n                    }\n                }\n            }\n            index++;\n            zoneOptions = null;\n        }\n        else {\n            for (let i = 0; i < groupedData[k].length; i++) {\n                // Points not belonging to any cluster.\n                point = groupedData[k][i];\n                stateId = getStateId();\n                pointOptions = null;\n                pointUserOptions = data?.[point.dataIndex];\n                groupedXData.push(point.x);\n                groupedYData.push(point.y);\n                point.parentStateId = stateId;\n                noise.push({\n                    x: point.x,\n                    y: point.y,\n                    id: k,\n                    stateId,\n                    index,\n                    data: groupedData[k]\n                });\n                if (pointUserOptions &&\n                    typeof pointUserOptions === 'object' &&\n                    !MarkerClusterScatter_isArray(pointUserOptions)) {\n                    pointOptions = merge(pointUserOptions, { x: point.x, y: point.y });\n                }\n                else {\n                    pointOptions = {\n                        userOptions: pointUserOptions,\n                        x: point.x,\n                        y: point.y\n                    };\n                }\n                groupMap.push({ options: pointOptions });\n                index++;\n            }\n        }\n    }\n    return {\n        clusters,\n        noise,\n        groupedXData,\n        groupedYData,\n        groupMap\n    };\n}\n/** @private */\nfunction seriesGetGridOffset() {\n    const series = this, { chart, xAxis, yAxis } = series;\n    let plotLeft = 0, plotTop = 0;\n    if (xAxis && series.dataMinX && series.dataMaxX) {\n        plotLeft = xAxis.reversed ?\n            xAxis.toPixels(series.dataMaxX) : xAxis.toPixels(series.dataMinX);\n    }\n    else {\n        plotLeft = chart.plotLeft;\n    }\n    if (yAxis && series.dataMinY && series.dataMaxY) {\n        plotTop = yAxis.reversed ?\n            yAxis.toPixels(series.dataMinY) : yAxis.toPixels(series.dataMaxY);\n    }\n    else {\n        plotTop = chart.plotTop;\n    }\n    return { plotLeft, plotTop };\n}\n/**\n * Point state used when animation is enabled to compare and bind old points\n * with new ones.\n * @private\n */\nfunction seriesGetPointsState(clusteredData, oldMarkerClusterInfo, dataLength) {\n    const oldDataStateArr = oldMarkerClusterInfo ?\n        getDataState(oldMarkerClusterInfo, dataLength) : [], newDataStateArr = getDataState(clusteredData, dataLength), state = {};\n    // Clear global array before populate with new ids.\n    oldPointsStateId = [];\n    // Build points state structure.\n    clusteredData.clusters.forEach((cluster) => {\n        state[cluster.stateId] = {\n            x: cluster.x,\n            y: cluster.y,\n            id: cluster.stateId,\n            point: cluster.point,\n            parentsId: []\n        };\n    });\n    clusteredData.noise.forEach((noise) => {\n        state[noise.stateId] = {\n            x: noise.x,\n            y: noise.y,\n            id: noise.stateId,\n            point: noise.point,\n            parentsId: []\n        };\n    });\n    let newState, oldState;\n    // Bind new and old state.\n    for (let i = 0; i < newDataStateArr.length; i++) {\n        newState = newDataStateArr[i];\n        oldState = oldDataStateArr[i];\n        if (newState?.parentStateId &&\n            oldState?.parentStateId &&\n            state[newState.parentStateId]?.parentsId.indexOf(oldState.parentStateId) === -1) {\n            state[newState.parentStateId].parentsId.push(oldState.parentStateId);\n            if (oldPointsStateId.indexOf(oldState.parentStateId) === -1) {\n                oldPointsStateId.push(oldState.parentStateId);\n            }\n        }\n    }\n    return state;\n}\n/** @private */\nfunction seriesGetRealExtremes() {\n    const chart = this.chart, x = chart.mapView ? 0 : chart.plotLeft, y = chart.mapView ? 0 : chart.plotTop, p1 = pixelsToValues(this, {\n        x,\n        y\n    }), p2 = pixelsToValues(this, {\n        x: x + chart.plotWidth,\n        y: x + chart.plotHeight\n    }), realMinX = p1.x, realMaxX = p2.x, realMinY = p1.y, realMaxY = p2.y;\n    return {\n        minX: Math.min(realMinX, realMaxX),\n        maxX: Math.max(realMinX, realMaxX),\n        minY: Math.min(realMinY, realMaxY),\n        maxY: Math.max(realMinY, realMaxY)\n    };\n}\n/** @private */\nfunction seriesGetScaledGridSize(options) {\n    const series = this, xAxis = series.xAxis, mapView = series.chart.mapView, processedGridSize = options.processedGridSize ||\n        clusterDefaults.layoutAlgorithm.gridSize;\n    let search = true, k = 1, divider = 1;\n    if (!series.gridValueSize) {\n        if (mapView) {\n            series.gridValueSize = processedGridSize / mapView.getScale();\n        }\n        else {\n            series.gridValueSize = Math.abs(xAxis.toValue(processedGridSize) - xAxis.toValue(0));\n        }\n    }\n    const gridSize = mapView ?\n        series.gridValueSize * mapView.getScale() :\n        xAxis.toPixels(series.gridValueSize) - xAxis.toPixels(0);\n    const scale = +(processedGridSize / gridSize).toFixed(14);\n    // Find the level and its divider.\n    while (search && scale !== 1) {\n        const level = Math.pow(2, k);\n        if (scale > 0.75 && scale < 1.25) {\n            search = false;\n        }\n        else if (scale >= (1 / level) && scale < 2 * (1 / level)) {\n            search = false;\n            divider = level;\n        }\n        else if (scale <= level && scale > level / 2) {\n            search = false;\n            divider = 1 / level;\n        }\n        k++;\n    }\n    return (processedGridSize / divider) / scale;\n}\n/**\n * Hide clustered data points.\n * @private\n */\nfunction seriesHideClusteredData() {\n    const clusteredSeriesData = this.markerClusterSeriesData, oldState = this.markerClusterInfo?.pointsState?.oldState, oldPointsId = oldPointsStateId.map((elem) => oldState?.[elem].point?.id || '');\n    clusteredSeriesData?.forEach((point) => {\n        // If an old point is used in animation hide it, otherwise destroy.\n        if (point &&\n            oldPointsId.indexOf(point.id) !== -1) {\n            if (point.graphic) {\n                point.graphic.hide();\n            }\n            if (point.dataLabel) {\n                point.dataLabel.hide();\n            }\n        }\n        else {\n            point?.destroy?.();\n        }\n    });\n}\n/**\n * Check if user algorithm result is valid groupedDataObject.\n * @private\n */\nfunction seriesIsValidGroupedDataObject(groupedData) {\n    let result = false;\n    if (!isObject(groupedData)) {\n        return false;\n    }\n    MarkerClusterScatter_objectEach(groupedData, (elem) => {\n        result = true;\n        if (!MarkerClusterScatter_isArray(elem) || !elem.length) {\n            result = false;\n            return;\n        }\n        for (let i = 0; i < elem.length; i++) {\n            if (!isObject(elem[i]) || (!elem[i].x || !elem[i].y)) {\n                result = false;\n                return;\n            }\n        }\n    });\n    return result;\n}\n/** @private */\nfunction seriesPreventClusterCollisions(props) {\n    const series = this, [gridY, gridX] = props.key.split(':').map(parseFloat), gridSize = props.gridSize, groupedData = props.groupedData, defaultRadius = props.defaultRadius, clusterRadius = props.clusterRadius, gridXPx = gridX * gridSize, gridYPx = gridY * gridSize, propsPx = valuesToPixels(series, props), gridsToCheckCollision = [], clusterMarkerOptions = series.options.cluster?.marker, zoneOptions = series.options.cluster?.zones, gridOffset = series.getGridOffset();\n    let xPixel = propsPx.x, yPixel = propsPx.y, pointsLen = 0, radius = 0, nextXPixel, nextYPixel, signX, signY, cornerGridX, cornerGridY, j, itemX, itemY, nextClusterPos, maxDist, keys;\n    // Distance to the grid start.\n    xPixel -= gridOffset.plotLeft;\n    yPixel -= gridOffset.plotTop;\n    for (let i = 1; i < 5; i++) {\n        signX = i % 2 ? -1 : 1;\n        signY = i < 3 ? -1 : 1;\n        cornerGridX = Math.floor((xPixel + signX * clusterRadius) / gridSize);\n        cornerGridY = Math.floor((yPixel + signY * clusterRadius) / gridSize);\n        keys = [\n            cornerGridY + ':' + cornerGridX,\n            cornerGridY + ':' + gridX,\n            gridY + ':' + cornerGridX\n        ];\n        for (j = 0; j < keys.length; j++) {\n            if (gridsToCheckCollision.indexOf(keys[j]) === -1 &&\n                keys[j] !== props.key) {\n                gridsToCheckCollision.push(keys[j]);\n            }\n        }\n    }\n    for (const item of gridsToCheckCollision) {\n        if (groupedData[item]) {\n            // Cluster or noise position is already computed.\n            if (!groupedData[item].posX) {\n                nextClusterPos = getClusterPosition(groupedData[item]);\n                groupedData[item].posX = nextClusterPos.x;\n                groupedData[item].posY = nextClusterPos.y;\n            }\n            const pos = valuesToPixels(series, {\n                x: groupedData[item].posX || 0,\n                y: groupedData[item].posY || 0\n            });\n            nextXPixel = pos.x - gridOffset.plotLeft;\n            nextYPixel = pos.y - gridOffset.plotTop;\n            [itemY, itemX] = item.split(':').map(parseFloat);\n            if (zoneOptions) {\n                pointsLen = groupedData[item].length;\n                for (let i = 0; i < zoneOptions.length; i++) {\n                    if (pointsLen >= zoneOptions[i].from &&\n                        pointsLen <= zoneOptions[i].to) {\n                        if (defined(zoneOptions[i].marker?.radius)) {\n                            radius = zoneOptions[i].marker.radius || 0;\n                        }\n                        else if (clusterMarkerOptions?.radius) {\n                            radius = clusterMarkerOptions.radius;\n                        }\n                        else {\n                            radius = clusterDefaults.marker.radius;\n                        }\n                    }\n                }\n            }\n            if (groupedData[item].length > 1 &&\n                radius === 0 &&\n                clusterMarkerOptions?.radius) {\n                radius = clusterMarkerOptions.radius;\n            }\n            else if (groupedData[item].length === 1) {\n                radius = defaultRadius;\n            }\n            maxDist = clusterRadius + radius;\n            radius = 0;\n            if (itemX !== gridX &&\n                Math.abs(xPixel - nextXPixel) < maxDist) {\n                xPixel = itemX - gridX < 0 ? gridXPx + clusterRadius :\n                    gridXPx + gridSize - clusterRadius;\n            }\n            if (itemY !== gridY &&\n                Math.abs(yPixel - nextYPixel) < maxDist) {\n                yPixel = itemY - gridY < 0 ? gridYPx + clusterRadius :\n                    gridYPx + gridSize - clusterRadius;\n            }\n        }\n    }\n    const pos = pixelsToValues(series, {\n        x: xPixel + gridOffset.plotLeft,\n        y: yPixel + gridOffset.plotTop\n    });\n    groupedData[props.key].posX = pos.x;\n    groupedData[props.key].posY = pos.y;\n    return pos;\n}\n/**\n * Util function.\n * @private\n */\nfunction valuesToPixels(series, pos) {\n    const { chart, xAxis, yAxis } = series;\n    if (chart.mapView) {\n        return chart.mapView.projectedUnitsToPixels(pos);\n    }\n    return {\n        x: xAxis ? xAxis.toPixels(pos.x) : 0,\n        y: yAxis ? yAxis.toPixels(pos.y) : 0\n    };\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst MarkerClusterScatter = {\n    compose\n};\n/* harmony default export */ const MarkerClusters_MarkerClusterScatter = (MarkerClusterScatter);\n\n;// ./code/es-modules/Extensions/MarkerClusters/MarkerClusters.js\n/* *\n *\n *  Marker clusters module.\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  Author: Wojciech Chmiel\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n\nconst { animObject: MarkerClusters_animObject } = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\n\nconst { defaultOptions } = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\n\nconst { composed } = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\n\n\n\nconst { addEvent: MarkerClusters_addEvent, defined: MarkerClusters_defined, error: MarkerClusters_error, isFunction: MarkerClusters_isFunction, merge: MarkerClusters_merge, pushUnique, syncTimeout: MarkerClusters_syncTimeout } = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\n/* *\n *\n *  Constants\n *\n * */\n(defaultOptions.plotOptions || {}).series = MarkerClusters_merge((defaultOptions.plotOptions || {}).series, MarkerClusters_MarkerClusterDefaults);\n/* *\n *\n *  Functions\n *\n * */\n/** @private */\nfunction MarkerClusters_compose(AxisClass, ChartClass, highchartsDefaultOptions, SeriesClass) {\n    if (pushUnique(composed, 'MarkerClusters')) {\n        const PointClass = SeriesClass.prototype.pointClass, { scatter: ScatterSeries } = SeriesClass.types;\n        MarkerClusters_addEvent(AxisClass, 'setExtremes', onAxisSetExtremes);\n        MarkerClusters_addEvent(ChartClass, 'render', onChartRender);\n        MarkerClusters_addEvent(PointClass, 'drillToCluster', MarkerClusters_onPointDrillToCluster);\n        MarkerClusters_addEvent(PointClass, 'update', onPointUpdate);\n        MarkerClusters_addEvent(SeriesClass, 'afterRender', onSeriesAfterRender);\n        if (ScatterSeries) {\n            MarkerClusters_MarkerClusterScatter\n                .compose(highchartsDefaultOptions, ScatterSeries);\n        }\n    }\n}\n/**\n * Destroy the old tooltip after zoom.\n * @private\n */\nfunction onAxisSetExtremes() {\n    const chart = this.chart;\n    let animationDuration = 0;\n    for (const series of chart.series) {\n        if (series.markerClusterInfo) {\n            animationDuration = (MarkerClusters_animObject((series.options.cluster || {}).animation).duration ||\n                0);\n        }\n    }\n    MarkerClusters_syncTimeout(() => {\n        if (chart.tooltip) {\n            chart.tooltip.destroy();\n        }\n    }, animationDuration);\n}\n/**\n * Handle animation.\n * @private\n */\nfunction onChartRender() {\n    const chart = this;\n    for (const series of (chart.series || [])) {\n        if (series.markerClusterInfo) {\n            const options = series.options.cluster, pointsState = (series.markerClusterInfo || {}).pointsState, oldState = (pointsState || {}).oldState;\n            if ((options || {}).animation &&\n                series.markerClusterInfo &&\n                (series.chart.pointer?.pinchDown || []).length === 0 &&\n                ((series.xAxis || {}).eventArgs || {}).trigger !== 'pan' &&\n                oldState &&\n                Object.keys(oldState).length) {\n                for (const cluster of series.markerClusterInfo.clusters) {\n                    series.animateClusterPoint(cluster);\n                }\n                for (const noise of series.markerClusterInfo.noise) {\n                    series.animateClusterPoint(noise);\n                }\n            }\n        }\n    }\n}\n/** @private */\nfunction MarkerClusters_onPointDrillToCluster(event) {\n    const point = event.point || event.target, series = point.series, clusterOptions = series.options.cluster, onDrillToCluster = ((clusterOptions || {}).events || {}).drillToCluster;\n    if (MarkerClusters_isFunction(onDrillToCluster)) {\n        onDrillToCluster.call(this, event);\n    }\n}\n/**\n * Override point prototype to throw a warning when trying to update\n * clustered point.\n * @private\n */\nfunction onPointUpdate() {\n    const point = this;\n    if (point.dataGroup) {\n        MarkerClusters_error('Highcharts marker-clusters module: ' +\n            'Running `Point.update` when point belongs to clustered series' +\n            ' is not supported.', false, point.series.chart);\n        return false;\n    }\n}\n/**\n * Add classes, change mouse cursor.\n * @private\n */\nfunction onSeriesAfterRender() {\n    const series = this, clusterZoomEnabled = (series.options.cluster || {}).drillToCluster;\n    if (series.markerClusterInfo && series.markerClusterInfo.clusters) {\n        for (const cluster of series.markerClusterInfo.clusters) {\n            if (cluster.point && cluster.point.graphic) {\n                cluster.point.graphic.addClass('highcharts-cluster-point');\n                // Change cursor to pointer when drillToCluster is enabled.\n                if (clusterZoomEnabled && cluster.point) {\n                    cluster.point.graphic.css({\n                        cursor: 'pointer'\n                    });\n                    if (cluster.point.dataLabel) {\n                        cluster.point.dataLabel.css({\n                            cursor: 'pointer'\n                        });\n                    }\n                }\n                if (MarkerClusters_defined(cluster.clusterZone)) {\n                    cluster.point.graphic.addClass(cluster.clusterZoneClassName ||\n                        'highcharts-cluster-zone-' +\n                            cluster.clusterZone.zoneIndex);\n                }\n            }\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst MarkerClusters = {\n    compose: MarkerClusters_compose\n};\n/* harmony default export */ const MarkerClusters_MarkerClusters = (MarkerClusters);\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Function callback when a cluster is clicked.\n *\n * @callback Highcharts.MarkerClusterDrillCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        The point where the event occurred.\n *\n * @param {Highcharts.PointClickEventObject} event\n *        Event arguments.\n */\n''; // Keeps doclets above in JS file\n\n;// ./code/es-modules/Extensions/MarkerClusters/MarkerClusterSymbols.js\n/* *\n *\n *  Marker clusters module.\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  Author: Wojciech Chmiel\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n\n/* *\n *\n *  Variables\n *\n * */\nlet symbols;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Cluster symbol.\n * @private\n */\nfunction MarkerClusterSymbols_cluster(x, y, width, height) {\n    const w = width / 2, h = height / 2, outerWidth = 1, space = 1, inner = symbols.arc(x + w, y + h, w - space * 4, h - space * 4, {\n        start: Math.PI * 0.5,\n        end: Math.PI * 2.5,\n        open: false\n    }), outer1 = symbols.arc(x + w, y + h, w - space * 3, h - space * 3, {\n        start: Math.PI * 0.5,\n        end: Math.PI * 2.5,\n        innerR: w - outerWidth * 2,\n        open: false\n    }), outer2 = symbols.arc(x + w, y + h, w - space, h - space, {\n        start: Math.PI * 0.5,\n        end: Math.PI * 2.5,\n        innerR: w,\n        open: false\n    });\n    return outer2.concat(outer1, inner);\n}\n/**\n * @private\n */\nfunction MarkerClusterSymbols_compose(SVGRendererClass) {\n    symbols = SVGRendererClass.prototype.symbols;\n    symbols.cluster = MarkerClusterSymbols_cluster;\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst MarkerClusterSymbols = {\n    compose: MarkerClusterSymbols_compose\n};\n/* harmony default export */ const MarkerClusters_MarkerClusterSymbols = (MarkerClusterSymbols);\n\n;// ./code/es-modules/masters/modules/marker-clusters.src.js\n\n\n\n\n\nconst G = (highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default());\nMarkerClusters_MarkerClusters.compose(G.Axis, G.Chart, G.defaultOptions, G.Series);\nMarkerClusters_MarkerClusterSymbols.compose(G.SVGRenderer);\n/* harmony default export */ const marker_clusters_src = ((highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default()));\n\n__webpack_exports__ = __webpack_exports__[\"default\"];\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});"],"names":["root","factory","exports","module","define","amd","amd1","window","__WEBPACK_EXTERNAL_MODULE__944__","symbols","__webpack_modules__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","__webpack_exports__","marker_clusters_src","highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_","highcharts_commonjs_highcharts_commonjs2_highcharts_root_Highcharts_default","MarkerClusters_MarkerClusterDefaults","cluster","enabled","allowOverlap","animation","duration","drillToCluster","minimumClusterSize","layoutAlgorithm","gridSize","distance","kmeansThreshold","marker","symbol","radius","lineWidth","lineColor","dataLabels","format","verticalAlign","align","style","color","inside","tooltip","clusterFormat","fireEvent","isArray","objectEach","uniqueKey","Data_DataTableCore","constructor","options","autoId","id","columns","modified","rowCount","versionTag","column","columnName","slice","Math","max","length","applyRowCount","getColumn","asReference","getColumns","columnNames","keys","reduce","getRow","rowIndex","map","setColumn","eventDetail","setColumns","silent","setRow","row","insert","indexRowCount","cellValue","addColumns","Array","splice","animObject","clusterDefaults","addEvent","defined","error","MarkerClusterScatter_isArray","isFunction","isObject","isNumber","merge","MarkerClusterScatter_objectEach","relativeLength","syncTimeout","markerClusterAlgorithms","grid","dataX","dataY","dataIndexes","x","y","gridX","i","gridOffset","series","getGridOffset","scaledGridSize","getScaledGridSize","p","valuesToPixels","plotLeft","plotTop","floor","gridY","push","dataIndex","kmeans","clusters","noise","group","pointMaxDistance","processedDistance","iterations","currentIteration","repeat","pointX","pointY","tempPos","pointClusterDistance","processedGridSize","groupedData","getClusterPosition","posX","posY","oldX","oldY","startPointsLen","points","c","getClusterDistancesFromPoint","clusterIndex","iEnd","optimizedKmeans","processedXData","processedYData","extremes","getRealExtremes","clusterMarkerOptions","offset","markerClusterInfo","initMaxX","maxX","initMinX","minX","initMaxY","maxY","initMinY","minY","baseClusters","dataPoint","pointsOutside","pointsInside","data","dataPointPx","clusterPx","sqrt","pow","clusterZone","baseGeneratePoints","oldPointsStateId","stateIdCounter","fadeInElement","elem","opacity","attr","animate","fadeInNewPointAndDestoryOld","newPointObj","oldPoints","fadeInStatePoint","point","destroy","stateObj","fadeinGraphic","fadeinDataLabel","graphic","show","dataLabel","pointsLen","sumX","sumY","getDataState","clusteredData","stateDataLen","state","forEach","getStateId","random","toString","substring","hideStatePoint","hideGraphic","hideDataLabel","hide","onPointDrillToCluster","event","target","firePointEvent","e","xAxis","yAxis","chart","inverted","mapView","pointer","sortedDataX","sort","b","sortedDataY","offsetX","abs","offsetY","x1","min","x2","y1","y2","fitToBounds","x1Px","toPixels","x2Px","y1Px","y2Px","zoomX","zoomY","transform","from","width","height","pixelsToValues","pos","pixelsToProjectedUnits","toValue","seriesAnimateClusterPoint","clusterObj","animDuration","pointsState","newState","oldState","oldPointObj","newPointBBox","newX","newY","isOldPointGrahic","isCbHandled","newPos","stateId","parentsId","plotX","plotY","getBBox","isImg","alignAttr","seriesDestroyClusteredData","markerClusterSeriesData","seriesGeneratePoints","oldPointsState","oldDataLen","oldMarkerClusterInfo","cropDataOffsetX","cropDataOffsetY","seriesMinX","seriesMaxX","seriesMinY","seriesMaxY","type","layoutAlgOptions","xData","yData","clusterOptions","realExtremes","visibleXData","visibleYData","visibleDataIndexes","is","xy","projectPoint","polar","plotWidth","halfGrid","p1","p2","dataMaxX","dataMinX","dataMaxY","dataMinY","algorithm","getClusteredData","destroyOldPoints","dataTable","groupedXData","groupedYData","hasGroupedData","groupMap","apply","index","isCluster","clusterPointsAmount","getPointsState","hideClusteredData","destroyClusteredData","seriesGetClusterDistancesFromPoint","seriesGetClusteredData","pointUserOptions","clusterPos","pointOptions","clusterTempPos","zoneOptions","clusterZoneClassName","isValidGroupedDataObject","k","zones","to","zoneIndex","className","preventClusterCollisions","defaultRadius","clusterRadius","parentStateId","formatPrefix","states","userOptions","seriesGetGridOffset","reversed","seriesGetPointsState","dataLength","oldDataStateArr","newDataStateArr","indexOf","seriesGetRealExtremes","plotHeight","realMinX","realMaxX","realMinY","realMaxY","seriesGetScaledGridSize","search","divider","gridValueSize","getScale","scale","toFixed","level","seriesHideClusteredData","clusteredSeriesData","oldPointsId","seriesIsValidGroupedDataObject","result","seriesPreventClusterCollisions","props","split","parseFloat","gridXPx","gridYPx","propsPx","gridsToCheckCollision","xPixel","yPixel","nextXPixel","nextYPixel","signX","signY","cornerGridX","cornerGridY","j","itemX","itemY","nextClusterPos","maxDist","item","projectedUnitsToPixels","MarkerClusters_MarkerClusterScatter","compose","highchartsDefaultOptions","ScatterSeriesClass","scatterProto","generatePoints","animateClusterPoint","plotOptions","MarkerClusters_animObject","defaultOptions","composed","MarkerClusters_addEvent","MarkerClusters_defined","MarkerClusters_error","MarkerClusters_isFunction","MarkerClusters_merge","pushUnique","MarkerClusters_syncTimeout","onAxisSetExtremes","animationDuration","onChartRender","pinchDown","eventArgs","trigger","MarkerClusters_onPointDrillToCluster","onDrillToCluster","events","onPointUpdate","dataGroup","onSeriesAfterRender","clusterZoomEnabled","addClass","css","cursor","MarkerClusterSymbols_cluster","w","h","inner","arc","space","start","PI","end","open","outer1","innerR","outerWidth","outer2","concat","G","MarkerClusters_MarkerClusters","AxisClass","ChartClass","SeriesClass","PointClass","pointClass","scatter","ScatterSeries","types","Axis","Chart","Series","MarkerClusters_MarkerClusterSymbols","SVGRendererClass","SVGRenderer"],"mappings":"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"}

Hacked By AnonymousFox1.0, Coded By AnonymousFox