@carto/api-client 0.5.9-alpha.PR193.3 → 0.5.9-alpha.orderby.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api-client.cjs +47 -33
- package/build/api-client.cjs.map +1 -1
- package/build/api-client.d.cts +14 -18
- package/build/api-client.d.ts +14 -18
- package/build/api-client.js +46 -33
- package/build/api-client.js.map +1 -1
- package/build/worker-compat.js +21 -3
- package/build/worker-compat.js.map +1 -1
- package/build/worker.js +21 -3
- package/build/worker.js.map +1 -1
- package/package.json +1 -1
- package/src/api/query.ts +2 -19
- package/src/api/request-with-parameters.ts +5 -10
- package/src/models/model.ts +0 -3
- package/src/operations/groupBy.ts +31 -2
- package/src/sources/base-source.ts +1 -1
- package/src/sources/types.ts +0 -3
- package/src/widget-sources/types.ts +12 -0
- package/src/widget-sources/widget-remote-source.ts +9 -3
- package/src/widget-sources/widget-tileset-source-impl.ts +2 -0
package/build/api-client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../node_modules/thenby/thenBy.module.js","../src/index.ts","../src/client.ts","../src/constants.ts","../src/deck/get-data-filter-extension-props.ts","../src/filters/Filter.ts","../src/filters/FilterTypes.ts","../src/utils/makeIntervalComplete.ts","../src/filters/geosjonFeatures.ts","../node_modules/point-in-polygon-hao/dist/esm/index.js","../node_modules/robust-predicates/index.js","../node_modules/robust-predicates/esm/orient2d.js","../node_modules/robust-predicates/esm/util.js","../node_modules/robust-predicates/esm/orient3d.js","../node_modules/robust-predicates/esm/incircle.js","../node_modules/robust-predicates/esm/insphere.js","../node_modules/@turf/helpers/index.ts","../node_modules/@turf/boolean-point-in-polygon/index.ts","../node_modules/sweepline-intersections/dist/sweeplineIntersections.esm.js","../node_modules/@turf/boolean-disjoint/index.ts","../src/filters/tileFeatures.ts","../src/filters/tileFeaturesGeometries.ts","../src/utils/transformTileCoordsToWGS84.ts","../node_modules/@math.gl/core/src/index.ts","../node_modules/@math.gl/core/src/lib/common.ts","../node_modules/@math.gl/web-mercator/src/index.ts","../node_modules/@math.gl/web-mercator/src/web-mercator-viewport.ts","../node_modules/@math.gl/web-mercator/src/math-utils.ts","../node_modules/@math.gl/web-mercator/src/web-mercator-utils.ts","../node_modules/@math.gl/web-mercator/src/assert.ts","../node_modules/@math.gl/web-mercator/src/fit-bounds.ts","../node_modules/@math.gl/web-mercator/src/get-bounds.ts","../node_modules/@math.gl/web-mercator/src/normalize-viewport-props.ts","../node_modules/@math.gl/web-mercator/src/fly-to-viewport.ts","../src/filters/tileIntersection.ts","../node_modules/@turf/bbox/index.ts","../node_modules/bignumber.js/bignumber.mjs","../node_modules/polyclip-ts/src/geom-in.ts","../node_modules/polyclip-ts/src/constant.ts","../node_modules/polyclip-ts/src/compare.ts","../node_modules/polyclip-ts/src/orient.ts","../node_modules/polyclip-ts/src/snap.ts","../node_modules/polyclip-ts/src/identity.ts","../node_modules/polyclip-ts/src/precision.ts","../node_modules/polyclip-ts/src/bbox.ts","../node_modules/polyclip-ts/src/operation.ts","../node_modules/polyclip-ts/src/vector.ts","../node_modules/polyclip-ts/src/sweep-event.ts","../node_modules/polyclip-ts/src/geom-out.ts","../node_modules/polyclip-ts/src/sweep-line.ts","../node_modules/polyclip-ts/src/segment.ts","../node_modules/polyclip-ts/src/index.ts","../src/utils/transformToTileCoords.ts","../src/filters/tileFeaturesSpatialIndex.ts","../src/constants-internal.ts","../src/filters/tileFeaturesRaster.ts","../src/utils.ts","../src/types.ts","../src/fetch-map/index.ts","../src/fetch-map/basemap-styles.ts","../src/api/index.ts","../src/api/carto-api-error.ts","../src/api/endpoints.ts","../src/api/query.ts","../src/sources/index.ts","../src/sources/base-source.ts","../src/api/request-with-parameters.ts","../src/sources/boundary-query-source.ts","../src/sources/boundary-table-source.ts","../src/sources/h3-query-source.ts","../src/widget-sources/widget-source.ts","../src/widget-sources/widget-query-source.ts","../src/widget-sources/widget-remote-source.ts","../src/models/index.ts","../src/models/model.ts","../src/models/common.ts","../src/filters.ts","../src/widget-sources/constants.ts","../src/widget-sources/widget-raster-source.ts","../src/widget-sources/widget-tileset-source.ts","../src/widget-sources/widget-tileset-source-impl.ts","../src/operations/aggregation.ts","../src/operations/applySorting.ts","../src/operations/groupBy.ts","../src/operations/groupByDate.ts","../src/utils/dateUtils.ts","../src/operations/histogram.ts","../src/operations/scatterPlot.ts","../node_modules/geojson-equality-ts/index.ts","../src/widget-sources/widget-table-source.ts","../src/sources/h3-table-source.ts","../src/sources/h3-tileset-source.ts","../src/utils/getTileFormat.ts","../src/sources/raster-source.ts","../src/sources/quadbin-query-source.ts","../src/sources/quadbin-table-source.ts","../src/sources/quadbin-tileset-source.ts","../src/sources/vector-query-source.ts","../src/sources/vector-table-source.ts","../src/sources/vector-tileset-source.ts","../src/fetch-map/fetch-map.ts","../src/fetch-map/parse-map.ts","../src/fetch-map/layer-map.ts","../node_modules/d3-array/src/index.js","../node_modules/d3-array/src/ascending.js","../node_modules/d3-array/src/extent.js","../node_modules/d3-array/src/group.js","../node_modules/internmap/src/index.js","../node_modules/d3-array/src/identity.js","../node_modules/d3-array/src/groupSort.js","../node_modules/d3-array/src/sort.js","../node_modules/d3-array/src/permute.js","../node_modules/d3-color/src/index.js","../node_modules/d3-color/src/color.js","../node_modules/d3-color/src/define.js","../src/fetch-map/utils.ts","../src/fetch-map/basemap.ts","../src/fetch-map/source.ts","../src/geo.ts","../src/spatial-index.ts","../src/utils/CellSet.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/***\n Copyright 2013 Teun Duynstee\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nmodule.exports = (function() {\n\n function identity(v){return v;}\n\n function ignoreCase(v){return typeof(v)===\"string\" ? v.toLowerCase() : v;}\n\n function makeCompareFunction(f, opt){\n opt = typeof(opt)===\"object\" ? opt : {direction:opt};\n \n if(typeof(f)!=\"function\"){\n var prop = f;\n // make unary function\n f = function(v1){return !!v1[prop] ? v1[prop] : \"\";}\n }\n if(f.length === 1) {\n // f is a unary function mapping a single item to its sort score\n var uf = f;\n var preprocess = opt.ignoreCase?ignoreCase:identity;\n var cmp = opt.cmp || function(v1,v2) {return v1 < v2 ? -1 : v1 > v2 ? 1 : 0;}\n f = function(v1,v2) {return cmp(preprocess(uf(v1)), preprocess(uf(v2)));}\n }\n const descTokens = {\"-1\":'', desc:''};\n if(opt.direction in descTokens) return function(v1,v2){return -f(v1,v2)};\n return f;\n }\n\n /* adds a secondary compare function to the target function (`this` context)\n which is applied in case the first one returns 0 (equal)\n returns a new compare function, which has a `thenBy` method as well */\n function tb(func, opt) {\n /* should get value false for the first call. This can be done by calling the \n exported function, or the firstBy property on it (for es6 module compatibility)\n */\n var x = (typeof(this) == \"function\" && !this.firstBy) ? this : false;\n var y = makeCompareFunction(func, opt);\n var f = x ? function(a, b) {\n return x(a,b) || y(a,b);\n }\n : y;\n f.thenBy = tb;\n return f;\n }\n tb.firstBy = tb;\n return tb;\n})();\n","export * from './client.js';\nexport * from './constants.js';\nexport * from './deck/index.js';\nexport * from './fetch-map/index.js';\nexport type {LayerDescriptor, LayerType} from './fetch-map/index.js';\nexport * from './filters.js';\nexport * from './geo.js';\nexport * from './sources/index.js';\nexport * from './widget-sources/index.js';\nexport * from './types.js';\n\nexport {\n type APIErrorContext,\n type APIRequestType,\n CartoAPIError,\n type QueryOptions,\n buildPublicMapUrl, // Internal, but required for fetchMap().\n buildStatsUrl, // Internal, but required for fetchMap().\n query,\n requestWithParameters,\n clearDefaultRequestCache, // Internal, for unit testing.\n} from './api/index.js';\n\nexport {_getHexagonResolution} from './spatial-index.js';\n\n// For unit testing only.\nexport * from './filters/index.js';\nexport * from './operations/index.js';\nexport * from './utils/makeIntervalComplete.js';\nexport * from './utils/transformToTileCoords.js';\nexport * from './utils/CellSet.js';\nexport * from './fetch-map/source.js';\n","/**\n * @internal\n * @privateRemarks Source: @carto/react-core, @carto/constants, @deck.gl/carto\n */\nlet client = 'deck-gl-carto';\n\n/**\n * Returns current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function getClient() {\n return client;\n}\n\n/**\n * Sets current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function setClient(c: string) {\n client = c;\n}\n","/**\n * Defines a comparator used when matching a column's values against given filter values.\n *\n * Example:\n *\n * ```javascript\n * import { FilterType } from '@carto/api-client';\n * const filters = {\n * column_name: { [FilterType.IN]: { values: ['a', 'b', 'c'] } }\n * };\n * ```\n *\n * @privateRemarks Source: @carto/react-api, @deck.gl/carto\n */\nexport enum FilterType {\n IN = 'in',\n /** [a, b] both are included. */\n BETWEEN = 'between',\n /** [a, b) a is included, b is not. */\n CLOSED_OPEN = 'closed_open',\n TIME = 'time',\n STRING_SEARCH = 'stringSearch',\n}\n\n/** @privateRemarks Source: @carto/constants */\nexport enum ApiVersion {\n V1 = 'v1',\n V2 = 'v2',\n V3 = 'v3',\n}\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_API_BASE_URL = 'https://gcp-us-east1.api.carto.com';\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum TileFormat {\n MVT = 'mvt',\n JSON = 'json',\n GEOJSON = 'geojson',\n BINARY = 'binary',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum SpatialIndex {\n H3 = 'h3',\n QUADBIN = 'quadbin',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum Provider {\n BIGQUERY = 'bigquery',\n REDSHIFT = 'redshift',\n POSTGRES = 'postgres',\n SNOWFLAKE = 'snowflake',\n DATABRICKS = 'databricks',\n DATABRICKS_REST = 'databricksRest',\n}\n\nexport const SpatialIndexColumn = Object.freeze({\n [SpatialIndex.H3]: ['h3', 'hex', 'h3id', 'hex_id', 'h3hex'],\n [SpatialIndex.QUADBIN]: ['quadbin'],\n});\n\n/**\n * Enum like container for all types of aggregations available for widgets.\n */\nexport const AggregationTypes = {\n Count: 'count' as const,\n Avg: 'avg' as const,\n Min: 'min' as const,\n Max: 'max' as const,\n Sum: 'sum' as const,\n Custom: 'custom' as const,\n} as const;\n","import type {Feature} from 'geojson';\nimport type {FilterLogicalOperator, Filters} from '../types.js';\nimport {FilterType} from '../constants.js';\nimport {_buildFeatureFilter} from '../filters/index.js';\nimport type {FeatureData} from '../types-internal.js';\n\ntype TimeFilter = Filters['string'][FilterType.TIME] & {\n params?: {offsetBy?: number};\n};\n\n/**\n * deck.gl's DataFilterExtension supports GPU filtering with 1–4 values. We\n * allocate filters[0] to generic filters and filters[1] to time filters.\n *\n * getFilterValue() _must_ return an array of the same size as the filterSize\n * used to initialize the DataFilterExtension. We document that users must use\n * filterSize=4 for compatibility with @link {getDataFilterExtensionProps}.\n */\nconst DEFAULT_FILTER_SIZE = 4;\n\n/** @experimental Prefer type definition from deck.gl. */\nexport type _DataFilterExtensionProps = {\n filterRange: number[][];\n updateTriggers: Record<string, string>;\n getFilterValue: (feature: Feature | FeatureData) => number[];\n};\n\n/**\n * Creates props for DataFilterExtension, from `@deck.gl/extensions`, given\n * a set of filters. Requires that DataFilterExtension is initialized with\n * filterSize=4, where the CARTO filters will occupy the first two slots.\n *\n * @example To create a deck.gl layer with GPU data filtering:\n * ```typescript\n * import {DataFilterExtension} from '@deck.gl/extensions';\n * import {VectorTileLayer} from '@deck.gl/layers';\n * import {getDataFilterExtensionProps} from '@carto/api-client';\n *\n * const layer = new VectorTileLayer({\n * data: data,\n * extensions: [new DataFilterExtension({filterSize: 4})],\n * ...getDataFilterExtensionProps(filters),\n * });\n * ```\n */\nexport function getDataFilterExtensionProps(\n filters: Filters,\n filtersLogicalOperator?: FilterLogicalOperator\n): _DataFilterExtensionProps {\n const {filtersWithoutTimeType, timeColumn, timeFilter} =\n getFiltersByType(filters);\n return {\n filterRange: getFilterRange(timeFilter, DEFAULT_FILTER_SIZE),\n updateTriggers: getUpdateTriggers(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter\n ),\n getFilterValue: getFilterValue(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n DEFAULT_FILTER_SIZE,\n filtersLogicalOperator\n ),\n };\n}\n\n/** @internal */\nfunction getFiltersByType(filters: Filters) {\n const filtersWithoutTimeType: Filters = {};\n\n let timeColumn: string | null = null;\n let timeFilter: TimeFilter | null = null;\n\n for (const [column, columnData] of Object.entries(filters)) {\n for (const [type, typeData] of Object.entries(columnData) as [\n FilterType,\n unknown,\n ][]) {\n if (type === FilterType.TIME) {\n timeColumn = column;\n timeFilter = typeData as TimeFilter;\n } else {\n filtersWithoutTimeType[column] = {[type]: typeData};\n }\n }\n }\n\n return {\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n };\n}\n\n/** @internal */\nfunction getFilterRange(\n timeFilter: TimeFilter | null,\n filterSize: number\n): number[][] {\n const result = Array(filterSize).fill([0, 0]);\n // According to getFilterValue all filters are resolved as 0 or 1 in the first position of the array\n // except the time filter value that is resolved with the real value of the feature in the second position of the array\n result[0] = [1, 1];\n if (timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n result[1] = timeFilter.values[0].map((v) => v - offsetBy);\n }\n return result;\n}\n\n/** @internal */\nfunction getUpdateTriggers(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null\n) {\n const result: Record<string, object> = {...filtersWithoutTimeType};\n\n // We don't want to change the layer UpdateTriggers every time that the time filter changes\n // because this filter is changed by the time series widget during its animation\n // so we remove the time filter value from the `updateTriggers`\n if (timeColumn && timeFilter) {\n result[timeColumn] = {\n ...result[timeColumn],\n offsetBy: timeFilter.params?.offsetBy,\n [FilterType.TIME]: {}, // Allows working with other filters, without an impact on performance.\n };\n }\n return {\n getFilterValue: JSON.stringify(result),\n };\n}\n\n/** @internal */\nfunction getFilterValue(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null,\n filterSize: number,\n filtersLogicalOperator?: FilterLogicalOperator\n) {\n const result = Array(filterSize).fill(0);\n const featureFilter = _buildFeatureFilter({\n filters: filtersWithoutTimeType,\n type: 'number',\n filtersLogicalOperator,\n });\n\n // We evaluate all filters except the time filter using _buildFeatureFilter function.\n // For the time filter, we return the value of the feature and we will change the getFilterRange result\n // every time this filter changes\n return (feature: Feature | FeatureData) => {\n result[0] = featureFilter(feature);\n\n if (timeColumn && timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n const f = (feature.properties || feature) as Record<string, unknown>;\n result[1] = (f[timeColumn] as number) - offsetBy;\n }\n return result;\n };\n}\n","import {filterFunctions} from './FilterTypes.js';\nimport type {Filter, FilterLogicalOperator, Filters} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {FilterType} from '../constants.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {BinaryFeature} from '@loaders.gl/schema';\n\nconst LOGICAL_OPERATOR_METHODS: Record<\n FilterLogicalOperator,\n 'every' | 'some'\n> = {\n and: 'every',\n or: 'some',\n};\n\nfunction passesFilter(\n columns: string[],\n filters: Filters,\n feature: FeatureData,\n filtersLogicalOperator: FilterLogicalOperator\n): boolean {\n const method = LOGICAL_OPERATOR_METHODS[filtersLogicalOperator];\n return columns[method]((column) => {\n const columnFilters = filters[column];\n const columnFilterTypes = Object.keys(columnFilters) as FilterType[];\n\n if (!feature || feature[column] === null || feature[column] === undefined) {\n return false;\n }\n\n return columnFilterTypes.every((filter) => {\n const filterFunction = filterFunctions[filter];\n\n if (!filterFunction) {\n throw new Error(`\"${filter}\" filter is not implemented.`);\n }\n\n return filterFunction(\n columnFilters[filter]!.values,\n feature[column],\n (columnFilters[filter] as Filter[FilterType.STRING_SEARCH])!.params\n );\n });\n });\n}\n\n/**\n * @internal\n * @privateRemarks Exported for use in @deck.gl/carto's getDataFilterExtensionProps.\n */\nexport function _buildFeatureFilter({\n filters = {},\n type = 'boolean',\n filtersLogicalOperator = 'and',\n}: {\n filters?: Filters;\n type?: 'number' | 'boolean';\n filtersLogicalOperator?: FilterLogicalOperator;\n}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => (type === 'number' ? 1 : true);\n }\n\n return (feature: Feature | FeatureData) => {\n const f = feature.properties || feature;\n const featurePassesFilter = passesFilter(\n columns,\n filters,\n f as FeatureData,\n filtersLogicalOperator\n );\n\n return type === 'number'\n ? Number(featurePassesFilter)\n : featurePassesFilter;\n };\n}\n\n/**\n * Apply certain filters to a collection of features.\n * @internal\n */\nexport function applyFilters(\n features: FeatureData[],\n filters: Filters,\n filtersLogicalOperator: FilterLogicalOperator\n) {\n return Object.keys(filters).length\n ? features.filter(_buildFeatureFilter({filters, filtersLogicalOperator}))\n : features;\n}\n\n/**\n * Binary.\n * @internal\n */\nexport function buildBinaryFeatureFilter({filters = {}}: {filters: Filters}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => 1;\n }\n\n return (featureIdIdx: number, binaryData: BinaryFeature) =>\n passesFilterUsingBinary(columns, filters, featureIdIdx, binaryData);\n}\n\nfunction getValueFromNumericProps(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n return binaryData.numericProps?.[column]?.value[featureIdIdx];\n}\n\nfunction getValueFromProperties(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n const propertyIdx = binaryData.featureIds.value[featureIdIdx];\n return (binaryData.properties[propertyIdx] as Record<string, unknown>)?.[\n column\n ];\n}\n\nconst GET_VALUE_BY_BINARY_PROP = {\n properties: getValueFromProperties,\n numericProps: getValueFromNumericProps,\n};\n\nfunction getBinaryPropertyByFilterValues(filterValues: unknown[]) {\n return typeof filterValues.flat()[0] === 'string'\n ? 'properties'\n : 'numericProps';\n}\n\nfunction getFeatureValue(\n featureIdIdx: number,\n binaryData: any,\n filter: {type: FilterType; column: string; values: unknown[]}\n) {\n const {column, values} = filter;\n const binaryProp = getBinaryPropertyByFilterValues(values);\n const getFeatureValueFn = GET_VALUE_BY_BINARY_PROP[binaryProp];\n return getFeatureValueFn(featureIdIdx, binaryData, {column});\n}\n\nfunction passesFilterUsingBinary(\n columns: string[],\n filters: Filters,\n featureIdIdx: number,\n binaryData: BinaryFeature\n) {\n return columns.every((column) => {\n const columnFilters = filters[column];\n\n return Object.entries(columnFilters).every(([type, {values}]) => {\n const filterFn = filterFunctions[type as FilterType];\n if (!filterFn) {\n throw new Error(`\"${type}\" filter is not implemented.`);\n }\n\n if (!values) return 0;\n\n const featureValue = getFeatureValue(featureIdIdx, binaryData, {\n type: type as FilterType,\n column,\n values,\n });\n\n if (featureValue === undefined || featureValue === null) return 0;\n\n return filterFn(values, featureValue);\n });\n });\n}\n","import {FilterType} from '../constants.js';\nimport type {FilterInterval, StringSearchOptions} from '../types.js';\nimport {makeIntervalComplete} from '../utils/makeIntervalComplete.js';\n\nexport type FilterFunction = (\n filterValues: unknown[],\n featureValue: unknown,\n params?: Record<string, unknown>\n) => boolean;\n\nexport const filterFunctions: Record<FilterType, FilterFunction> = {\n [FilterType.IN]: filterIn,\n [FilterType.BETWEEN]: filterBetween,\n [FilterType.TIME]: filterTime,\n [FilterType.CLOSED_OPEN]: filterClosedOpen,\n [FilterType.STRING_SEARCH]: filterStringSearch,\n};\n\nfunction filterIn(filterValues: unknown[], featureValue: unknown): boolean {\n return filterValues.includes(featureValue);\n}\n\n// FilterTypes.BETWEEN\nfunction filterBetween(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) <= upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as FilterInterval[]).some(\n checkRange\n );\n}\n\nfunction filterTime(filterValues: unknown[], featureValue: unknown) {\n const featureValueAsTimestamp = new Date(featureValue as number).getTime();\n if (isFinite(featureValueAsTimestamp)) {\n return filterBetween(filterValues, featureValueAsTimestamp);\n } else {\n throw new Error(`Column used to filter by time isn't well formatted.`);\n }\n}\n\n// FilterTypes.CLOSED_OPEN\nfunction filterClosedOpen(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) < upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as [number, number][]).some(\n checkRange\n );\n}\n\n// FilterTypes.STRING_SEARCH\nfunction filterStringSearch(\n filterValues: unknown[],\n featureValue: unknown,\n params: StringSearchOptions = {}\n): boolean {\n const normalizedFeatureValue = normalize(featureValue, params);\n const stringRegExp = params.useRegExp\n ? filterValues\n : filterValues.map((filterValue) => {\n let stringRegExp = escapeRegExp(normalize(filterValue, params));\n\n if (params.mustStart) stringRegExp = `^${stringRegExp}`;\n if (params.mustEnd) stringRegExp = `${stringRegExp}$`;\n\n return stringRegExp;\n });\n\n const regex = new RegExp(\n stringRegExp.join('|'),\n params.caseSensitive ? 'g' : 'gi'\n );\n return !!normalizedFeatureValue.match(regex);\n}\n\n// Aux\nconst specialCharRegExp = /[.*+?^${}()|[\\]\\\\]/g;\nconst normalizeRegExp = /\\p{Diacritic}/gu;\n\nfunction escapeRegExp(value: string) {\n return value.replace(specialCharRegExp, '\\\\$&');\n}\n\nfunction normalize(data: unknown, params: StringSearchOptions) {\n let normalizedData = String(data);\n if (!params.keepSpecialCharacters)\n normalizedData = normalizedData\n .normalize('NFD')\n .replace(normalizeRegExp, '');\n\n return normalizedData;\n}\n","import type {FilterInterval, FilterIntervalComplete} from '../types.js';\n\nexport function makeIntervalComplete(\n intervals: FilterInterval[]\n): FilterIntervalComplete[] {\n return intervals.map((val) => {\n if (val[0] === undefined || val[0] === null) {\n return [Number.MIN_SAFE_INTEGER, val[1]];\n }\n\n if (val[1] === undefined || val[1] === null) {\n return [val[0], Number.MAX_SAFE_INTEGER];\n }\n\n return val;\n }) as FilterIntervalComplete[];\n}\n","import intersects from '@turf/boolean-intersects';\nimport type {FeatureCollection} from 'geojson';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialFilter} from '../types.js';\n\nexport function geojsonFeatures({\n geojson,\n spatialFilter,\n uniqueIdProperty,\n}: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n uniqueIdProperty?: string;\n}): FeatureData[] {\n let uniqueIdx = 0;\n const map = new Map();\n\n if (!spatialFilter) {\n return [];\n }\n\n for (const feature of geojson.features) {\n const uniqueId = uniqueIdProperty\n ? feature.properties![uniqueIdProperty]\n : ++uniqueIdx;\n if (!map.has(uniqueId) && intersects(spatialFilter, feature)) {\n map.set(uniqueId, feature.properties);\n }\n }\n\n return Array.from(map.values());\n}\n","import { orient2d } from 'robust-predicates';\n\nfunction pointInPolygon(p, polygon) {\n var i;\n var ii;\n var k = 0;\n var f;\n var u1;\n var v1;\n var u2;\n var v2;\n var currentP;\n var nextP;\n\n var x = p[0];\n var y = p[1];\n\n var numContours = polygon.length;\n for (i = 0; i < numContours; i++) {\n ii = 0;\n var contour = polygon[i];\n var contourLen = contour.length - 1;\n\n currentP = contour[0];\n if (currentP[0] !== contour[contourLen][0] &&\n currentP[1] !== contour[contourLen][1]) {\n throw new Error('First and last coordinates in a ring must be the same')\n }\n\n u1 = currentP[0] - x;\n v1 = currentP[1] - y;\n\n for (ii; ii < contourLen; ii++) {\n nextP = contour[ii + 1];\n\n u2 = nextP[0] - x;\n v2 = nextP[1] - y;\n\n if (v1 === 0 && v2 === 0) {\n if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }\n } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {\n f = orient2d(u1, u2, v1, v2, 0, 0);\n if (f === 0) { return 0 }\n if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }\n }\n currentP = nextP;\n v1 = v2;\n u1 = u2;\n }\n }\n\n if (k % 2 === 0) { return false }\n return true\n}\n\nexport { pointInPolygon as default };\n","\nexport {orient2d, orient2dfast} from './esm/orient2d.js';\nexport {orient3d, orient3dfast} from './esm/orient3d.js';\nexport {incircle, incirclefast} from './esm/incircle.js';\nexport {insphere, inspherefast} from './esm/insphere.js';\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from oritinal code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(8);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n finlen = sum(finlen, fin, alen, a, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n if (xtail === 0) {\n if (ytail === 0) {\n a[0] = 0;\n b[0] = 0;\n return 1;\n } else {\n negate = -ytail;\n s1 = negate * ax;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n } else {\n if (ytail === 0) {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n negate = -xtail;\n s1 = negate * by;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n } else {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ytail * ax;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n a[3] = u3;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = xtail * by;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n b[3] = u3;\n return 4;\n }\n }\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n s1 = a * b;\n c = splitter * a;\n ahi = c - (c - a);\n alo = a - ahi;\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n c = splitter * k;\n bhi = c - (c - k);\n blo = k - bhi;\n _i = s0 * k;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * k;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n if (z !== 0) {\n c = splitter * z;\n bhi = c - (c - z);\n blo = z - bhi;\n _i = s0 * z;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * z;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n }\n return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail;\n let adytail, bdytail, cdytail;\n let adztail, bdztail, cdztail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n scale(4, bc, adz, _8), _8,\n scale(4, ca, bdz, _8b), _8b, _16), _16,\n scale(4, ab, cdz, _8), _8, fin);\n\n let det = estimate(finlen, fin);\n let errbound = o3derrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n bvirt = az - adz;\n adztail = az - (adz + bvirt) + (bvirt - dz);\n bvirt = bz - bdz;\n bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n bvirt = cz - cdz;\n cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n adytail === 0 && bdytail === 0 && cdytail === 0 &&\n adztail === 0 && bdztail === 0 && cdztail === 0) {\n return det;\n }\n\n errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n det +=\n adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n if (adztail !== 0) {\n finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n }\n if (bdztail !== 0) {\n finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n }\n if (cdztail !== 0) {\n finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n }\n\n if (adxtail !== 0) {\n if (bdytail !== 0) {\n finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n }\n if (cdytail !== 0) {\n finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n }\n }\n if (bdxtail !== 0) {\n if (cdytail !== 0) {\n finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n }\n if (adytail !== 0) {\n finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n }\n }\n if (cdxtail !== 0) {\n if (adytail !== 0) {\n finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n }\n if (bdytail !== 0) {\n finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n\n const det =\n adz * (bdxcdy - cdxbdy) +\n bdz * (cdxady - adxcdy) +\n cdz * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n const errbound = o3derrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n\n return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n return adx * (bdy * cdz - bdz * cdy) +\n bdx * (cdy * adz - cdz * ady) +\n cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n finlen = sum(finlen, fin, a, alen, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n let abtlen, bctlen, catlen;\n let abttlen, bcttlen, cattlen;\n let n1, n0;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n sum(\n scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n sum(\n scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n sum(\n scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n let det = estimate(finlen, fin);\n let errbound = iccerrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n return det;\n }\n\n errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = adx * adx;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = ady * ady;\n c = splitter * ady;\n ahi = c - (c - ady);\n alo = ady - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n aa[3] = u3;\n }\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = bdx * bdx;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = bdy * bdy;\n c = splitter * bdy;\n ahi = c - (c - bdy);\n alo = bdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bb[3] = u3;\n }\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = cdx * cdx;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = cdy * cdy;\n c = splitter * cdy;\n ahi = c - (c - cdy);\n alo = cdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cc[3] = u3;\n }\n\n if (adxtail !== 0) {\n axtbclen = scale(4, bc, adxtail, axtbc);\n finlen = finadd(finlen, sum_three(\n scale(axtbclen, axtbc, 2 * adx, _16), _16,\n scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n }\n if (adytail !== 0) {\n aytbclen = scale(4, bc, adytail, aytbc);\n finlen = finadd(finlen, sum_three(\n scale(aytbclen, aytbc, 2 * ady, _16), _16,\n scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n }\n if (bdxtail !== 0) {\n bxtcalen = scale(4, ca, bdxtail, bxtca);\n finlen = finadd(finlen, sum_three(\n scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n }\n if (bdytail !== 0) {\n bytcalen = scale(4, ca, bdytail, bytca);\n finlen = finadd(finlen, sum_three(\n scale(bytcalen, bytca, 2 * bdy, _16), _16,\n scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n }\n if (cdxtail !== 0) {\n cxtablen = scale(4, ab, cdxtail, cxtab);\n finlen = finadd(finlen, sum_three(\n scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n }\n if (cdytail !== 0) {\n cytablen = scale(4, ab, cdytail, cytab);\n finlen = finadd(finlen, sum_three(\n scale(cytablen, cytab, 2 * cdy, _16), _16,\n scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n }\n\n if (adxtail !== 0 || adytail !== 0) {\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = bdxtail * cdy;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * cdytail;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n s1 = cdxtail * -bdy;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * -bdy;\n bhi = c - (c - -bdy);\n blo = -bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * -bdytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * -bdytail;\n bhi = c - (c - -bdytail);\n blo = -bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n bctlen = sum(4, u, 4, v, bct);\n s1 = bdxtail * cdytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdxtail * bdytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bctt[3] = u3;\n bcttlen = 4;\n } else {\n bct[0] = 0;\n bctlen = 1;\n bctt[0] = 0;\n bcttlen = 1;\n }\n if (adxtail !== 0) {\n const len = scale(bctlen, bct, adxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(axtbclen, axtbc, adxtail, _16), _16,\n scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * adx, _16), _16,\n scale(len2, _8, adxtail, _16b), _16b,\n scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n }\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n }\n }\n if (adytail !== 0) {\n const len = scale(bctlen, bct, adytail, _16c);\n finlen = finadd(finlen, sum(\n scale(aytbclen, aytbc, adytail, _16), _16,\n scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * ady, _16), _16,\n scale(len2, _8, adytail, _16b), _16b,\n scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n }\n }\n if (bdxtail !== 0 || bdytail !== 0) {\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = cdxtail * ady;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * adytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -cdy;\n n0 = -cdytail;\n s1 = adxtail * n1;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * n0;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n catlen = sum(4, u, 4, v, cat);\n s1 = cdxtail * adytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adxtail * cdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n catt[3] = u3;\n cattlen = 4;\n } else {\n cat[0] = 0;\n catlen = 1;\n catt[0] = 0;\n cattlen = 1;\n }\n if (bdxtail !== 0) {\n const len = scale(catlen, cat, bdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(bxtcalen, bxtca, bdxtail, _16), _16,\n scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdx, _16), _16,\n scale(len2, _8, bdxtail, _16b), _16b,\n scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n }\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n }\n }\n if (bdytail !== 0) {\n const len = scale(catlen, cat, bdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(bytcalen, bytca, bdytail, _16), _16,\n scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdy, _16), _16,\n scale(len2, _8, bdytail, _16b), _16b,\n scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);\n }\n }\n if (cdxtail !== 0 || cdytail !== 0) {\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = adxtail * bdy;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * bdytail;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -ady;\n n0 = -adytail;\n s1 = bdxtail * n1;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * n0;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n abtlen = sum(4, u, 4, v, abt);\n s1 = adxtail * bdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdxtail * adytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n abtt[3] = u3;\n abttlen = 4;\n } else {\n abt[0] = 0;\n abtlen = 1;\n abtt[0] = 0;\n abttlen = 1;\n }\n if (cdxtail !== 0) {\n const len = scale(abtlen, abt, cdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(cxtablen, cxtab, cdxtail, _16), _16,\n scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdx, _16), _16,\n scale(len2, _8, cdxtail, _16b), _16b,\n scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n }\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n }\n }\n if (cdytail !== 0) {\n const len = scale(abtlen, abt, cdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(cytablen, cytab, cdytail, _16), _16,\n scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdy, _16), _16,\n scale(len2, _8, cdytail, _16b), _16b,\n scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n const alift = adx * adx + ady * ady;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n const blift = bdx * bdx + bdy * bdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n const clift = cdx * cdx + cdy * cdy;\n\n const det =\n alift * (bdxcdy - cdxbdy) +\n blift * (cdxady - adxcdy) +\n clift * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n const errbound = iccerrboundA * permanent;\n\n if (det > errbound || -det > errbound) {\n return det;\n }\n return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const ady = ay - dy;\n const bdx = bx - dx;\n const bdy = by - dy;\n const cdx = cx - dx;\n const cdy = cy - dy;\n\n const abdet = adx * bdy - bdx * ady;\n const bcdet = bdx * cdy - cdx * bdy;\n const cadet = cdx * ady - adx * cdy;\n const alift = adx * adx + ady * ady;\n const blift = bdx * bdx + bdy * bdy;\n const clift = cdx * cdx + cdy * cdy;\n\n return alift * bcdet + blift * cadet + clift * abdet;\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale, negate} from './util.js';\n\nconst isperrboundA = (16 + 224 * epsilon) * epsilon;\nconst isperrboundB = (5 + 72 * epsilon) * epsilon;\nconst isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;\n\nconst ab = vec(4);\nconst bc = vec(4);\nconst cd = vec(4);\nconst de = vec(4);\nconst ea = vec(4);\nconst ac = vec(4);\nconst bd = vec(4);\nconst ce = vec(4);\nconst da = vec(4);\nconst eb = vec(4);\n\nconst abc = vec(24);\nconst bcd = vec(24);\nconst cde = vec(24);\nconst dea = vec(24);\nconst eab = vec(24);\nconst abd = vec(24);\nconst bce = vec(24);\nconst cda = vec(24);\nconst deb = vec(24);\nconst eac = vec(24);\n\nconst adet = vec(1152);\nconst bdet = vec(1152);\nconst cdet = vec(1152);\nconst ddet = vec(1152);\nconst edet = vec(1152);\nconst abdet = vec(2304);\nconst cddet = vec(2304);\nconst cdedet = vec(3456);\nconst deter = vec(5760);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _8c = vec(8);\nconst _16 = vec(16);\nconst _24 = vec(24);\nconst _48 = vec(48);\nconst _48b = vec(48);\nconst _96 = vec(96);\nconst _192 = vec(192);\nconst _384x = vec(384);\nconst _384y = vec(384);\nconst _384z = vec(384);\nconst _768 = vec(768);\n\nfunction sum_three_scale(a, b, c, az, bz, cz, out) {\n return sum_three(\n scale(4, a, az, _8), _8,\n scale(4, b, bz, _8b), _8b,\n scale(4, c, cz, _8c), _8c, _16, out);\n}\n\nfunction liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {\n const len = sum(\n sum(alen, a, blen, b, _48), _48,\n negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);\n\n return sum_three(\n scale(scale(len, _96, x, _192), _192, x, _384x), _384x,\n scale(scale(len, _96, y, _192), _192, y, _384y), _384y,\n scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);\n}\n\nfunction insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n s1 = ax * by;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ay;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n s1 = bx * cy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * by;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cx * dy;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * cy;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cd[3] = u3;\n s1 = dx * ey;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * dy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n de[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n de[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n de[2] = _j - (u3 - bvirt) + (_i - bvirt);\n de[3] = u3;\n s1 = ex * ay;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * ey;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ea[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ea[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ea[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ea[3] = u3;\n s1 = ax * cy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * ay;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ac[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ac[3] = u3;\n s1 = bx * dy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * by;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bd[3] = u3;\n s1 = cx * ey;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * cy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ce[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ce[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ce[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ce[3] = u3;\n s1 = dx * ay;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * dy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n da[2] = _j - (u3 - bvirt) + (_i - bvirt);\n da[3] = u3;\n s1 = ex * by;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ey;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n eb[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n eb[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n eb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n eb[3] = u3;\n\n const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);\n const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);\n const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);\n const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);\n const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);\n const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);\n const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);\n const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);\n const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);\n const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);\n\n const deterlen = sum_three(\n liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,\n liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,\n sum_three(\n liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,\n liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,\n liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);\n\n return deter[deterlen - 1];\n}\n\nconst xdet = vec(96);\nconst ydet = vec(96);\nconst zdet = vec(96);\nconst fin = vec(1152);\n\nfunction liftadapt(a, b, c, az, bz, cz, x, y, z, out) {\n const len = sum_three_scale(a, b, c, az, bz, cz, _24);\n return sum_three(\n scale(scale(len, _24, x, _48), _48, x, xdet), xdet,\n scale(scale(len, _24, y, _48), _48, y, ydet), ydet,\n scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);\n}\n\nfunction insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {\n let ab3, bc3, cd3, da3, ac3, bd3;\n\n let aextail, bextail, cextail, dextail;\n let aeytail, beytail, ceytail, deytail;\n let aeztail, beztail, ceztail, deztail;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;\n\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n s1 = aex * bey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bex * aey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ab3 = _j + _i;\n bvirt = ab3 - _j;\n ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);\n ab[3] = ab3;\n s1 = bex * cey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * bey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bc3 = _j + _i;\n bvirt = bc3 - _j;\n bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);\n bc[3] = bc3;\n s1 = cex * dey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * cey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n cd3 = _j + _i;\n bvirt = cd3 - _j;\n cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);\n cd[3] = cd3;\n s1 = dex * aey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = aex * dey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n da3 = _j + _i;\n bvirt = da3 - _j;\n da[2] = _j - (da3 - bvirt) + (_i - bvirt);\n da[3] = da3;\n s1 = aex * cey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * aey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ac3 = _j + _i;\n bvirt = ac3 - _j;\n ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);\n ac[3] = ac3;\n s1 = bex * dey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * bey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bd3 = _j + _i;\n bvirt = bd3 - _j;\n bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);\n bd[3] = bd3;\n\n const finlen = sum(\n sum(\n negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,\n liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,\n sum(\n negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,\n liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);\n\n let det = estimate(finlen, fin);\n let errbound = isperrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - aex;\n aextail = ax - (aex + bvirt) + (bvirt - ex);\n bvirt = ay - aey;\n aeytail = ay - (aey + bvirt) + (bvirt - ey);\n bvirt = az - aez;\n aeztail = az - (aez + bvirt) + (bvirt - ez);\n bvirt = bx - bex;\n bextail = bx - (bex + bvirt) + (bvirt - ex);\n bvirt = by - bey;\n beytail = by - (bey + bvirt) + (bvirt - ey);\n bvirt = bz - bez;\n beztail = bz - (bez + bvirt) + (bvirt - ez);\n bvirt = cx - cex;\n cextail = cx - (cex + bvirt) + (bvirt - ex);\n bvirt = cy - cey;\n ceytail = cy - (cey + bvirt) + (bvirt - ey);\n bvirt = cz - cez;\n ceztail = cz - (cez + bvirt) + (bvirt - ez);\n bvirt = dx - dex;\n dextail = dx - (dex + bvirt) + (bvirt - ex);\n bvirt = dy - dey;\n deytail = dy - (dey + bvirt) + (bvirt - ey);\n bvirt = dz - dez;\n deztail = dz - (dez + bvirt) + (bvirt - ez);\n if (aextail === 0 && aeytail === 0 && aeztail === 0 &&\n bextail === 0 && beytail === 0 && beztail === 0 &&\n cextail === 0 && ceytail === 0 && ceztail === 0 &&\n dextail === 0 && deytail === 0 && deztail === 0) {\n return det;\n }\n\n errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);\n\n const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);\n const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);\n const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);\n const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);\n const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);\n const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);\n det +=\n (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +\n (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *\n ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -\n ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +\n (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *\n ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +\n 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +\n (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -\n ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +\n (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);\n}\n\nexport function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const aexbey = aex * bey;\n const bexaey = bex * aey;\n const ab = aexbey - bexaey;\n const bexcey = bex * cey;\n const cexbey = cex * bey;\n const bc = bexcey - cexbey;\n const cexdey = cex * dey;\n const dexcey = dex * cey;\n const cd = cexdey - dexcey;\n const dexaey = dex * aey;\n const aexdey = aex * dey;\n const da = dexaey - aexdey;\n const aexcey = aex * cey;\n const cexaey = cex * aey;\n const ac = aexcey - cexaey;\n const bexdey = bex * dey;\n const dexbey = dex * bey;\n const bd = bexdey - dexbey;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n const det =\n (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +\n (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));\n\n const aezplus = Math.abs(aez);\n const bezplus = Math.abs(bez);\n const cezplus = Math.abs(cez);\n const dezplus = Math.abs(dez);\n const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);\n const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);\n const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);\n const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);\n const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);\n const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);\n const permanent =\n (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +\n (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +\n (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +\n (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;\n\n const errbound = isperrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);\n}\n\nexport function inspherefast(pax, pay, paz, pbx, pby, pbz, pcx, pcy, pcz, pdx, pdy, pdz, pex, pey, pez) {\n const aex = pax - pex;\n const bex = pbx - pex;\n const cex = pcx - pex;\n const dex = pdx - pex;\n const aey = pay - pey;\n const bey = pby - pey;\n const cey = pcy - pey;\n const dey = pdy - pey;\n const aez = paz - pez;\n const bez = pbz - pez;\n const cez = pcz - pez;\n const dez = pdz - pez;\n\n const ab = aex * bey - bex * aey;\n const bc = bex * cey - cex * bey;\n const cd = cex * dey - dex * cey;\n const da = dex * aey - aex * dey;\n const ac = aex * cey - cex * aey;\n const bd = bex * dey - dex * bey;\n\n const abc = aez * bc - bez * ac + cez * ab;\n const bcd = bez * cd - cez * bd + dez * bc;\n const cda = cez * da + dez * ac + aez * cd;\n const dab = dez * ab + aez * bd + bez * da;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);\n}\n","import {\n BBox,\n Feature,\n FeatureCollection,\n Geometry,\n GeometryCollection,\n GeometryObject,\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n Position,\n GeoJsonProperties,\n} from \"geojson\";\n\nimport { Id } from \"./lib/geojson.js\";\nexport * from \"./lib/geojson.js\";\n\n/**\n * @module helpers\n */\n\n// TurfJS Combined Types\nexport type Coord = Feature<Point> | Point | Position;\n\n/**\n * Linear measurement units.\n *\n * ⚠️ Warning. Be aware of the implications of using radian or degree units to\n * measure distance. The distance represented by a degree of longitude *varies*\n * depending on latitude.\n *\n * See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616\n * for an illustration of this behaviour.\n *\n * @typedef\n */\nexport type Units =\n | \"meters\"\n | \"metres\"\n | \"millimeters\"\n | \"millimetres\"\n | \"centimeters\"\n | \"centimetres\"\n | \"kilometers\"\n | \"kilometres\"\n | \"miles\"\n | \"nauticalmiles\"\n | \"inches\"\n | \"yards\"\n | \"feet\"\n | \"radians\"\n | \"degrees\";\n\n/**\n * Area measurement units.\n *\n * @typedef\n */\nexport type AreaUnits =\n | Exclude<Units, \"radians\" | \"degrees\">\n | \"acres\"\n | \"hectares\";\n\n/**\n * Grid types.\n *\n * @typedef\n */\nexport type Grid = \"point\" | \"square\" | \"hex\" | \"triangle\";\n\n/**\n * Shorthand corner identifiers.\n *\n * @typedef\n */\nexport type Corners = \"sw\" | \"se\" | \"nw\" | \"ne\" | \"center\" | \"centroid\";\n\n/**\n * Geometries made up of lines i.e. lines and polygons.\n *\n * @typedef\n */\nexport type Lines = LineString | MultiLineString | Polygon | MultiPolygon;\n\n/**\n * Convenience type for all possible GeoJSON.\n *\n * @typedef\n */\nexport type AllGeoJSON =\n | Feature\n | FeatureCollection\n | Geometry\n | GeometryCollection;\n\n/**\n * The Earth radius in kilometers. Used by Turf modules that model the Earth as a sphere. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius} was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended } by the Haversine formula (used by turf/distance) to reduce error.\n *\n * @constant\n */\nexport const earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors based on earthRadius.\n *\n * Keys are the name of the unit, values are the number of that unit in a single radian\n *\n * @constant\n */\nexport const factors: Record<Units, number> = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n\n/**\n\n * Area of measurement factors based on 1 square meter.\n *\n * @constant\n */\nexport const areaFactors: Record<AreaUnits, number> = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n nauticalmiles: 2.9155334959812285e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @function\n * @param {GeometryObject} geometry input geometry\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryObject, GeoJsonProperties>} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geom: G | null,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<G, P> {\n const feat: any = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @function\n * @param {(\"Point\" | \"LineString\" | \"Polygon\" | \"MultiPoint\" | \"MultiLineString\" | \"MultiPolygon\")} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(\n type:\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"MultiPoint\"\n | \"MultiLineString\"\n | \"MultiPolygon\",\n coordinates: any[],\n _options: Record<string, never> = {}\n) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @function\n * @param {Position} coordinates longitude, latitude position (each in decimal degrees)\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point, GeoJsonProperties>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Point, P> {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n const geom: Point = {\n type: \"Point\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @function\n * @param {Position[]} coordinates an array of Points\n * @param {GeoJsonProperties} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Point, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon, GeoJsonProperties>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Polygon, P> {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom: Polygon = {\n type: \"Polygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygon coordinates\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon, GeoJsonProperties>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Polygon, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString, GeoJsonProperties>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<LineString, P> {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom: LineString = {\n type: \"LineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString, GeoJsonProperties>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<LineString, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @function\n * @param {Array<Feature<GeometryObject, GeoJsonProperties>>} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection<GeometryObject, GeoJsonProperties>} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n features: Array<Feature<G, P>>,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<G, P> {\n const fc: any = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiLineString}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][]} coordinates an array of LineStrings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString, GeoJsonProperties>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiLineString, P> {\n const geom: MultiLineString = {\n type: \"MultiLineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPoint}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint, GeoJsonProperties>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPoint, P> {\n const geom: MultiPoint = {\n type: \"MultiPoint\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPolygon}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygons\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon, GeoJsonProperties>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPolygon, P> {\n const geom: MultiPolygon = {\n type: \"MultiPolygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a Feature<GeometryCollection> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Array<Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon>} geometries an array of GeoJSON Geometries\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection, GeoJsonProperties>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geometries: Array<\n Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon\n >,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<GeometryCollection, P> {\n const geom: GeometryCollection = {\n type: \"GeometryCollection\",\n geometries,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @function\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num: number, precision = 0): number {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} radians in radians across the sphere\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(\n radians: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(\n distance: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance: number, units?: Units): number {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing: number): number {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n\n/**\n * Converts any azimuth angle from the north line direction (positive clockwise)\n * and returns an angle between -180 and +180 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} angle between 0 and 360 degrees\n * @returns {number} bearing between -180 and +180 degrees\n */\nexport function azimuthToBearing(angle: number): number {\n // Ignore full revolutions (multiples of 360)\n angle = angle % 360;\n\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n\n return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @function\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians: number): number {\n // % (2 * Math.PI) radians in case someone passes value > 2π\n const normalisedRadians = radians % (2 * Math.PI);\n return (normalisedRadians * 180) / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @function\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees: number): number {\n // % 360 degrees in case someone passes value > 360\n const normalisedDegrees = degrees % 360;\n return (normalisedDegrees * Math.PI) / 180;\n}\n\n/**\n * Converts a length from one unit to another.\n *\n * @function\n * @param {number} length Length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] Input length unit\n * @param {Units} [finalUnit=\"kilometers\"] Returned length unit\n * @returns {number} The converted length\n */\nexport function convertLength(\n length: number,\n originalUnit: Units = \"kilometers\",\n finalUnit: Units = \"kilometers\"\n): number {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n\n/**\n * Converts an area from one unit to another.\n *\n * @function\n * @param {number} area Area to be converted\n * @param {AreaUnits} [originalUnit=\"meters\"] Input area unit\n * @param {AreaUnits} [finalUnit=\"kilometers\"] Returned area unit\n * @returns {number} The converted length\n */\nexport function convertArea(\n area: number,\n originalUnit: AreaUnits = \"meters\",\n finalUnit: AreaUnits = \"kilometers\"\n): number {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @function\n * @param {any} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num: any): boolean {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @function\n * @param {any} input variable to validate\n * @returns {boolean} true/false, including false for Arrays and Functions\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input: any): boolean {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {any} bbox BBox to validate\n * @returns {void}\n * @throws {Error} if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox: any): void {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {any} id Id to validate\n * @returns {void}\n * @throws {Error} if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id: any): void {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n","import pip from \"point-in-polygon-hao\";\nimport {\n BBox,\n Feature,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getGeom } from \"@turf/invariant\";\n\n// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule\n// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js\n// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n/**\n * Takes a {@link Point} and a {@link Polygon} or {@link MultiPolygon} and determines if the point\n * resides inside the polygon. The polygon can be convex or concave. The function accounts for holes.\n *\n * @function\n * @param {Coord} point input point\n * @param {Feature<Polygon|MultiPolygon>} polygon input polygon or multipolygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreBoundary=false] True if polygon boundary should be ignored when determining if\n * the point is inside the polygon otherwise false.\n * @returns {boolean} `true` if the Point is inside the Polygon; `false` if the Point is not inside the Polygon\n * @example\n * var pt = turf.point([-77, 44]);\n * var poly = turf.polygon([[\n * [-81, 41],\n * [-81, 47],\n * [-72, 47],\n * [-72, 41],\n * [-81, 41]\n * ]]);\n *\n * turf.booleanPointInPolygon(pt, poly);\n * //= true\n */\nfunction booleanPointInPolygon<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n point: Coord,\n polygon: Feature<G, P> | G,\n options: {\n ignoreBoundary?: boolean;\n } = {}\n) {\n // validation\n if (!point) {\n throw new Error(\"point is required\");\n }\n if (!polygon) {\n throw new Error(\"polygon is required\");\n }\n\n const pt = getCoord(point);\n const geom = getGeom(polygon);\n const type = geom.type;\n const bbox = polygon.bbox;\n let polys: any[] = geom.coordinates;\n\n // Quick elimination if point is not inside bbox\n if (bbox && inBBox(pt, bbox) === false) {\n return false;\n }\n\n if (type === \"Polygon\") {\n polys = [polys];\n }\n let result = false;\n for (var i = 0; i < polys.length; ++i) {\n const polyResult = pip(pt, polys[i]);\n if (polyResult === 0) return options.ignoreBoundary ? false : true;\n else if (polyResult) result = true;\n }\n\n return result;\n}\n\n/**\n * inBBox\n *\n * @private\n * @param {Position} pt point [x,y]\n * @param {BBox} bbox BBox [west, south, east, north]\n * @returns {boolean} true/false if point is inside BBox\n */\nfunction inBBox(pt: number[], bbox: BBox) {\n return (\n bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1]\n );\n}\n\nexport { booleanPointInPolygon };\nexport default booleanPointInPolygon;\n","class TinyQueue {\n constructor(data = [], compare = defaultCompare) {\n this.data = data;\n this.length = this.data.length;\n this.compare = compare;\n\n if (this.length > 0) {\n for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n }\n }\n\n push(item) {\n this.data.push(item);\n this.length++;\n this._up(this.length - 1);\n }\n\n pop() {\n if (this.length === 0) return undefined;\n\n const top = this.data[0];\n const bottom = this.data.pop();\n this.length--;\n\n if (this.length > 0) {\n this.data[0] = bottom;\n this._down(0);\n }\n\n return top;\n }\n\n peek() {\n return this.data[0];\n }\n\n _up(pos) {\n const {data, compare} = this;\n const item = data[pos];\n\n while (pos > 0) {\n const parent = (pos - 1) >> 1;\n const current = data[parent];\n if (compare(item, current) >= 0) break;\n data[pos] = current;\n pos = parent;\n }\n\n data[pos] = item;\n }\n\n _down(pos) {\n const {data, compare} = this;\n const halfLength = this.length >> 1;\n const item = data[pos];\n\n while (pos < halfLength) {\n let left = (pos << 1) + 1;\n let best = data[left];\n const right = left + 1;\n\n if (right < this.length && compare(data[right], best) < 0) {\n left = right;\n best = data[right];\n }\n if (compare(best, item) >= 0) break;\n\n data[pos] = best;\n pos = left;\n }\n\n data[pos] = item;\n }\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction checkWhichEventIsLeft (e1, e2) {\n if (e1.p.x > e2.p.x) return 1\n if (e1.p.x < e2.p.x) return -1\n\n if (e1.p.y !== e2.p.y) return e1.p.y > e2.p.y ? 1 : -1\n return 1\n}\n\nfunction checkWhichSegmentHasRightEndpointFirst (seg1, seg2) {\n if (seg1.rightSweepEvent.p.x > seg2.rightSweepEvent.p.x) return 1\n if (seg1.rightSweepEvent.p.x < seg2.rightSweepEvent.p.x) return -1\n\n if (seg1.rightSweepEvent.p.y !== seg2.rightSweepEvent.p.y) return seg1.rightSweepEvent.p.y < seg2.rightSweepEvent.p.y ? 1 : -1\n return 1\n}\n\nclass Event {\n\n constructor (p, featureId, ringId, eventId) {\n this.p = {\n x: p[0],\n y: p[1]\n };\n this.featureId = featureId;\n this.ringId = ringId;\n this.eventId = eventId;\n\n this.otherEvent = null;\n this.isLeftEndpoint = null;\n }\n\n isSamePoint (eventToCheck) {\n return this.p.x === eventToCheck.p.x && this.p.y === eventToCheck.p.y\n }\n}\n\nfunction fillEventQueue (geojson, eventQueue) {\n if (geojson.type === 'FeatureCollection') {\n const features = geojson.features;\n for (let i = 0; i < features.length; i++) {\n processFeature(features[i], eventQueue);\n }\n } else {\n processFeature(geojson, eventQueue);\n }\n}\n\nlet featureId = 0;\nlet ringId = 0;\nlet eventId = 0;\nfunction processFeature (featureOrGeometry, eventQueue) {\n const geom = featureOrGeometry.type === 'Feature' ? featureOrGeometry.geometry : featureOrGeometry;\n let coords = geom.coordinates;\n // standardise the input\n if (geom.type === 'Polygon' || geom.type === 'MultiLineString') coords = [coords];\n if (geom.type === 'LineString') coords = [[coords]];\n\n for (let i = 0; i < coords.length; i++) {\n for (let ii = 0; ii < coords[i].length; ii++) {\n let currentP = coords[i][ii][0];\n let nextP = null;\n ringId = ringId + 1;\n for (let iii = 0; iii < coords[i][ii].length - 1; iii++) {\n nextP = coords[i][ii][iii + 1];\n\n const e1 = new Event(currentP, featureId, ringId, eventId);\n const e2 = new Event(nextP, featureId, ringId, eventId + 1);\n\n e1.otherEvent = e2;\n e2.otherEvent = e1;\n\n if (checkWhichEventIsLeft(e1, e2) > 0) {\n e2.isLeftEndpoint = true;\n e1.isLeftEndpoint = false;\n } else {\n e1.isLeftEndpoint = true;\n e2.isLeftEndpoint = false;\n }\n eventQueue.push(e1);\n eventQueue.push(e2);\n\n currentP = nextP;\n eventId = eventId + 1;\n }\n }\n }\n featureId = featureId + 1;\n}\n\nclass Segment {\n\n constructor (event) {\n this.leftSweepEvent = event;\n this.rightSweepEvent = event.otherEvent;\n }\n}\n\nfunction testSegmentIntersect (seg1, seg2) {\n if (seg1 === null || seg2 === null) return false\n\n if (seg1.leftSweepEvent.ringId === seg2.leftSweepEvent.ringId &&\n (seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.rightSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.rightSweepEvent))) return false\n\n const x1 = seg1.leftSweepEvent.p.x;\n const y1 = seg1.leftSweepEvent.p.y;\n const x2 = seg1.rightSweepEvent.p.x;\n const y2 = seg1.rightSweepEvent.p.y;\n const x3 = seg2.leftSweepEvent.p.x;\n const y3 = seg2.leftSweepEvent.p.y;\n const x4 = seg2.rightSweepEvent.p.x;\n const y4 = seg2.rightSweepEvent.p.y;\n\n const denom = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));\n const numeA = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));\n const numeB = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3));\n\n if (denom === 0) {\n if (numeA === 0 && numeB === 0) return false\n return false\n }\n\n const uA = numeA / denom;\n const uB = numeB / denom;\n\n if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) {\n const x = x1 + (uA * (x2 - x1));\n const y = y1 + (uA * (y2 - y1));\n return [x, y]\n }\n return false\n}\n\n// import {debugEventAndSegments, debugRemovingSegment} from './debug'\n\nfunction runCheck (eventQueue, ignoreSelfIntersections) {\n ignoreSelfIntersections = ignoreSelfIntersections ? ignoreSelfIntersections : false;\n\n const intersectionPoints = [];\n const outQueue = new TinyQueue([], checkWhichSegmentHasRightEndpointFirst);\n\n while (eventQueue.length) {\n const event = eventQueue.pop();\n if (event.isLeftEndpoint) {\n // debugEventAndSegments(event.p, outQueue.data)\n const segment = new Segment(event);\n for (let i = 0; i < outQueue.data.length; i++) {\n const otherSeg = outQueue.data[i];\n if (ignoreSelfIntersections) {\n if (otherSeg.leftSweepEvent.featureId === event.featureId) continue\n }\n const intersection = testSegmentIntersect(segment, otherSeg);\n if (intersection !== false) intersectionPoints.push(intersection);\n }\n outQueue.push(segment);\n } else if (event.isLeftEndpoint === false) {\n outQueue.pop();\n // const seg = outQueue.pop()\n // debugRemovingSegment(event.p, seg)\n }\n }\n return intersectionPoints\n}\n\nfunction sweeplineIntersections (geojson, ignoreSelfIntersections) {\n const eventQueue = new TinyQueue([], checkWhichEventIsLeft);\n fillEventQueue(geojson, eventQueue);\n return runCheck(eventQueue, ignoreSelfIntersections)\n}\n\nexport default sweeplineIntersections;\n","import {\n Feature,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from \"geojson\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport { flattenEach } from \"@turf/meta\";\nimport { polygonToLine } from \"@turf/polygon-to-line\";\n\n/**\n * Boolean-disjoint returns (TRUE) if the intersection of the two geometries is an empty set.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreSelfIntersections=true] ignore self-intersections on input features\n * @returns {boolean} true if the intersection is an empty set, false otherwise\n * @example\n * var point = turf.point([2, 2]);\n * var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);\n *\n * turf.booleanDisjoint(line, point);\n * //=true\n */\nfunction booleanDisjoint(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n {\n ignoreSelfIntersections = true,\n }: {\n ignoreSelfIntersections?: boolean;\n } = { ignoreSelfIntersections: true }\n): boolean {\n let bool = true;\n flattenEach(feature1, (flatten1) => {\n flattenEach(feature2, (flatten2) => {\n if (bool === false) {\n return false;\n }\n bool = disjoint(\n flatten1.geometry,\n flatten2.geometry,\n ignoreSelfIntersections\n );\n });\n });\n return bool;\n}\n\n/**\n * Disjoint operation for simple Geometries (Point/LineString/Polygon)\n *\n * @private\n * @param {Geometry<any>} geom1 GeoJSON Geometry\n * @param {Geometry<any>} geom2 GeoJSON Geometry\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if disjoint, false otherwise\n */\nfunction disjoint(geom1: any, geom2: any, ignoreSelfIntersections: boolean) {\n switch (geom1.type) {\n case \"Point\":\n switch (geom2.type) {\n case \"Point\":\n return !compareCoords(geom1.coordinates, geom2.coordinates);\n case \"LineString\":\n return !isPointOnLine(geom2, geom1);\n case \"Polygon\":\n return !booleanPointInPolygon(geom1, geom2);\n }\n /* istanbul ignore next */\n break;\n case \"LineString\":\n switch (geom2.type) {\n case \"Point\":\n return !isPointOnLine(geom1, geom2);\n case \"LineString\":\n return !isLineOnLine(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isLineInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n /* istanbul ignore next */\n break;\n case \"Polygon\":\n switch (geom2.type) {\n case \"Point\":\n return !booleanPointInPolygon(geom2, geom1);\n case \"LineString\":\n return !isLineInPoly(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isPolyInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n }\n return false;\n}\n\n// http://stackoverflow.com/a/11908158/1979085\nfunction isPointOnLine(lineString: LineString, pt: Point) {\n for (let i = 0; i < lineString.coordinates.length - 1; i++) {\n if (\n isPointOnLineSegment(\n lineString.coordinates[i],\n lineString.coordinates[i + 1],\n pt.coordinates\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLineOnLine(\n lineString1: LineString,\n lineString2: LineString,\n ignoreSelfIntersections: boolean\n) {\n const doLinesIntersect = lineIntersect(lineString1, lineString2, {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isLineInPoly(\n polygon: Polygon,\n lineString: LineString,\n ignoreSelfIntersections: boolean\n) {\n for (const coord of lineString.coordinates) {\n if (booleanPointInPolygon(coord, polygon)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(lineString, polygonToLine(polygon), {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\n/**\n * Is Polygon (geom1) in Polygon (geom2)\n * Only takes into account outer rings\n * See http://stackoverflow.com/a/4833823/1979085\n *\n * @private\n * @param {Geometry|Feature<Polygon>} feature1 Polygon1\n * @param {Geometry|Feature<Polygon>} feature2 Polygon2\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if geom1 is in geom2, false otherwise\n */\nfunction isPolyInPoly(\n feature1: Polygon,\n feature2: Polygon,\n ignoreSelfIntersections: boolean\n) {\n for (const coord1 of feature1.coordinates[0]) {\n if (booleanPointInPolygon(coord1, feature2)) {\n return true;\n }\n }\n for (const coord2 of feature2.coordinates[0]) {\n if (booleanPointInPolygon(coord2, feature1)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(\n polygonToLine(feature1),\n polygonToLine(feature2),\n { ignoreSelfIntersections }\n );\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isPointOnLineSegment(\n lineSegmentStart: Position,\n lineSegmentEnd: Position,\n pt: Position\n) {\n const dxc = pt[0] - lineSegmentStart[0];\n const dyc = pt[1] - lineSegmentStart[1];\n const dxl = lineSegmentEnd[0] - lineSegmentStart[0];\n const dyl = lineSegmentEnd[1] - lineSegmentStart[1];\n const cross = dxc * dyl - dyc * dxl;\n if (cross !== 0) {\n return false;\n }\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n if (dxl > 0) {\n return lineSegmentStart[0] <= pt[0] && pt[0] <= lineSegmentEnd[0];\n } else {\n return lineSegmentEnd[0] <= pt[0] && pt[0] <= lineSegmentStart[0];\n }\n } else if (dyl > 0) {\n return lineSegmentStart[1] <= pt[1] && pt[1] <= lineSegmentEnd[1];\n } else {\n return lineSegmentEnd[1] <= pt[1] && pt[1] <= lineSegmentStart[1];\n }\n}\n\n/**\n * compareCoords\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {boolean} true if coord pairs match, false otherwise\n */\nfunction compareCoords(pair1: Position, pair2: Position) {\n return pair1[0] === pair2[0] && pair1[1] === pair2[1];\n}\n\nexport { booleanDisjoint };\nexport default booleanDisjoint;\n","import type {\n RasterTile,\n SpatialFilter,\n SpatialIndexTile,\n Tile,\n} from '../types.js';\nimport {tileFeaturesGeometries} from './tileFeaturesGeometries.js';\nimport {tileFeaturesSpatialIndex} from './tileFeaturesSpatialIndex.js';\nimport {TileFormat} from '../constants.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {RasterMetadata, SpatialDataType} from '../sources/types.js';\nimport {isRasterTile, tileFeaturesRaster} from './tileFeaturesRaster.js';\nimport {assert} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatures = {\n tiles: Tile[];\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n rasterMetadata?: RasterMetadata;\n storeGeometry?: boolean;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatureExtractOptions = {\n storeGeometry?: boolean;\n spatialDataType?: SpatialDataType;\n spatialDataColumn?: string;\n uniqueIdProperty?: string;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function tileFeatures({\n tiles,\n spatialFilter,\n uniqueIdProperty,\n tileFormat,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialDataType,\n rasterMetadata,\n storeGeometry = false,\n}: TileFeatures): FeatureData[] {\n if (spatialDataType === 'geo') {\n return tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options: {storeGeometry},\n });\n }\n\n if (tiles.some(isRasterTile)) {\n assert(rasterMetadata, 'Missing raster metadata');\n return tileFeaturesRaster({\n tiles: tiles as RasterTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n rasterMetadata,\n });\n }\n\n return tileFeaturesSpatialIndex({\n tiles: tiles as SpatialIndexTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n });\n}\n","import intersects from '@turf/boolean-intersects';\nimport {transformTileCoordsToWGS84} from '../utils/transformTileCoordsToWGS84.js';\nimport {TileFormat} from '../constants.js';\nimport type {\n BBox,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from 'geojson';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n BinaryAttribute,\n BinaryFeature,\n BinaryGeometryType,\n BinaryLineFeature,\n BinaryPointFeature,\n BinaryPolygonFeature,\n TypedArrayConstructor,\n} from '@loaders.gl/schema';\nimport {intersectTileGeometry} from './tileIntersection.js';\n\nexport const FEATURE_GEOM_PROPERTY = '__geomValue';\n\ntype TileMap = Map<unknown, unknown>;\n\ntype TileDataInternal = {\n uniqueId: string | number | undefined;\n properties: any;\n numericProps: Record<string, number>;\n};\n\ntype GeometryExtractOptions = {\n storeGeometry?: boolean;\n};\n\nexport function tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options,\n}: {\n tiles: Tile[];\n tileFormat?: TileFormat;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}): FeatureData[] {\n const map = new Map();\n\n for (const tile of tiles) {\n // Discard if it's not a visible tile (only check false value, not undefined)\n // or tile has not data\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n const tileBbox = [\n tile.bbox.west,\n tile.bbox.south,\n tile.bbox.east,\n tile.bbox.north,\n ] as BBox;\n\n const intersection = intersectTileGeometry(\n tileBbox,\n tileFormat,\n spatialFilter\n );\n\n if (intersection === false) continue;\n\n const transformedSpatialFilter =\n intersection === true ? undefined : intersection;\n\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.points!,\n type: 'Point',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.lines!,\n type: 'LineString',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.polygons!,\n type: 'Polygon',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n return Array.from(map.values());\n}\n\nfunction processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n}: {\n map: TileMap;\n data: BinaryFeature;\n startIndex: number;\n endIndex: number;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n storeGeometry: boolean;\n spatialFilter?: Geometry;\n}) {\n const tileProps = getPropertiesFromTile(data, startIndex);\n const uniquePropertyValue = getUniquePropertyValue(\n tileProps,\n uniqueIdProperty,\n map\n );\n\n if (!uniquePropertyValue || map.has(uniquePropertyValue)) {\n return;\n }\n let geometry: Geometry | null = null;\n\n // Only calculate geometry if necessary\n if (storeGeometry || spatialFilter) {\n const {positions} = data;\n const ringCoordinates = getRingCoordinatesFor(\n startIndex,\n endIndex,\n positions\n );\n geometry = getFeatureByType(ringCoordinates, type);\n }\n\n // If intersection is required, check before proceeding\n if (geometry && spatialFilter && !intersects(geometry, spatialFilter)) {\n return;\n }\n\n const properties = parseProperties(tileProps);\n\n // Only save geometry if necessary\n if (storeGeometry && geometry) {\n properties[FEATURE_GEOM_PROPERTY] =\n tileFormat === TileFormat.MVT\n ? transformTileCoordsToWGS84(geometry, bbox)\n : geometry;\n }\n map.set(uniquePropertyValue, properties);\n}\n\nfunction addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n spatialFilter: Geometry;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n });\n }\n}\n\n// Despite TypeScript, 'data.type' is OPTIONAL. So 'type' must be passed in\n// separately. Observed missing .type for Redshift tilesets, 2025-04-09.\nfunction getIndices(data: BinaryFeature, type: BinaryGeometryType) {\n let indices: BinaryAttribute;\n switch (type) {\n case 'Polygon':\n indices = (data as BinaryPolygonFeature).primitivePolygonIndices;\n break;\n case 'LineString':\n indices = (data as BinaryLineFeature).pathIndices;\n break;\n case 'Point':\n indices = createIndicesForPoints(data as BinaryPointFeature);\n break;\n default:\n throw new Error(\n `Unsupported geometry type: ${type as unknown as string}`\n );\n }\n return indices.value;\n}\n\nfunction getFeatureId(data: BinaryFeature, startIndex: number) {\n return data.featureIds.value[startIndex];\n}\n\nfunction getPropertiesFromTile(data: BinaryFeature, startIndex: number) {\n const featureId = getFeatureId(data, startIndex);\n const {properties, numericProps, fields} = data;\n const result: TileDataInternal = {\n uniqueId: (fields?.[featureId] as {id: string | number})?.id,\n properties: properties[featureId],\n numericProps: {},\n };\n\n for (const key in numericProps) {\n result.numericProps[key] = numericProps[key].value[startIndex];\n }\n\n return result;\n}\n\nfunction parseProperties(tileProps: TileDataInternal) {\n const {properties, numericProps} = tileProps;\n return Object.assign({}, properties, numericProps);\n}\n\nfunction getUniquePropertyValue(\n tileProps: TileDataInternal,\n uniqueIdProperty: string | undefined,\n map: TileMap\n) {\n if (uniqueIdProperty) {\n return getValueFromTileProps(tileProps, uniqueIdProperty);\n }\n\n if (tileProps.uniqueId) {\n return tileProps.uniqueId;\n }\n\n const artificialId = map.size + 1; // a counter, assumed as a valid new id\n return (\n getValueFromTileProps(tileProps, 'cartodb_id') ||\n getValueFromTileProps(tileProps, 'geoid') ||\n artificialId\n );\n}\n\nfunction getValueFromTileProps(\n tileProps: TileDataInternal,\n propertyName: string\n) {\n const {properties, numericProps} = tileProps;\n return numericProps[propertyName] || properties[propertyName];\n}\n\nfunction getFeatureByType(\n coordinates: Position[],\n type: BinaryGeometryType\n): Polygon | LineString | Point {\n switch (type) {\n case 'Polygon':\n return {type: 'Polygon', coordinates: [coordinates]};\n case 'LineString':\n return {type: 'LineString', coordinates};\n case 'Point':\n return {type: 'Point', coordinates: coordinates[0]};\n default:\n throw new Error('Invalid geometry type');\n }\n}\n\nfunction getRingCoordinatesFor(\n startIndex: number,\n endIndex: number,\n positions: BinaryAttribute\n) {\n const ringCoordinates = [];\n\n for (let j = startIndex; j < endIndex; j++) {\n ringCoordinates.push(\n Array.from(\n positions.value.subarray(j * positions.size, (j + 1) * positions.size)\n )\n );\n }\n\n return ringCoordinates;\n}\n\nfunction calculateFeatures({\n map,\n spatialFilter,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n spatialFilter?: SpatialFilter;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n if (!data?.properties.length) {\n return;\n }\n\n if (!spatialFilter) {\n addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n } else {\n addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n}\n\nfunction addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n });\n }\n}\n\n/**\n * BinaryPointFeature does not include indices, so we generate in-memory\n * indices to allow processing points similarly to other topologies.\n */\nfunction createIndicesForPoints(data: BinaryPointFeature): BinaryAttribute {\n const featureIds = data.featureIds.value;\n const lastFeatureId = featureIds[featureIds.length - 1];\n const PointIndicesArray = featureIds.constructor as TypedArrayConstructor;\n\n const pointIndices: BinaryAttribute = {\n value: new PointIndicesArray(featureIds.length + 1),\n size: 1,\n };\n pointIndices.value.set(featureIds);\n pointIndices.value.set([lastFeatureId + 1], featureIds.length);\n return pointIndices;\n}\n","import {lerp} from '@math.gl/core';\nimport {lngLatToWorld, worldToLngLat} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform tile coords to WGS84 coordinates.\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformTileCoordsToWGS84<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = lngLatToWorld([west, north]);\n const se = lngLatToWorld([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = lerp(nw[0], se[0], pointX);\n const y = lerp(nw[1], se[1], pointY);\n\n return worldToLngLat([x, y]);\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(g, bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n","// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// types\nexport type {\n TypedArray,\n TypedArrayConstructor,\n NumericArray,\n NumberArray,\n NumberArray2,\n NumberArray3,\n NumberArray4,\n NumberArray6,\n NumberArray8,\n NumberArray9,\n NumberArray12,\n NumberArray16\n} from '@math.gl/types';\n\nexport type {isTypedArray, isNumberArray, isNumericArray} from '@math.gl/types';\n\n// classes\nexport {Vector2} from './classes/vector2';\nexport {Vector3} from './classes/vector3';\nexport {Vector4} from './classes/vector4';\nexport {Matrix3} from './classes/matrix3';\nexport {Matrix4} from './classes/matrix4';\nexport {Quaternion} from './classes/quaternion';\n\nexport type {Vector2Like} from './classes/vector2';\nexport type {Vector3Like} from './classes/vector3';\nexport type {Vector4Like} from './classes/vector4';\nexport type {Matrix3Like} from './classes/matrix3';\nexport type {Matrix4Like} from './classes/matrix4';\n\n// experimental\nexport {SphericalCoordinates} from './classes/spherical-coordinates';\nexport {Pose} from './classes/pose';\nexport {Euler} from './classes/euler';\n\nexport * as _MathUtils from './lib/math-utils';\n\n// lib\nexport {assert} from './lib/assert';\n\nexport {\n // math.gl global utility methods\n config,\n configure,\n formatValue,\n isArray,\n clone,\n equals,\n exactEquals,\n toRadians,\n toDegrees,\n // math.gl \"GLSL\"-style functions\n radians,\n degrees,\n sin,\n cos,\n tan,\n asin,\n acos,\n atan,\n clamp,\n lerp,\n withEpsilon\n} from './lib/common';\n\n// DEPRECATED\nexport {SphericalCoordinates as _SphericalCoordinates} from './classes/spherical-coordinates';\nexport {Pose as _Pose} from './classes/pose';\nexport {Euler as _Euler} from './classes/euler';\n\n/** @deprecated Use Matrix3 */\nexport * as mat3 from './gl-matrix/mat3';\n/** @deprecated Use Matrix4 */\nexport * as mat4 from './gl-matrix/mat4';\n/** @deprecated Use Quaterinion */\nexport * as quat from './gl-matrix/quat';\n/** @deprecated UseVector */\nexport * as vec2 from './gl-matrix/vec2';\n/** @deprecated Use Vector3 */\nexport * as vec3 from './gl-matrix/vec3';\n/** @deprecated Use Vector4 */\nexport * as vec4 from './gl-matrix/vec4';\n","// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-shadow */ // radians and degrees are common variable names\n\nimport type {NumericArray} from '@math.gl/types';\n\nimport type {MathArray} from '../classes/base/math-array';\n\nconst RADIANS_TO_DEGREES = (1 / Math.PI) * 180;\nconst DEGREES_TO_RADIANS = (1 / 180) * Math.PI;\n\nexport type ConfigurationOptions = {\n EPSILON: number;\n debug?: boolean;\n precision: number;\n printTypes?: boolean;\n printDegrees?: boolean;\n printRowMajor?: boolean;\n _cartographicRadians?: boolean;\n};\n\nconst DEFAULT_CONFIG: Required<ConfigurationOptions> = {\n EPSILON: 1e-12,\n debug: false,\n precision: 4,\n printTypes: false,\n printDegrees: false,\n printRowMajor: true,\n _cartographicRadians: false\n};\n\n// We use a global field to store the config\ndeclare global {\n // eslint-disable-next-line no-var\n var mathgl: {\n config: Required<ConfigurationOptions>;\n };\n}\n\n// Configuration is truly global as of v3.6 to ensure single config even if multiple copies of math.gl\n// Multiple copies of config can be quite tricky to debug...\nglobalThis.mathgl = globalThis.mathgl || {config: {...DEFAULT_CONFIG}};\n\nexport const config = globalThis.mathgl.config;\n\nexport function configure(options: Partial<ConfigurationOptions>): ConfigurationOptions {\n // Only copy existing keys\n Object.assign(config, options);\n return config;\n}\n\n/**\n * Formats a value into a string\n * @param value\n * @param param1\n * @returns\n */\nexport function formatValue(\n value: number,\n {precision = config.precision}: {precision?: number} = {}\n): string {\n value = round(value);\n // get rid of trailing zeros\n return `${parseFloat(value.toPrecision(precision))}`;\n}\n\n/**\n * Check if value is an \"array\"\n * Returns `true` if value is either an array or a typed array\n * Note: returns `false` for `ArrayBuffer` and `DataView` instances\n * @note isTypedArray and isNumericArray are often more useful in TypeScript\n */\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value) || (ArrayBuffer.isView(value) && !(value instanceof DataView));\n}\n\nexport function clone(array: NumericArray | MathArray): NumericArray {\n return 'clone' in array ? array.clone() : array.slice();\n}\n\nexport function toRadians(degrees: number): number;\nexport function toRadians(degrees: NumericArray): NumericArray;\n\nexport function toRadians(degrees: number | NumericArray): number | NumericArray {\n return radians(degrees as NumericArray);\n}\n\nexport function toDegrees(degrees: number): number;\nexport function toDegrees(degrees: NumericArray): NumericArray;\n\nexport function toDegrees(radians: number | NumericArray): number | NumericArray {\n return degrees(radians as NumericArray);\n}\n\n// GLSL math function equivalents - Works on both single values and vectors\n\n/**\n * \"GLSL equivalent\" radians: Works on single values and vectors\n */\nexport function radians(degrees: number): number;\nexport function radians(degrees: NumericArray, result?: NumericArray): NumericArray;\n\nexport function radians(\n degrees: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(degrees, (degrees) => degrees * DEGREES_TO_RADIANS, result);\n}\n\n/**\n * \"GLSL equivalent\" degrees: Works on single values and vectors\n */\nexport function degrees(radians: number): number;\nexport function degrees(radians: NumericArray, result?: NumericArray): NumericArray;\n\nexport function degrees(\n radians: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(radians, (radians) => radians * RADIANS_TO_DEGREES, result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.sin`: Works on single values and vectors\n * @deprecated\n */\nexport function sin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.sin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.cos`: Works on single values and vectors\n * @deprecated\n */\nexport function cos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.cos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.tan`: Works on single values and vectors\n * @deprecated\n */\nexport function tan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.tan(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.asin`: Works on single values and vectors\n * @deprecated\n */\nexport function asin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.asin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.acos`: Works on single values and vectors\n * @deprecated\n */\nexport function acos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.acos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.atan`: Works on single values and vectors\n * @deprecated\n */\nexport function atan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.atan(angle), result);\n}\n\n/**\n * GLSL style value clamping: Works on single values and vectors\n */\nexport function clamp(value: number, min: number, max: number): number;\nexport function clamp(value: NumericArray, min: number, max: number): NumericArray;\n\nexport function clamp(\n value: number | NumericArray,\n min: number,\n max: number\n): number | NumericArray {\n return map(value, (value) => Math.max(min, Math.min(max, value)));\n}\n\n/**\n * Interpolate between two numbers or two arrays\n */\nexport function lerp(a: number, b: number, t: number): number;\nexport function lerp(a: NumericArray, b: NumericArray, t: number): NumericArray;\n\nexport function lerp(\n a: number | NumericArray,\n b: number | NumericArray,\n t: number\n): number | NumericArray {\n if (isArray(a)) {\n return (a as NumericArray).map((ai: number, i: number) => lerp(ai, (b as NumericArray)[i], t));\n }\n return t * (b as number) + (1 - t) * (a as number);\n}\n\n/* eslint-disable */\n\n/**\n * Compares any two math objects, using `equals` method if available.\n * @param a\n * @param b\n * @param epsilon\n * @returns\n */\nexport function equals(a: any, b: any, epsilon?: number): boolean {\n const oldEpsilon = config.EPSILON;\n if (epsilon) {\n config.EPSILON = epsilon;\n }\n try {\n if (a === b) {\n return true;\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n // eslint-disable-next-line max-depth\n if (!equals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n if (a && a.equals) {\n return a.equals(b);\n }\n if (b && b.equals) {\n return b.equals(a);\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.abs(a - b) <= config.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));\n }\n return false;\n } finally {\n config.EPSILON = oldEpsilon;\n }\n}\n\nexport function exactEquals(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n if (a && typeof a === 'object' && b && typeof b === 'object') {\n if (a.constructor !== b.constructor) {\n return false;\n }\n if (a.exactEquals) {\n return a.exactEquals(b);\n }\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (!exactEquals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\n/* eslint-enable */\n\nexport function withEpsilon<T>(epsilon: number, func: () => T): T {\n const oldPrecision = config.EPSILON;\n config.EPSILON = epsilon;\n let value: T;\n try {\n value = func();\n } finally {\n config.EPSILON = oldPrecision;\n }\n return value;\n}\n\n// HELPERS\n\nfunction round(value: number): number {\n return Math.round(value / config.EPSILON) * config.EPSILON;\n}\n\n// If the array has a clone function, calls it, otherwise returns a copy\nfunction duplicateArray(array: NumericArray): NumericArray {\n // @ts-expect-error We check for math.gl class methods\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return array.clone ? (array.clone() as NumericArray) : (new Array(array.length) as number[]);\n}\n\n// If the argument value is an array, applies the func element wise,\n// otherwise applies func to the argument value\nfunction map(\n value: number | NumericArray,\n func: (x: number, index?: number, resultArray?: NumericArray) => number,\n result?: NumericArray\n): number | NumericArray {\n if (isArray(value)) {\n const array = value as NumericArray;\n result = result || duplicateArray(array);\n for (let i = 0; i < result.length && i < array.length; ++i) {\n const val = typeof value === 'number' ? value : value[i];\n result[i] = func(val, i, result);\n }\n return result;\n }\n return func(value as number);\n}\n","// Classic web-mercator-project\nexport {WebMercatorViewport} from './web-mercator-viewport';\n\nexport {getBounds} from './get-bounds';\nexport {fitBounds} from './fit-bounds';\nexport {normalizeViewportProps} from './normalize-viewport-props';\nexport {flyToViewport, getFlyToDuration} from './fly-to-viewport';\n\nexport {\n MAX_LATITUDE,\n lngLatToWorld,\n worldToLngLat,\n worldToPixels,\n pixelsToWorld,\n zoomToScale,\n scaleToZoom,\n altitudeToFovy,\n fovyToAltitude,\n getMeterZoom,\n unitsPerMeter,\n getDistanceScales,\n addMetersToLngLat,\n getViewMatrix,\n getProjectionMatrix,\n getProjectionParameters\n} from './web-mercator-utils';\n\n/** Types */\nexport type {FitBoundsOptions} from './fit-bounds';\nexport type {DistanceScales} from './web-mercator-utils';\n\n/** @deprecated default export */\nexport {WebMercatorViewport as default} from './web-mercator-viewport';\n","// View and Projection Matrix calculations for mapbox-js style map view properties\nimport {createMat4} from './math-utils';\n\nimport {\n zoomToScale,\n pixelsToWorld,\n lngLatToWorld,\n worldToLngLat,\n worldToPixels,\n altitudeToFovy,\n fovyToAltitude,\n DEFAULT_ALTITUDE,\n getProjectionMatrix,\n getDistanceScales,\n getViewMatrix,\n DistanceScales\n} from './web-mercator-utils';\nimport {fitBounds} from './fit-bounds';\nimport {getBounds} from './get-bounds';\nimport type {FitBoundsOptions} from './fit-bounds';\n\nimport {mat4, vec2, vec3} from '@math.gl/core';\n\n/**\n * @param width=1 - Width of \"viewport\" or window\n * @param height=1 - Height of \"viewport\" or window\n * @param scale=1 - Either use scale or zoom\n * @param pitch=0 - Camera angle in degrees (0 is straight down)\n * @param bearing=0 - Map rotation in degrees (0 means north is up)\n * @param fovy= - Field of view of camera in degrees\n * @param altitude= - Altitude of camera in screen units \n *\n * Web mercator projection short-hand parameters\n * @param latitude - Center of viewport on map\n * @param longitude - Center of viewport on map\n * @param zoom - Scale = Math.pow(2,zoom) on map\n\n * Notes:\n * - Only one of center or [latitude, longitude] can be specified\n * - [latitude, longitude] can only be specified when \"mercator\" is true\n * - Altitude has a default value that matches assumptions in mapbox-gl\n * - Field of view is independent from altitude, provide `altitudeToFovy(1.5)` (default value) to match assumptions in mapbox-gl\n * - width and height are forced to 1 if supplied as 0, to avoid\n * division by zero. This is intended to reduce the burden of apps to\n * to check values before instantiating a Viewport.\n */\nexport type WebMercatorViewportProps = {\n // Map state\n width: number;\n height: number;\n latitude?: number;\n longitude?: number;\n position?: number[];\n zoom?: number;\n pitch?: number;\n bearing?: number;\n altitude?: number;\n fovy?: number;\n nearZMultiplier?: number;\n farZMultiplier?: number;\n};\n\n/**\n * The WebMercatorViewport class creates\n * - view/projection matrices\n * - \"uniform values\" (for shaders) from mercator params\n *\n * Note: Instances are immutable in the sense that they only have accessors.\n * A new viewport instance should be created if any parameters have changed.\n */\nexport class WebMercatorViewport {\n readonly latitude: number;\n readonly longitude: number;\n readonly zoom: number;\n readonly pitch: number;\n readonly bearing: number;\n readonly altitude: number;\n readonly fovy: number;\n\n readonly meterOffset: number[];\n readonly center: number[];\n\n readonly width: number;\n readonly height: number;\n readonly scale: number;\n readonly distanceScales: DistanceScales;\n\n readonly viewMatrix: number[];\n readonly projectionMatrix: number[];\n\n viewProjectionMatrix: number[];\n pixelProjectionMatrix: number[];\n pixelUnprojectionMatrix: number[];\n\n /**\n * @classdesc\n * Creates view/projection matrices from mercator params\n * Note: The Viewport is immutable in the sense that it only has accessors.\n * A new viewport instance should be created if any parameters have changed.\n */\n // eslint-disable-next-line max-statements\n constructor(props: WebMercatorViewportProps = {width: 1, height: 1}) {\n let {\n // Map state\n width,\n height,\n altitude = null,\n fovy = null\n } = props;\n const {\n latitude = 0,\n longitude = 0,\n zoom = 0,\n pitch = 0,\n bearing = 0,\n position = null,\n nearZMultiplier = 0.02,\n farZMultiplier = 1.01\n } = props;\n\n // Silently allow apps to send in 0,0 to facilitate isomorphic render etc\n width = width || 1;\n height = height || 1;\n\n // `fovy` & `altitude` are independent parameters, one for the\n // projection and the latter for the view matrix. In the past,\n // the `fovy` was always derived from the `altitude`\n if (fovy === null && altitude === null) {\n altitude = DEFAULT_ALTITUDE;\n fovy = altitudeToFovy(altitude);\n } else if (fovy === null) {\n fovy = altitudeToFovy(altitude);\n } else if (altitude === null) {\n altitude = fovyToAltitude(fovy);\n }\n\n const scale = zoomToScale(zoom);\n // Altitude - prevent division by 0\n // TODO - just throw an Error instead?\n altitude = Math.max(0.75, altitude);\n\n const distanceScales = getDistanceScales({longitude, latitude});\n\n const center: number[] = lngLatToWorld([longitude, latitude]);\n center.push(0);\n\n if (position) {\n vec3.add(center, center, vec3.mul([], position, distanceScales.unitsPerMeter));\n }\n\n this.projectionMatrix = getProjectionMatrix({\n width,\n height,\n scale,\n center,\n pitch,\n fovy,\n nearZMultiplier,\n farZMultiplier\n });\n\n this.viewMatrix = getViewMatrix({\n height,\n scale,\n center,\n pitch,\n bearing,\n altitude\n });\n\n // Save parameters\n this.width = width;\n this.height = height;\n this.scale = scale;\n\n this.latitude = latitude;\n this.longitude = longitude;\n this.zoom = zoom;\n this.pitch = pitch;\n this.bearing = bearing;\n this.altitude = altitude;\n this.fovy = fovy;\n this.center = center;\n this.meterOffset = position || [0, 0, 0];\n\n this.distanceScales = distanceScales;\n\n this._initMatrices();\n\n Object.freeze(this);\n }\n\n _initMatrices(): void {\n const {width, height, projectionMatrix, viewMatrix} = this;\n\n // Note: As usual, matrix operations should be applied in \"reverse\" order\n // since vectors will be multiplied in from the right during transformation\n const vpm = createMat4();\n mat4.multiply(vpm, vpm, projectionMatrix);\n mat4.multiply(vpm, vpm, viewMatrix);\n this.viewProjectionMatrix = vpm;\n\n // Calculate matrices and scales needed for projection\n /**\n * Builds matrices that converts preprojected lngLats to screen pixels\n * and vice versa.\n * Note: Currently returns bottom-left coordinates!\n * Note: Starts with the GL projection matrix and adds steps to the\n * scale and translate that matrix onto the window.\n * Note: WebGL controls clip space to screen projection with gl.viewport\n * and does not need this step.\n */\n const m = createMat4();\n\n // matrix for conversion from location to screen coordinates\n mat4.scale(m, m, [width / 2, -height / 2, 1]);\n mat4.translate(m, m, [1, -1, 0]);\n mat4.multiply(m, m, vpm);\n\n const mInverse = mat4.invert(createMat4(), m);\n if (!mInverse) {\n throw new Error('Pixel project matrix not invertible');\n }\n\n this.pixelProjectionMatrix = m;\n this.pixelUnprojectionMatrix = mInverse;\n }\n\n /** Two viewports are equal if width and height are identical, and if\n * their view and projection matrices are (approximately) equal.\n */\n equals = (viewport: WebMercatorViewport | null): boolean => {\n if (!(viewport instanceof WebMercatorViewport)) {\n return false;\n }\n\n return (\n viewport.width === this.width &&\n viewport.height === this.height &&\n mat4.equals(viewport.projectionMatrix, this.projectionMatrix) &&\n mat4.equals(viewport.viewMatrix, this.viewMatrix)\n );\n };\n\n /**\n * Projects xyz (possibly latitude and longitude) to pixel coordinates in window\n * using viewport projection parameters\n * - [longitude, latitude] to [x, y]\n * - [longitude, latitude, Z] => [x, y, z]\n * Note: By default, returns top-left coordinates for canvas/SVG type render\n *\n * @param lngLatZ - [lng, lat] or [lng, lat, Z]\n * @param options - options\n * @param options.topLeft=true - Whether projected coords are top left\n * @return - screen coordinates [x, y] or [x, y, z], z as pixel depth\n */\n project = (lngLatZ: number[], options: {topLeft?: boolean} = {}): number[] => {\n const {topLeft = true} = options;\n const worldPosition = this.projectPosition(lngLatZ);\n const coord = worldToPixels(worldPosition, this.pixelProjectionMatrix);\n\n const [x, y] = coord;\n const y2 = topLeft ? y : this.height - y;\n return lngLatZ.length === 2 ? [x, y2] : [x, y2, coord[2]];\n };\n\n /**\n * Unproject pixel coordinates on screen onto world coordinates, possibly `[lon, lat]` on map.\n *\n * - [x, y] => [lng, lat]\n * - [x, y, z] => [lng, lat, Z]\n *\n * @param xyz - screen coordinates, z as pixel depth\n * @param options - options\n * @param options.topLeft=true - Whether projected coords are top left\n * @param options.targetZ=0 - If pixel depth is unknown, targetZ is used as\n * the elevation plane to unproject onto\n * @return - [lng, lat, Z] or [X, Y, Z]\n */\n unproject = (xyz: number[], options: {topLeft?: boolean; targetZ?: number} = {}): number[] => {\n const {topLeft = true, targetZ = undefined} = options;\n const [x, y, z] = xyz;\n\n const y2 = topLeft ? y : this.height - y;\n const targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n const coord = pixelsToWorld([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n const [X, Y, Z] = this.unprojectPosition(coord);\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n return Number.isFinite(targetZ) ? [X, Y, targetZ] : [X, Y];\n };\n\n // NON_LINEAR PROJECTION HOOKS\n // Used for web meractor projection\n\n projectPosition = (xyz: number[]): [number, number, number] => {\n const [X, Y] = lngLatToWorld(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n return [X, Y, Z];\n };\n\n unprojectPosition = (xyz: number[]): [number, number, number] => {\n const [X, Y] = worldToLngLat(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n return [X, Y, Z];\n };\n\n /**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n *\n * @param lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return [x,y] coordinates.\n */\n projectFlat(lngLat: number[]): number[] {\n return lngLatToWorld(lngLat);\n }\n\n /**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n *\n * @param xy - array with [x,y] members\n * representing point on projected map plane\n * @return - array with [lat,lon] of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\n unprojectFlat(xy: number[]): number[] {\n return worldToLngLat(xy);\n }\n\n /**\n * Get the map center that place a given [lng, lat] coordinate at screen point [x, y]\n * @param opt\n * @param opt.lngLat - [lng,lat] coordinates\n * Specifies a point on the sphere.\n * @param opt.pos - [x,y] coordinates\n * Specifies a point on the screen.\n * @return [lng,lat] new map center.\n */\n getMapCenterByLngLatPosition({lngLat, pos}: {lngLat: number[]; pos: number[]}): number[] {\n const fromLocation = pixelsToWorld(pos, this.pixelUnprojectionMatrix);\n const toLocation = lngLatToWorld(lngLat);\n const translate = vec2.add([], toLocation, vec2.negate([], fromLocation));\n const newCenter = vec2.add([], this.center, translate);\n return worldToLngLat(newCenter);\n }\n\n /**\n * Returns a new viewport that fit around the given rectangle.\n * Only supports non-perspective mode.\n * @param bounds - [[lon, lat], [lon, lat]]\n * @param [options]\n * @param [options.padding] - The amount of padding in pixels to add to the given bounds.\n * @param [options.offset] - The center of the given bounds relative to the map's center,\n * [x, y] measured in pixels.\n * @returns {WebMercatorViewport}\n */\n fitBounds(\n bounds: [[number, number], [number, number]],\n options: Omit<FitBoundsOptions, 'width' | 'height' | 'bounds'> = {}\n ): WebMercatorViewport {\n const {width, height} = this;\n const {longitude, latitude, zoom} = fitBounds(Object.assign({width, height, bounds}, options));\n return new WebMercatorViewport({width, height, longitude, latitude, zoom});\n }\n\n /**\n * Returns the bounding box of the viewport.\n * @param [options]\n * @param [options.z] - The altitude at which the bounds should be calculated.\n * @returns {Array} bounds - [[lon, lat], [lon, lat]]\n */\n getBounds(options?: {z?: number}): number[][] {\n const corners = this.getBoundingRegion(options);\n\n const west = Math.min(...corners.map((p) => p[0]));\n const east = Math.max(...corners.map((p) => p[0]));\n const south = Math.min(...corners.map((p) => p[1]));\n const north = Math.max(...corners.map((p) => p[1]));\n return [\n [west, south],\n [east, north]\n ];\n }\n\n /**\n * Returns the bounding box of the viewport.\n * @param [options]\n * @param [options.z] - The altitude at which the bounds should be calculated.\n * @returns {Array} an array of 4 points that define the visible region\n */\n getBoundingRegion(options: {z?: number} = {}): number[][] {\n return getBounds(this, options.z || 0);\n }\n\n // DEPRECATED\n\n /** @deprecated Legacy method name */\n getLocationAtPoint({lngLat, pos}: {lngLat: number[]; pos: number[]}): number[] {\n return this.getMapCenterByLngLatPosition({lngLat, pos});\n }\n}\n","import {vec4} from '@math.gl/core';\n\n// Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()\nexport function createMat4(): number[] {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\n// Transforms a vec4 with a projection matrix\nexport function transformVector(matrix: number[], vector: number[]): number[] {\n const result = vec4.transformMat4([] as number[], vector, matrix);\n vec4.scale(result, result, 1 / result[3]);\n return result;\n}\n\nexport function mod(value: number, divisor: number): number {\n const modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\n\nexport function lerp(start: number, end: number, step: number): number {\n return step * end + (1 - step) * start;\n}\n\nexport function clamp(x: number, min: number, max: number): number {\n return x < min ? min : x > max ? max : x;\n}\n\nfunction ieLog2(x: number): number {\n return Math.log(x) * Math.LOG2E;\n}\n// Handle missing log2 in IE 11\nexport const log2 = Math.log2 || ieLog2;\n","// TODO - THE UTILITIES IN THIS FILE SHOULD BE IMPORTED FROM WEB-MERCATOR-VIEWPORT MODULE\n\nimport {createMat4, transformVector, clamp, log2} from './math-utils';\n\nimport {mat4, vec2, vec3} from '@math.gl/core';\nimport {assert} from './assert';\n\n// CONSTANTS\nconst PI = Math.PI;\nconst PI_4 = PI / 4;\nconst DEGREES_TO_RADIANS = PI / 180;\nconst RADIANS_TO_DEGREES = 180 / PI;\nconst TILE_SIZE = 512;\n// Average circumference (40075 km equatorial, 40007 km meridional)\nconst EARTH_CIRCUMFERENCE = 40.03e6;\n// Latitude that makes a square world, 2 * atan(E ** PI) - PI / 2\nexport const MAX_LATITUDE = 85.051129;\n\n// Mapbox default altitude\nexport const DEFAULT_ALTITUDE = 1.5;\n\nexport type DistanceScales = {\n unitsPerMeter: number[];\n metersPerUnit: number[];\n unitsPerMeter2?: number[];\n unitsPerDegree: number[];\n degreesPerUnit: number[];\n unitsPerDegree2?: number[];\n};\n\n/**\n * PROJECTION MATRIX PARAMETERS\n *\n * TODO how to document mebers\n * @param fov in radians. fov is variable, depends on pitch and altitude\n * @param aspect width/height\n * @param focalDistance distance at which visual scale factor is 1\n * @param near near clipping plane\n * @param far far clipping plane\n */\ntype ProjectionParameters = {\n fov: number;\n aspect: number;\n focalDistance: number;\n near: number;\n far: number;\n};\n\n/** Logarithimic zoom to linear scale **/\nexport function zoomToScale(zoom: number): number {\n return Math.pow(2, zoom);\n}\n\n/** Linear scale to logarithimic zoom **/\nexport function scaleToZoom(scale: number): number {\n return log2(scale);\n}\n\n/**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n *\n * @param lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return [x,y] coordinates.\n */\nexport function lngLatToWorld(lngLat: number[]): [number, number] {\n const [lng, lat] = lngLat;\n assert(Number.isFinite(lng));\n assert(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n\n const lambda2 = lng * DEGREES_TO_RADIANS;\n const phi2 = lat * DEGREES_TO_RADIANS;\n const x = (TILE_SIZE * (lambda2 + PI)) / (2 * PI);\n const y = (TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5)))) / (2 * PI);\n return [x, y];\n}\n\n/**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n *\n * @param xy - array with [x,y] members\n * representing point on projected map plane\n * @return - array with [x,y] of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\nexport function worldToLngLat(xy: number[]): [number, number] {\n const [x, y] = xy;\n const lambda2 = (x / TILE_SIZE) * (2 * PI) - PI;\n const phi2 = 2 * (Math.atan(Math.exp((y / TILE_SIZE) * (2 * PI) - PI)) - PI_4);\n return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\n\n/**\n * Returns the zoom level that gives a 1 meter pixel at a certain latitude\n * 1 = C*cos(y)/2^z/TILE_SIZE = C*cos(y)/2^(z+9)\n */\nexport function getMeterZoom(options: {latitude: number}): number {\n const {latitude} = options;\n assert(Number.isFinite(latitude));\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\n\n/**\n * Calculate the conversion from meter to common units at a given latitude\n * This is a cheaper version of `getDistanceScales`\n * @param latitude center latitude in degrees\n * @returns common units per meter\n */\nexport function unitsPerMeter(latitude: number): number {\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return TILE_SIZE / EARTH_CIRCUMFERENCE / latCosine;\n}\n\n/**\n * Calculate distance scales in meters around current lat/lon, both for\n * degrees and pixels.\n * In mercator projection mode, the distance scales vary significantly\n * with latitude.\n */\nexport function getDistanceScales(options: {\n latitude: number;\n longitude: number;\n highPrecision?: boolean;\n}): DistanceScales {\n const {latitude, longitude, highPrecision = false} = options;\n assert(Number.isFinite(latitude) && Number.isFinite(longitude));\n\n const worldSize = TILE_SIZE;\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n\n /**\n * Number of pixels occupied by one degree longitude around current lat/lon:\n unitsPerDegreeX = d(lngLatToWorld([lng, lat])[0])/d(lng)\n = scale * TILE_SIZE * DEGREES_TO_RADIANS / (2 * PI)\n unitsPerDegreeY = d(lngLatToWorld([lng, lat])[1])/d(lat)\n = -scale * TILE_SIZE * DEGREES_TO_RADIANS / cos(lat * DEGREES_TO_RADIANS) / (2 * PI)\n */\n const unitsPerDegreeX = worldSize / 360;\n const unitsPerDegreeY = unitsPerDegreeX / latCosine;\n\n /**\n * Number of pixels occupied by one meter around current lat/lon:\n */\n const altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n\n /**\n * LngLat: longitude -> east and latitude -> north (bottom left)\n * UTM meter offset: x -> east and y -> north (bottom left)\n * World space: x -> east and y -> south (top left)\n *\n * Y needs to be flipped when converting delta degree/meter to delta pixels\n */\n const result: DistanceScales = {\n unitsPerMeter: [altUnitsPerMeter, altUnitsPerMeter, altUnitsPerMeter],\n metersPerUnit: [1 / altUnitsPerMeter, 1 / altUnitsPerMeter, 1 / altUnitsPerMeter],\n\n unitsPerDegree: [unitsPerDegreeX, unitsPerDegreeY, altUnitsPerMeter],\n degreesPerUnit: [1 / unitsPerDegreeX, 1 / unitsPerDegreeY, 1 / altUnitsPerMeter]\n };\n\n /**\n * Taylor series 2nd order for 1/latCosine\n f'(a) * (x - a)\n = d(1/cos(lat * DEGREES_TO_RADIANS))/d(lat) * dLat\n = DEGREES_TO_RADIANS * tan(lat * DEGREES_TO_RADIANS) / cos(lat * DEGREES_TO_RADIANS) * dLat\n */\n if (highPrecision) {\n const latCosine2 = (DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS)) / latCosine;\n const unitsPerDegreeY2 = (unitsPerDegreeX * latCosine2) / 2;\n const altUnitsPerDegree2 = (worldSize / EARTH_CIRCUMFERENCE) * latCosine2;\n const altUnitsPerMeter2 = (altUnitsPerDegree2 / unitsPerDegreeY) * altUnitsPerMeter;\n\n result.unitsPerDegree2 = [0, unitsPerDegreeY2, altUnitsPerDegree2];\n result.unitsPerMeter2 = [altUnitsPerMeter2, 0, altUnitsPerMeter2];\n }\n\n // Main results, used for converting meters to latlng deltas and scaling offsets\n return result;\n}\n\n/**\n * Offset a lng/lat position by meterOffset (northing, easting)\n */\nexport function addMetersToLngLat(lngLatZ: number[], xyz: number[]): number[] {\n const [longitude, latitude, z0] = lngLatZ;\n const [x, y, z] = xyz;\n\n // eslint-disable-next-line no-shadow\n const {unitsPerMeter, unitsPerMeter2} = getDistanceScales({\n longitude,\n latitude,\n highPrecision: true\n });\n\n const worldspace = lngLatToWorld(lngLatZ);\n worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n\n const newLngLat = worldToLngLat(worldspace);\n const newZ = (z0 || 0) + (z || 0);\n\n return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\n\n/**\n *\n * view and projection matrix creation is intentionally kept compatible with\n * mapbox-gl's implementation to ensure that seamless interoperation\n * with mapbox and react-map-gl. See: https://github.com/mapbox/mapbox-gl-js\n */\nexport function getViewMatrix(options: {\n // Viewport props\n height: number;\n pitch: number;\n bearing: number;\n altitude: number;\n // Pre-calculated parameters\n scale: number;\n center?: number[];\n}): number[] {\n const {\n // Viewport props\n height,\n pitch,\n bearing,\n altitude,\n // Pre-calculated parameters\n scale,\n center\n } = options;\n // VIEW MATRIX: PROJECTS MERCATOR WORLD COORDINATES\n // Note that mercator world coordinates typically need to be flipped\n //\n // Note: As usual, matrix operation orders should be read in reverse\n // since vectors will be multiplied from the right during transformation\n const vm = createMat4();\n\n // Move camera to altitude (along the pitch & bearing direction)\n mat4.translate(vm, vm, [0, 0, -altitude]);\n\n // Rotate by bearing, and then by pitch (which tilts the view)\n mat4.rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n mat4.rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n\n const relativeScale = scale / height;\n mat4.scale(vm, vm, [relativeScale, relativeScale, relativeScale]);\n\n if (center) {\n mat4.translate(vm, vm, vec3.negate([], center));\n }\n\n return vm;\n}\n\n/**\n * Calculates mapbox compatible projection matrix from parameters\n *\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns project parameters object\n */\nexport function getProjectionParameters(options: {\n width: number;\n height: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n pitch?: number;\n nearZMultiplier?: number;\n farZMultiplier?: number;\n}): ProjectionParameters {\n const {\n width,\n height,\n altitude,\n pitch = 0,\n offset,\n center,\n scale,\n nearZMultiplier = 1,\n farZMultiplier = 1\n } = options;\n let {fovy = altitudeToFovy(DEFAULT_ALTITUDE)} = options;\n\n // For back-compatibility allow field of view to be\n // derived from altitude\n if (altitude !== undefined) {\n fovy = altitudeToFovy(altitude);\n }\n\n const fovRadians = fovy * DEGREES_TO_RADIANS;\n const pitchRadians = pitch * DEGREES_TO_RADIANS;\n\n // Distance from camera to the target\n const focalDistance = fovyToAltitude(fovy);\n\n let cameraToSeaLevelDistance = focalDistance;\n\n if (center) {\n cameraToSeaLevelDistance += (center[2] * scale) / Math.cos(pitchRadians) / height;\n }\n\n const fovAboveCenter = fovRadians * (0.5 + (offset ? offset[1] : 0) / height);\n\n // Find the distance from the center point to the center top\n // in focal distance units using law of sines.\n const topHalfSurfaceDistance =\n (Math.sin(fovAboveCenter) * cameraToSeaLevelDistance) /\n Math.sin(clamp(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));\n\n // Calculate z distance of the farthest fragment that should be rendered.\n const furthestDistance =\n Math.sin(pitchRadians) * topHalfSurfaceDistance + cameraToSeaLevelDistance;\n // Matches mapbox limit\n const horizonDistance = cameraToSeaLevelDistance * 10;\n\n // Calculate z value of the farthest fragment that should be rendered.\n const farZ = Math.min(furthestDistance * farZMultiplier, horizonDistance);\n\n return {\n fov: fovRadians,\n aspect: width / height,\n focalDistance,\n near: nearZMultiplier,\n far: farZ\n };\n}\n\n/**\n * CALCULATE PROJECTION MATRIX: PROJECTS FROM CAMERA (VIEW) SPACE TO CLIPSPACE\n *\n * To match mapbox's z buffer:\n * - \\<= 0.28: nearZMultiplier: 0.1, farZmultiplier: 1\n * - \\>= 0.29: nearZMultiplier: 1 / height, farZMultiplier: 1.01\n *\n * @param options Viewport options\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns 4x4 projection matrix\n */\nexport function getProjectionMatrix(options: {\n width: number;\n height: number;\n pitch: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n nearZMultiplier: number;\n farZMultiplier: number;\n}): number[] {\n const {fov, aspect, near, far} = getProjectionParameters(options);\n\n const projectionMatrix = mat4.perspective(\n [] as number[],\n fov, // fov in radians\n aspect, // aspect ratio\n near, // near plane\n far // far plane\n );\n\n return projectionMatrix;\n}\n\n/**\n *\n * Convert an altitude to field of view such that the\n * focal distance is equal to the altitude\n *\n * @param altitude - altitude of camera in screen units\n * @return fovy field of view in degrees\n */\nexport function altitudeToFovy(altitude: number): number {\n return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\n\n/**\n *\n * Convert an field of view such that the\n * focal distance is equal to the altitude\n *\n * @param fovy - field of view in degrees\n * @return altitude altitude of camera in screen units\n */\nexport function fovyToAltitude(fovy: number): number {\n return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\n\n/**\n * Project flat coordinates to pixels on screen.\n *\n * @param xyz - flat coordinate on 512*512 Mercator Zoom 0 tile\n * @param pixelProjectionMatrix - projection matrix 4x4\n * @return [x, y, depth] pixel coordinate on screen.\n */\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[];\n\n// Project flat coordinates to pixels on screen.\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[] {\n const [x, y, z = 0] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n\n return transformVector(pixelProjectionMatrix, [x, y, z, 1]);\n}\n\n/**\n * Unproject pixels on screen to flat coordinates.\n *\n * @param xyz - pixel coordinate on screen.\n * @param pixelUnprojectionMatrix - unprojection matrix 4x4\n * @param targetZ - if pixel coordinate does not have a 3rd component (depth),\n * targetZ is used as the elevation plane to unproject onto\n * @return [x, y, Z] flat coordinates on 512*512 Mercator Zoom 0 tile.\n */\nexport function pixelsToWorld(\n xyz: number[],\n pixelUnprojectionMatrix: number[],\n targetZ: number = 0\n): number[] {\n const [x, y, z] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n if (Number.isFinite(z)) {\n // Has depth component\n const coord = transformVector(pixelUnprojectionMatrix, [x, y, z, 1]);\n return coord;\n }\n\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that line with z=0\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, y, 0, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, y, 1, 1]);\n\n const z0 = coord0[2];\n const z1 = coord1[2];\n\n const t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n return vec2.lerp([] as number[], coord0, coord1, t);\n}\n","// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\nexport function assert(condition: unknown, message?: string): void {\n if (!condition) {\n throw new Error(message || '@math.gl/web-mercator: assertion failed.');\n }\n}\n","import {assert} from './assert';\nimport {log2, clamp} from './math-utils';\nimport {MAX_LATITUDE, lngLatToWorld, worldToLngLat} from './web-mercator-utils';\n\n/**\n * Options for fitBounds\n */\nexport type FitBoundsOptions = {\n /** viewport width */\n width: number;\n /** viewport height */\n height: number;\n /** [[lon, lat], [lon, lat]] */\n bounds: [[number, number], [number, number]];\n /** The width/height of the bounded area will never be smaller than this. 0.01 would be about 1000 meters (degree is ~110KM) */\n minExtent?: number;\n /** The maximum zoom level to fit the bounds within. */\n maxZoom?: number; // ~x4,000,000 => About 10 meter extents\n /**\n * padding - The amount of padding in pixels to add to the given bounds.\n * Can also be an object with top, bottom, left and right properties defining the padding.\n */\n padding?: number | Padding;\n /** The center of the given bounds relative to the map's center, */\n offset?: number[];\n};\n\n/**\n * An object describing the padding to add to the bounds.\n */\nexport type Padding = {\n /** Padding from top in pixels to add to the given bounds */\n top: number;\n /** Padding from bottom in pixels to add to the given bounds */\n bottom: number;\n /** Padding from left in pixels to add to the given bounds */\n left: number;\n /** Padding from right in pixels to add to the given bounds */\n right: number;\n};\n\ntype ViewportProps = {\n longitude: number;\n latitude: number;\n zoom: number;\n};\n\n/**\n * Returns map settings {latitude, longitude, zoom}\n * that will contain the provided corners within the provided width.\n *\n * > _Note: Only supports non-perspective mode._\n *\n * @param options fit bounds parameters\n * @returns - latitude, longitude and zoom\n */\nexport function fitBounds(options: FitBoundsOptions): ViewportProps {\n const {\n width,\n height,\n bounds,\n minExtent = 0, // 0.01 would be about 1000 meters (degree is ~110KM)\n maxZoom = 24, // ~x4,000,000 => About 10 meter extents\n offset = [0, 0]\n } = options;\n\n const [[west, south], [east, north]] = bounds;\n const padding = getPaddingObject(options.padding);\n\n const nw = lngLatToWorld([west, clamp(north, -MAX_LATITUDE, MAX_LATITUDE)]);\n const se = lngLatToWorld([east, clamp(south, -MAX_LATITUDE, MAX_LATITUDE)]);\n\n // width/height on the Web Mercator plane\n const size = [\n Math.max(Math.abs(se[0] - nw[0]), minExtent),\n Math.max(Math.abs(se[1] - nw[1]), minExtent)\n ];\n\n const targetSize = [\n width - padding.left - padding.right - Math.abs(offset[0]) * 2,\n height - padding.top - padding.bottom - Math.abs(offset[1]) * 2\n ];\n\n assert(targetSize[0] > 0 && targetSize[1] > 0);\n\n // scale = screen pixels per unit on the Web Mercator plane\n const scaleX = targetSize[0] / size[0];\n const scaleY = targetSize[1] / size[1];\n\n // Find how much we need to shift the center\n const offsetX = (padding.right - padding.left) / 2 / scaleX;\n const offsetY = (padding.top - padding.bottom) / 2 / scaleY;\n\n const center = [(se[0] + nw[0]) / 2 + offsetX, (se[1] + nw[1]) / 2 + offsetY];\n\n const centerLngLat = worldToLngLat(center);\n const zoom = Math.min(maxZoom, log2(Math.abs(Math.min(scaleX, scaleY))));\n\n assert(Number.isFinite(zoom));\n\n return {\n longitude: centerLngLat[0],\n latitude: centerLngLat[1],\n zoom\n };\n}\n\n// Helpers\nfunction getPaddingObject(padding: number | Padding = 0): Padding {\n if (typeof padding === 'number') {\n return {\n top: padding,\n bottom: padding,\n left: padding,\n right: padding\n };\n }\n\n // Make sure all the required properties are set\n assert(\n Number.isFinite(padding.top) &&\n Number.isFinite(padding.bottom) &&\n Number.isFinite(padding.left) &&\n Number.isFinite(padding.right)\n );\n\n return padding;\n}\n","/* eslint-disable camelcase */\nimport {vec2} from '@math.gl/core';\nimport type {WebMercatorViewport} from './web-mercator-viewport';\nimport {worldToLngLat} from './web-mercator-utils';\nimport {transformVector} from './math-utils';\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\n/*\n * Returns the quad at the intersection of the frustum and the given z plane\n * @param {WebMercatorViewport} viewport\n * @param {Number} z - elevation in meters\n */\nexport function getBounds(viewport: WebMercatorViewport, z: number = 0): number[][] {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {width, height, unproject} = viewport;\n const unprojectOps = {targetZ: z};\n const bottomLeft = unproject([0, height], unprojectOps);\n const bottomRight = unproject([width, height], unprojectOps);\n let topLeft: number[];\n let topRight: number[];\n\n const halfFov = viewport.fovy\n ? 0.5 * viewport.fovy * DEGREES_TO_RADIANS\n : Math.atan(0.5 / viewport.altitude);\n const angleToGround = (90 - viewport.pitch) * DEGREES_TO_RADIANS;\n // The top plane is parallel to the ground if halfFov == angleToGround\n if (halfFov > angleToGround - 0.01) {\n // intersect with the far plane\n topLeft = unprojectOnFarPlane(viewport, 0, z);\n topRight = unprojectOnFarPlane(viewport, width, z);\n } else {\n // intersect with the top plane\n topLeft = unproject([0, 0], unprojectOps);\n topRight = unproject([width, 0], unprojectOps);\n }\n\n return [bottomLeft, bottomRight, topRight, topLeft];\n}\n\n/*\n * Find a point on the far clipping plane of the viewport\n * @param {WebMercatorViewport} viewport\n * @param {Number} x - projected x in screen space\n * @param {Number} targetZ - the elevation of the point in meters\n */\nfunction unprojectOnFarPlane(viewport: WebMercatorViewport, x: number, targetZ: number): number[] {\n const {pixelUnprojectionMatrix} = viewport;\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, 0, 1, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, viewport.height, 1, 1]);\n\n const z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n const t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n const coord = vec2.lerp([], coord0, coord1, t);\n\n const result = worldToLngLat(coord);\n result.push(targetZ);\n return result;\n}\n","import {worldToLngLat} from './web-mercator-utils';\nimport {mod, log2} from './math-utils';\n\n// defined by mapbox-gl\nconst TILE_SIZE = 512;\n\n/** Description of viewport */\nexport type ViewportProps = {\n width: number;\n height: number;\n longitude: number;\n latitude: number;\n zoom: number;\n pitch?: number;\n bearing?: number;\n};\n\n/**\n * Apply mathematical constraints to viewport props\n * @param props\n */\n// eslint-disable-next-line complexity\nexport function normalizeViewportProps(props: ViewportProps): ViewportProps {\n const {width, height, pitch = 0} = props;\n let {longitude, latitude, zoom, bearing = 0} = props;\n\n // Normalize degrees\n if (longitude < -180 || longitude > 180) {\n longitude = mod(longitude + 180, 360) - 180;\n }\n if (bearing < -180 || bearing > 180) {\n bearing = mod(bearing + 180, 360) - 180;\n }\n\n // Constrain zoom and shift center at low zoom levels\n const minZoom = log2(height / TILE_SIZE);\n if (zoom <= minZoom) {\n zoom = minZoom;\n latitude = 0;\n } else {\n // Eliminate white space above and below the map\n const halfHeightPixels = height / 2 / Math.pow(2, zoom);\n const minLatitude = worldToLngLat([0, halfHeightPixels])[1];\n if (latitude < minLatitude) {\n latitude = minLatitude;\n } else {\n const maxLatitude = worldToLngLat([0, TILE_SIZE - halfHeightPixels])[1];\n if (latitude > maxLatitude) {\n latitude = maxLatitude;\n }\n }\n }\n\n return {width, height, longitude, latitude, zoom, pitch, bearing};\n}\n","import {lerp} from './math-utils';\nimport {scaleToZoom, zoomToScale, lngLatToWorld, worldToLngLat} from './web-mercator-utils';\nimport {vec2} from '@math.gl/core';\n\nimport type {ViewportProps} from './normalize-viewport-props';\n\nconst EPSILON = 0.01;\nconst VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom'] as const;\nconst DEFAULT_OPTS = {\n curve: 1.414,\n speed: 1.2\n // screenSpeed and maxDuration are used only if specified\n};\n\nexport type FlytoTransitionOptions = {\n curve?: number;\n speed?: number;\n screenSpeed?: number;\n maxDuration?: number;\n};\n\n/**\n * mapbox-gl-js flyTo : https://www.mapbox.com/mapbox-gl-js/api/#map#flyto.\n * It implements “Smooth and efficient zooming and panning.” algorithm by\n * \"Jarke J. van Wijk and Wim A.A. Nuij\"\n */\nexport function flyToViewport(\n startProps: ViewportProps,\n endProps: ViewportProps,\n t: number,\n options?: FlytoTransitionOptions\n): {\n longitude: number;\n latitude: number;\n zoom: number;\n} {\n // Equations from above paper are referred where needed.\n\n const {startZoom, startCenterXY, uDelta, w0, u1, S, rho, rho2, r0} = getFlyToTransitionParams(\n startProps,\n endProps,\n options\n );\n\n // If change in center is too small, do linear interpolaiton.\n if (u1 < EPSILON) {\n const viewport = {};\n for (const key of VIEWPORT_TRANSITION_PROPS) {\n const startValue = startProps[key];\n const endValue = endProps[key];\n // @ts-ignore-error properties are populated dynamically\n viewport[key] = lerp(startValue, endValue, t);\n }\n // @ts-expect-error properties are populated dynamically\n return viewport;\n }\n\n const s = t * S;\n\n const w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n const u = (w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2)) / u1;\n\n const scaleIncrement = 1 / w; // Using w method for scaling.\n const newZoom = startZoom + scaleToZoom(scaleIncrement);\n\n const newCenterWorld = vec2.scale([], uDelta, u);\n vec2.add(newCenterWorld, newCenterWorld, startCenterXY);\n\n const newCenter = worldToLngLat(newCenterWorld);\n return {\n longitude: newCenter[0],\n latitude: newCenter[1],\n zoom: newZoom\n };\n}\n\n// returns transition duration in milliseconds\nexport function getFlyToDuration(\n startProps: ViewportProps,\n endProps: ViewportProps,\n options?: FlytoTransitionOptions\n): number {\n const opts = {...DEFAULT_OPTS, ...options};\n const {screenSpeed, speed, maxDuration} = opts;\n const {S, rho} = getFlyToTransitionParams(startProps, endProps, opts);\n const length = 1000 * S;\n let duration: number;\n if (Number.isFinite(screenSpeed)) {\n duration = length / (screenSpeed / rho);\n } else {\n duration = length / speed;\n }\n\n return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\n\n// Private Methods\n\n// Calculate all parameters that are static for given startProps and endProps\nfunction getFlyToTransitionParams(\n startProps: ViewportProps,\n endProps: ViewportProps,\n opts: FlytoTransitionOptions\n): {\n startZoom: number;\n startCenterXY: number[];\n uDelta: number[];\n w0: number;\n u1: number;\n S: number;\n rho: number;\n rho2: number;\n r0: number;\n r1: number;\n} {\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n const rho = opts.curve;\n const startZoom = startProps.zoom;\n const startCenter = [startProps.longitude, startProps.latitude];\n const startScale = zoomToScale(startZoom);\n const endZoom = endProps.zoom;\n const endCenter = [endProps.longitude, endProps.latitude];\n const scale = zoomToScale(endZoom - startZoom);\n\n const startCenterXY = lngLatToWorld(startCenter);\n const endCenterXY = lngLatToWorld(endCenter);\n const uDelta = vec2.sub([] as number[], endCenterXY, startCenterXY);\n\n const w0 = Math.max(startProps.width, startProps.height);\n const w1 = w0 / scale;\n const u1 = vec2.length(uDelta) * startScale;\n // u0 is treated as '0' in Eq (9).\n\n // If u1 is too small, will generate invalid number\n const _u1 = Math.max(u1, EPSILON);\n\n // Implement Equation (9) from above algorithm.\n const rho2 = rho * rho;\n const b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * _u1 * _u1) / (2 * w0 * rho2 * _u1);\n const b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * _u1 * _u1) / (2 * w1 * rho2 * _u1);\n const r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n const r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n const S = (r1 - r0) / rho;\n\n return {startZoom, startCenterXY, uDelta, w0, u1, S, rho, rho2, r0, r1};\n}\n","import type {BBox} from 'geojson';\nimport type {SpatialFilter} from '../types.js';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport booleanWithin from '@turf/boolean-within';\nimport intersect from '@turf/intersect';\nimport {feature, featureCollection} from '@turf/helpers';\nimport {TileFormat} from '../constants.js';\nimport {transformToTileCoords} from '../utils/transformToTileCoords.js';\nimport {\n cellToBoundary as quadbinCellToBoundary,\n geometryToCells as quadbinGeometryToCells,\n} from 'quadbin';\nimport {polygonToCells as h3PolygonToCells} from 'h3-js';\nimport bboxClip from '@turf/bbox-clip';\n\n// Computes intersections between spatial filters and tiles in various formats,\n// for pre-filtering each tile's features before performing widget calculations.\n//\n// Return types:\n// - true: All features in tile are within spatial filter.\n// - false: No features in tile are within spatial filter; skip tile.\n// - SpatialFilter/Set: Requires a more detailed per-feature check for each\n// feature in the tile. Provides a clipped spatial filter local to the tile\n// or, for spatial indexes, a set of indices (\"covering set\").\n//\n// Computing a covering set for spatial indexes may be very expensive for large\n// spatial filters and small cell resolutions. For example, a viewport at z=3\n// would contain ~18,000,000 raster cells at resolution=14. To avoid ever\n// creating a covering set of this size, compute per-tile (not global) coverings\n// when possible. For tiles fully inside or outside the spatial filter, creating\n// a covering set can be skipped.\n//\n// H3 is currently a special case where coverage must be computed for the entire\n// spatial filter; per-tile coverage would return a different result, because\n// H3 child cells are not fully contained within their parents.\n\n///////////////////////////////////////////////////////////////////////////////\n// GEOMETRY\n\n/** @internal */\nexport function intersectTileGeometry(\n tileBbox: BBox,\n tileFormat?: TileFormat,\n spatialFilter?: SpatialFilter\n): boolean | SpatialFilter {\n const tilePolygon = bboxPolygon(tileBbox);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([tilePolygon, feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n // Transform into local coordinates [0..1]. We assume MVT tiles use local\n // coordinates but geojson or binary features are already WGS84.\n return tileFormat === TileFormat.MVT\n ? transformToTileCoords(clippedSpatialFilter.geometry, tileBbox)\n : clippedSpatialFilter.geometry;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// RASTER\n\n/** @internal */\nexport function intersectTileRaster(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n) {\n return intersectTileQuadbin(parent, cellResolution, spatialFilter);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// QUADBIN\n\n/** @internal */\nexport function intersectTileQuadbin(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n): boolean | Set<bigint> {\n const tilePolygon = quadbinCellToBoundary(parent);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([feature(tilePolygon), feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n const cells = quadbinGeometryToCells(\n clippedSpatialFilter.geometry,\n cellResolution\n );\n\n return new Set(cells);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// H3\n\nconst BBOX_WEST: BBox = [-180, -90, 0, 90];\nconst BBOX_EAST: BBox = [0, -90, 180, 90];\n\n/** @internal */\nexport function intersectTileH3(\n cellResolution: number,\n spatialFilter?: SpatialFilter\n): true | Set<string> {\n if (!spatialFilter) {\n return true;\n }\n\n // Unlike quadbin and raster tiles, H3 children do not align to the parent's\n // boundaries. Per-tile coverage with `h3PolygonToCells` would return only\n // cells with _centers_ inside the clipped polygon — fewer cells. So for H3\n // we compute the coverage set for the entire spatial filter (more expensive).\n // In the future this could be replaced with `polygonToCellsExperimental`,\n // which can compute child cells in different modes.\n\n const spatialFilterFeature = feature(spatialFilter);\n\n // The current H3 polyfill algorithm can't deal with polygon segments of greater than 180 degrees longitude\n // so we clip the geometry to be sure that none of them is greater than 180 degrees\n // https://github.com/uber/h3-js/issues/24#issuecomment-431893796\n\n const cellsWest = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_WEST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n const cellsEast = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_EAST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n return new Set(cellsWest.concat(cellsEast));\n}\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(\n geojson: AllGeoJSON,\n options: {\n recompute?: boolean;\n } = {}\n): BBox {\n if (geojson.bbox != null && true !== options.recompute) {\n return geojson.bbox;\n }\n const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, (coord) => {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nexport { bbox };\nexport default bbox;\n","/*\r\n * bignumber.js v9.1.2\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2022 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n }\r\n\r\n // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // THe index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL; rem[remL++] = 0);\r\n yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne;\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[LOG_BASE - i];\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[0] += k;\r\n for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\r\n };\r\n\r\n\r\n /*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\r\n };\r\n\r\n\r\n /*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\r\n /*\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(x));\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","import BigNumber from \"bignumber.js\";\nimport { Bbox } from \"./bbox.js\";\nimport { precision } from \"./precision.js\";\nimport Segment from \"./segment.js\";\nimport { Point } from \"./sweep-event.js\";\n\nexport type Ring = [number, number][]\nexport type Poly = Ring[]\nexport type MultiPoly = Poly[]\nexport type Geom = Poly | MultiPoly\n\nexport class RingIn {\n poly: PolyIn\n isExterior: boolean\n segments: Segment[]\n bbox: Bbox\n\n constructor(geomRing: Ring, poly: PolyIn, isExterior: boolean) {\n if (!Array.isArray(geomRing) || geomRing.length === 0) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n this.poly = poly\n this.isExterior = isExterior\n this.segments = []\n\n if (\n typeof geomRing[0][0] !== \"number\" ||\n typeof geomRing[0][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n const firstPoint = precision.snap({ x: new BigNumber(geomRing[0][0]), y: new BigNumber(geomRing[0][1]) }) as Point\n this.bbox = {\n ll: { x: firstPoint.x, y: firstPoint.y },\n ur: { x: firstPoint.x, y: firstPoint.y },\n }\n\n let prevPoint = firstPoint\n for (let i = 1, iMax = geomRing.length; i < iMax; i++) {\n if (\n typeof geomRing[i][0] !== \"number\" ||\n typeof geomRing[i][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n const point = precision.snap({ x: new BigNumber(geomRing[i][0]), y: new BigNumber(geomRing[i][1]) }) as Point\n // skip repeated points\n if (point.x.eq(prevPoint.x) && point.y.eq(prevPoint.y)) continue\n this.segments.push(Segment.fromRing(prevPoint, point, this))\n if (point.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = point.x\n if (point.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = point.y\n if (point.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = point.x\n if (point.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = point.y\n prevPoint = point\n }\n // add segment from last to first if last is not the same as first\n if (!firstPoint.x.eq(prevPoint.x) || !firstPoint.y.eq(prevPoint.y)) {\n this.segments.push(Segment.fromRing(prevPoint, firstPoint, this))\n }\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.segments.length; i < iMax; i++) {\n const segment = this.segments[i]\n sweepEvents.push(segment.leftSE)\n sweepEvents.push(segment.rightSE)\n }\n return sweepEvents\n }\n}\n\nexport class PolyIn {\n multiPoly: MultiPolyIn\n exteriorRing: RingIn\n interiorRings: RingIn[]\n bbox: Bbox\n\n constructor(geomPoly: Poly, multiPoly: MultiPolyIn) {\n if (!Array.isArray(geomPoly)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n this.exteriorRing = new RingIn(geomPoly[0], this, true)\n // copy by value\n this.bbox = {\n ll: { x: this.exteriorRing.bbox.ll.x, y: this.exteriorRing.bbox.ll.y },\n ur: { x: this.exteriorRing.bbox.ur.x, y: this.exteriorRing.bbox.ur.y },\n }\n this.interiorRings = []\n for (let i = 1, iMax = geomPoly.length; i < iMax; i++) {\n const ring = new RingIn(geomPoly[i], this, false)\n if (ring.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = ring.bbox.ll.x\n if (ring.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = ring.bbox.ll.y\n if (ring.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = ring.bbox.ur.x\n if (ring.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = ring.bbox.ur.y\n this.interiorRings.push(ring)\n }\n this.multiPoly = multiPoly\n }\n\n getSweepEvents() {\n const sweepEvents = this.exteriorRing.getSweepEvents()\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringSweepEvents = this.interiorRings[i].getSweepEvents()\n for (let j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n\nexport class MultiPolyIn {\n isSubject: boolean\n polys: PolyIn[]\n bbox: Bbox\n\n constructor(geom: Geom, isSubject: boolean) {\n if (!Array.isArray(geom)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n try {\n // if the input looks like a polygon, convert it to a multipolygon\n if (typeof geom[0][0][0] === \"number\") geom = [geom as Poly]\n } catch (ex) {\n // The input is either malformed or has empty arrays.\n // In either case, it will be handled later on.\n }\n\n this.polys = []\n this.bbox = {\n ll: { x: new BigNumber(Number.POSITIVE_INFINITY), y: new BigNumber(Number.POSITIVE_INFINITY) },\n ur: { x: new BigNumber(Number.NEGATIVE_INFINITY), y: new BigNumber(Number.NEGATIVE_INFINITY) },\n }\n for (let i = 0, iMax = geom.length; i < iMax; i++) {\n const poly = new PolyIn(geom[i] as Poly, this)\n if (poly.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = poly.bbox.ll.x\n if (poly.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = poly.bbox.ll.y\n if (poly.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = poly.bbox.ur.x\n if (poly.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = poly.bbox.ur.y\n this.polys.push(poly)\n }\n this.isSubject = isSubject\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polySweepEvents = this.polys[i].getSweepEvents()\n for (let j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n","export default <T>(x: T) => {\n return () => {\n return x\n }\n}","import BigNumber from \"bignumber.js\"\nimport constant from \"./constant.js\"\n\nexport default (eps?: number) => {\n const almostEqual = eps ? (a: BigNumber, b: BigNumber) =>\n b.minus(a).abs().isLessThanOrEqualTo(eps)\n : constant(false)\n\n return (a: BigNumber, b: BigNumber) => {\n if (almostEqual(a, b)) return 0\n\n return a.comparedTo(b)\n }\n}","import BigNumber from \"bignumber.js\";\nimport constant from \"./constant.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default function (eps?: number) {\n const almostCollinear = eps ? (area2: BigNumber, ax: BigNumber, ay: BigNumber, cx: BigNumber, cy: BigNumber) =>\n area2.exponentiatedBy(2).isLessThanOrEqualTo(\n cx.minus(ax).exponentiatedBy(2).plus(cy.minus(ay).exponentiatedBy(2))\n .times(eps))\n : constant(false)\n\n return (a: Vector, b: Vector, c: Vector) => {\n const ax = a.x, ay = a.y, cx = c.x, cy = c.y\n\n const area2 = ay.minus(cy).times(b.x.minus(cx)).minus(ax.minus(cx).times(b.y.minus(cy)))\n\n if (almostCollinear(area2, ax, ay, cx, cy)) return 0\n\n return area2.comparedTo(0)\n }\n}","import BigNumber from \"bignumber.js\";\nimport { SplayTreeSet } from \"splaytree-ts\"\nimport compare from \"./compare.js\";\nimport identity from \"./identity.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default (eps?: number) => {\n if (eps) {\n\n const xTree = new SplayTreeSet(compare(eps))\n const yTree = new SplayTreeSet(compare(eps))\n\n const snapCoord = (coord: BigNumber, tree: SplayTreeSet<BigNumber>) => {\n return tree.addAndReturn(coord)\n }\n\n const snap = (v: Vector) => {\n return {\n x: snapCoord(v.x, xTree),\n y: snapCoord(v.y, yTree),\n } as Vector\n }\n\n snap({ x: new BigNumber(0), y: new BigNumber(0)})\n\n return snap\n }\n\n return identity<Vector>\n}","export default <T>(x: T) => {\n return x;\n}","import compare from \"./compare.js\";\nimport orient from \"./orient.js\";\nimport snap from \"./snap.js\";\n\nconst set = (eps?: number) => {\n return {\n set: (eps?: number) => { precision = set(eps) },\n reset: () => set(eps),\n compare: compare(eps),\n snap: snap(eps),\n orient: orient(eps)\n }\n}\n\nexport let precision: ReturnType<typeof set> = set()","import { Vector } from \"./vector.js\";\n\nexport interface Bbox {\n ll: Vector;\n ur: Vector;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\n\nexport const isInBbox = (bbox: Bbox, point: Vector) => {\n return (\n bbox.ll.x.isLessThanOrEqualTo(point.x) &&\n point.x.isLessThanOrEqualTo(bbox.ur.x) &&\n bbox.ll.y.isLessThanOrEqualTo(point.y) &&\n point.y.isLessThanOrEqualTo(bbox.ur.y) \n )\n}\n\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\nexport const getBboxOverlap = (b1: Bbox, b2: Bbox) => {\n // check if the bboxes overlap at all\n if (\n b2.ur.x.isLessThan(b1.ll.x) ||\n b1.ur.x.isLessThan(b2.ll.x) ||\n b2.ur.y.isLessThan(b1.ll.y) ||\n b1.ur.y.isLessThan(b2.ll.y) \n )\n return null\n\n // find the middle two X values\n const lowerX = b1.ll.x.isLessThan(b2.ll.x) ? b2.ll.x : b1.ll.x\n const upperX = b1.ur.x.isLessThan(b2.ur.x) ? b1.ur.x : b2.ur.x\n\n // find the middle two Y values\n const lowerY = b1.ll.y.isLessThan(b2.ll.y) ? b2.ll.y : b1.ll.y\n const upperY = b1.ur.y.isLessThan(b2.ur.y) ? b1.ur.y : b2.ur.y\n\n // put those middle values together to get the overlap\n return { ll: { x: lowerX, y: lowerY }, ur: { x: upperX, y: upperY } } as Bbox\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport { getBboxOverlap } from \"./bbox.js\"\nimport * as geomIn from \"./geom-in.js\"\nimport { Geom } from \"./geom-in.js\"\nimport * as geomOut from \"./geom-out.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent from \"./sweep-event.js\"\nimport SweepLine from \"./sweep-line.js\"\n\nexport class Operation {\n type!: string\n numMultiPolys!: number\n\n run(type: string, geom: Geom, moreGeoms: Geom[]) {\n operation.type = type\n\n /* Convert inputs to MultiPoly objects */\n const multipolys = [new geomIn.MultiPolyIn(geom, true)]\n for (let i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n multipolys.push(new geomIn.MultiPolyIn(moreGeoms[i], false))\n }\n operation.numMultiPolys = multipolys.length\n\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n if (operation.type === \"difference\") {\n // in place removal\n const subject = multipolys[0]\n let i = 1\n while (i < multipolys.length) {\n if (getBboxOverlap(multipolys[i].bbox, subject.bbox) !== null) i++\n else multipolys.splice(i, 1)\n }\n }\n\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n if (operation.type === \"intersection\") {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const mpA = multipolys[i]\n for (let j = i + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return []\n }\n }\n }\n\n /* Put segment endpoints in a priority queue */\n const queue = new SplayTreeSet(SweepEvent.compare)\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const sweepEvents = multipolys[i].getSweepEvents()\n for (let j = 0, jMax = sweepEvents.length; j < jMax; j++) {\n queue.add(sweepEvents[j])\n }\n }\n\n /* Pass the sweep line over those endpoints */\n const sweepLine = new SweepLine(queue)\n let evt = null\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n }\n while (evt) {\n const newEvents = sweepLine.process(evt)\n for (let i = 0, iMax = newEvents.length; i < iMax; i++) {\n const evt = newEvents[i]\n if (evt.consumedBy === undefined) queue.add(evt)\n }\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n } else {\n evt = null;\n }\n }\n\n // free some memory we don't need anymore\n precision.reset()\n\n /* Collect and compile segments we're keeping into a multipolygon */\n const ringsOut = geomOut.RingOut.factory(sweepLine.segments)\n const result = new geomOut.MultiPolyOut(ringsOut)\n return result.getGeom()\n }\n}\n\n// singleton available by import\nconst operation = new Operation()\n\nexport default operation\n","import * as bn from \"bignumber.js\";\n\nexport interface Vector {\n x: bn.BigNumber;\n y: bn.BigNumber;\n}\n\n/* Cross Product of two vectors with first point at origin */\nexport const crossProduct = (a: Vector, b: Vector) => a.x.times(b.y).minus(a.y.times(b.x))\n\n/* Dot Product of two vectors with first point at origin */\nexport const dotProduct = (a: Vector, b: Vector) => a.x.times(b.x).plus(a.y.times(b.y))\n\nexport const length = (v: Vector) => dotProduct(v, v).sqrt()\n\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const sineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return crossProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const cosineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return dotProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const horizontalIntersection = (pt: Vector, v: Vector, y: bn.BigNumber) => {\n if (v.y.isZero()) return null\n return { x: pt.x.plus((v.x.div(v.y)).times(y.minus(pt.y))), y: y }\n}\n\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const verticalIntersection = (pt: Vector, v: Vector, x: bn.BigNumber) => {\n if (v.x.isZero()) return null\n return { x: x, y: pt.y.plus((v.y.div(v.x)).times(x.minus(pt.x))) }\n}\n\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const intersection = (pt1: Vector, v1: Vector, pt2: Vector, v2: Vector) => {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x.isZero()) return verticalIntersection(pt2, v2, pt1.x)\n if (v2.x.isZero()) return verticalIntersection(pt1, v1, pt2.x)\n if (v1.y.isZero()) return horizontalIntersection(pt2, v2, pt1.y)\n if (v2.y.isZero()) return horizontalIntersection(pt1, v1, pt2.y)\n\n // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n const kross = crossProduct(v1, v2)\n if (kross.isZero()) return null\n\n const ve = { x: pt2.x.minus(pt1.x), y: pt2.y.minus(pt1.y) }\n const d1 = crossProduct(ve, v1).div(kross)\n const d2 = crossProduct(ve, v2).div(kross)\n\n // take the average of the two calculations to minimize rounding error\n const x1 = pt1.x.plus(d2.times(v1.x)),\n x2 = pt2.x.plus(d1.times(v2.x))\n const y1 = pt1.y.plus(d2.times(v1.y)),\n y2 = pt2.y.plus(d1.times(v2.y))\n const x = x1.plus(x2).div(2)\n const y = y1.plus(y2).div(2)\n return { x: x, y: y } as Vector\n}\n\n/* Given a vector, return one that is perpendicular */\nexport const perpendicular = (v: Vector) => {\n return { x: v.y.negated(), y: v.x }\n}","import BigNumber from \"bignumber.js\";\nimport Segment from \"./segment.js\"\nimport { cosineOfAngle, sineOfAngle, Vector } from \"./vector.js\"\n\nexport interface Point extends Vector {\n events: SweepEvent[];\n}\n\nexport default class SweepEvent {\n point: Point;\n isLeft: boolean;\n segment!: Segment;\n otherSE!: SweepEvent;\n consumedBy: SweepEvent | undefined;\n\n // for ordering sweep events in the sweep event queue\n static compare(a: SweepEvent, b: SweepEvent) {\n // favor event with a point that the sweep line hits first\n const ptCmp = SweepEvent.comparePoints(a.point, b.point)\n if (ptCmp !== 0) return ptCmp\n\n // the points are the same, so link them if needed\n if (a.point !== b.point) a.link(b)\n\n // favor right events over left\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1\n\n // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n return Segment.compare(a.segment, b.segment)\n }\n\n // for ordering points in sweep line order\n static comparePoints(aPt: Point, bPt: Point) {\n if (aPt.x.isLessThan(bPt.x)) return -1\n if (aPt.x.isGreaterThan(bPt.x)) return 1\n\n if (aPt.y.isLessThan(bPt.y)) return -1\n if (aPt.y.isGreaterThan(bPt.y)) return 1\n\n return 0\n }\n\n // Warning: 'point' input will be modified and re-used (for performance)\n constructor(point: Point, isLeft: boolean) {\n if (point.events === undefined) point.events = [this]\n else point.events.push(this)\n this.point = point\n this.isLeft = isLeft\n // this.segment, this.otherSE set by factory\n }\n\n link(other: SweepEvent) {\n if (other.point === this.point) {\n throw new Error(\"Tried to link already linked events\")\n }\n const otherEvents = other.point.events\n for (let i = 0, iMax = otherEvents.length; i < iMax; i++) {\n const evt = otherEvents[i]\n this.point.events.push(evt)\n evt.point = this.point\n }\n this.checkForConsuming()\n }\n\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n\n // Compare each pair of events to see if other events also match\n const numEvents = this.point.events.length\n for (let i = 0; i < numEvents; i++) {\n const evt1 = this.point.events[i]\n if (evt1.segment.consumedBy !== undefined) continue\n for (let j = i + 1; j < numEvents; j++) {\n const evt2 = this.point.events[j]\n if (evt2.consumedBy !== undefined) continue\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue\n evt1.segment.consume(evt2.segment)\n }\n }\n }\n\n getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n const events = []\n for (let i = 0, iMax = this.point.events.length; i < iMax; i++) {\n const evt = this.point.events[i]\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt)\n }\n }\n return events\n }\n\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n getLeftmostComparator(baseEvent: SweepEvent) {\n const cache = new Map<SweepEvent, { sine: BigNumber, cosine: BigNumber }>()\n\n const fillCache = (linkedEvent: SweepEvent) => {\n const nextEvent = linkedEvent.otherSE\n cache.set(linkedEvent, {\n sine: sineOfAngle(this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(this.point, baseEvent.point, nextEvent.point),\n })\n }\n\n return (a: SweepEvent, b: SweepEvent) => {\n if (!cache.has(a)) fillCache(a)\n if (!cache.has(b)) fillCache(b)\n\n const { sine: asine, cosine: acosine } = cache.get(a)!\n const { sine: bsine, cosine: bcosine } = cache.get(b)!\n\n // both on or above x-axis\n if (asine.isGreaterThanOrEqualTo(0) && bsine.isGreaterThanOrEqualTo(0)) {\n if (acosine.isLessThan(bcosine)) return 1\n if (acosine.isGreaterThan(bcosine)) return -1\n return 0\n }\n\n // both below x-axis\n if (asine.isLessThan(0) && bsine.isLessThan(0)) {\n if (acosine.isLessThan(bcosine)) return -1\n if (acosine.isGreaterThan(bcosine)) return 1\n return 0\n }\n\n // one above x-axis, one below\n if (bsine.isLessThan(asine)) return -1\n if (bsine.isGreaterThan(asine)) return 1\n return 0\n }\n }\n}\n","import { MultiPoly, Poly, Ring } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport Segment from \"./segment.js\"\nimport SweepEvent from \"./sweep-event.js\"\n\nexport class RingOut {\n events: SweepEvent[]\n poly: PolyOut | null\n _isExteriorRing: boolean | undefined\n _enclosingRing: RingOut | null | undefined\n \n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n static factory(allSegments: Segment[]) {\n const ringsOut = []\n\n for (let i = 0, iMax = allSegments.length; i < iMax; i++) {\n const segment = allSegments[i]\n if (!segment.isInResult() || segment.ringOut) continue\n\n let prevEvent = null\n let event = segment.leftSE\n let nextEvent = segment.rightSE\n const events = [event]\n\n const startingPoint = event.point\n const intersectionLEs = []\n\n /* Walk the chain of linked events to form a closed ring */\n while (true) {\n prevEvent = event\n event = nextEvent\n events.push(event)\n\n /* Is the ring complete? */\n if (event.point === startingPoint) break\n\n while (true) {\n const availableLEs = event.getAvailableLinkedEvents()\n\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n if (availableLEs.length === 0) {\n const firstPt = events[0].point\n const lastPt = events[events.length - 1].point\n throw new Error(\n `Unable to complete output ring starting at [${firstPt.x},` +\n ` ${firstPt.y}]. Last matching segment found ends at` +\n ` [${lastPt.x}, ${lastPt.y}].`,\n )\n }\n\n /* Only one way to go, so cotinue on the path */\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE\n break\n }\n\n /* We must have an intersection. Check for a completed loop */\n let indexLE = null\n for (let j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j\n break\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n if (indexLE !== null) {\n const intersectionLE = intersectionLEs.splice(indexLE)[0]\n const ringEvents = events.splice(intersectionLE.index)\n ringEvents.unshift(ringEvents[0].otherSE)\n ringsOut.push(new RingOut(ringEvents.reverse()))\n continue\n }\n /* register the intersection */\n intersectionLEs.push({\n index: events.length,\n point: event.point,\n })\n /* Choose the left-most option to continue the walk */\n const comparator = event.getLeftmostComparator(prevEvent)\n nextEvent = availableLEs.sort(comparator)[0].otherSE\n break\n }\n }\n\n ringsOut.push(new RingOut(events))\n }\n return ringsOut\n }\n\n constructor(events: SweepEvent[]) {\n this.events = events\n for (let i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this\n }\n this.poly = null\n }\n\n getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n let prevPt = this.events[0].point\n const points = [prevPt]\n for (let i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n const pt = this.events[i].point\n const nextPt = this.events[i + 1].point\n if (precision.orient(pt, prevPt, nextPt) === 0) continue\n points.push(pt)\n prevPt = pt\n }\n\n // ring was all (within rounding error of angle calc) colinear points\n if (points.length === 1) return null\n\n // check if the starting point is necessary\n const pt = points[0]\n const nextPt = points[1]\n if (precision.orient(pt, prevPt, nextPt) === 0) points.shift()\n\n points.push(points[0])\n const step = this.isExteriorRing() ? 1 : -1\n const iStart = this.isExteriorRing() ? 0 : points.length - 1\n const iEnd = this.isExteriorRing() ? points.length : -1\n const orderedPoints: Ring = []\n for (let i = iStart; i != iEnd; i += step)\n orderedPoints.push([points[i].x.toNumber(), points[i].y.toNumber()])\n return orderedPoints\n }\n\n isExteriorRing(): boolean {\n if (this._isExteriorRing === undefined) {\n const enclosing = this.enclosingRing()\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true\n }\n return this._isExteriorRing\n }\n\n enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing()\n }\n return this._enclosingRing\n }\n\n /* Returns the ring that encloses this one, if any */\n _calcEnclosingRing(): RingOut | null | undefined {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n let leftMostEvt = this.events[0]\n for (let i = 1, iMax = this.events.length; i < iMax; i++) {\n const evt = this.events[i]\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt\n }\n\n let prevSeg: Segment | null | undefined = leftMostEvt.segment.prevInResult()\n let prevPrevSeg: Segment | null | undefined = prevSeg ? prevSeg.prevInResult() : null\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null\n\n // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n if (!prevPrevSeg) return prevSeg.ringOut\n\n // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut?.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut\n } else return prevSeg.ringOut?.enclosingRing()\n }\n\n // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n prevSeg = prevPrevSeg.prevInResult()\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null\n }\n }\n}\n\nexport class PolyOut {\n exteriorRing: RingOut;\n interiorRings: RingOut[];\n\n constructor(exteriorRing: RingOut) {\n this.exteriorRing = exteriorRing\n exteriorRing.poly = this\n this.interiorRings = []\n }\n\n addInterior(ring: RingOut) {\n this.interiorRings.push(ring)\n ring.poly = this\n }\n\n getGeom() {\n const geom0 = this.exteriorRing.getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (geom0 === null) return null\n const geom: Poly = [geom0];\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringGeom = this.interiorRings[i].getGeom()\n // interior ring was all (within rounding error of angle calc) colinear points\n if (ringGeom === null) continue\n geom.push(ringGeom)\n }\n return geom\n }\n}\n\nexport class MultiPolyOut {\n rings: RingOut[];\n polys: PolyOut[];\n\n constructor(rings: RingOut[]) {\n this.rings = rings\n this.polys = this._composePolys(rings)\n }\n\n getGeom() {\n const geom: MultiPoly = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polyGeom = this.polys[i].getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (polyGeom === null) continue\n geom.push(polyGeom)\n }\n return geom\n }\n\n _composePolys(rings: RingOut[]) {\n const polys = []\n for (let i = 0, iMax = rings.length; i < iMax; i++) {\n const ring = rings[i]\n if (ring.poly) continue\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring))\n else {\n const enclosingRing = ring.enclosingRing()\n if (!enclosingRing?.poly) polys.push(new PolyOut(enclosingRing!))\n enclosingRing?.poly?.addInterior(ring)\n }\n }\n return polys\n }\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport Segment from \"./segment.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nexport default class SweepLine {\n private queue: SplayTreeSet<SweepEvent>\n private tree: SplayTreeSet<Segment>\n segments: Segment[]\n\n constructor(queue: SplayTreeSet<SweepEvent>, comparator = Segment.compare) {\n this.queue = queue\n this.tree = new SplayTreeSet(comparator)\n this.segments = []\n }\n\n process(event: SweepEvent) {\n const segment = event.segment\n const newEvents: SweepEvent[] = []\n\n // if we've already been consumed by another segment,\n // clean up our body parts and get out\n if (event.consumedBy) {\n if (event.isLeft) this.queue.delete(event.otherSE)\n else this.tree.delete(segment)\n return newEvents\n }\n\n if (event.isLeft) this.tree.add(segment);\n\n let prevSeg: Segment | null = segment\n let nextSeg: Segment | null = segment\n\n // skip consumed segments still in tree\n do {\n prevSeg = this.tree.lastBefore(prevSeg)\n } while (prevSeg != null && prevSeg.consumedBy != undefined)\n\n // skip consumed segments still in tree\n do {\n nextSeg = this.tree.firstAfter(nextSeg)\n } while (nextSeg != null && nextSeg.consumedBy != undefined)\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n let prevMySplitter = null\n if (prevSeg) {\n const prevInter = prevSeg.getIntersection(segment)\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter\n if (!prevSeg.isAnEndpoint(prevInter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, prevInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // Check for intersections against the next segment in the sweep line\n let nextMySplitter = null\n if (nextSeg) {\n const nextInter = nextSeg.getIntersection(segment)\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter\n if (!nextSeg.isAnEndpoint(nextInter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, nextInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n if (prevMySplitter !== null || nextMySplitter !== null) {\n let mySplitter = null\n if (prevMySplitter === null) mySplitter = nextMySplitter\n else if (nextMySplitter === null) mySplitter = prevMySplitter\n else {\n const cmpSplitters = SweepEvent.comparePoints(\n prevMySplitter,\n nextMySplitter,\n )\n mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter\n }\n\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n this.queue.delete(segment.rightSE)\n newEvents.push(segment.rightSE)\n\n const newEventsFromSplit = segment.split(mySplitter!)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.delete(segment)\n newEvents.push(event)\n } else {\n // done with left event\n this.segments.push(segment)\n segment.prev = prevSeg\n }\n } else {\n // event.isRight\n\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n const inter = prevSeg.getIntersection(nextSeg)\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n if (!nextSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n this.tree.delete(segment)\n }\n\n return newEvents\n }\n\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n _splitSafely(seg: Segment, pt: Point) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.delete(seg)\n const rightSE = seg.rightSE\n this.queue.delete(rightSE)\n const newEvents = seg.split(pt)\n newEvents.push(rightSE)\n // splitting can trigger consumption\n if (seg.consumedBy === undefined) this.tree.add(seg)\n return newEvents\n }\n}\n","import { getBboxOverlap, isInBbox } from \"./bbox.js\"\nimport { MultiPolyIn, RingIn } from \"./geom-in.js\"\nimport { RingOut } from \"./geom-out.js\"\nimport operation from \"./operation.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\nimport { intersection } from \"./vector.js\"\n\ninterface State {\n rings: RingIn[],\n windings: number[],\n multiPolys: MultiPolyIn[]\n}\n\n// Give segments unique ID's to get consistent sorting of\n// segments and sweep events when all else is identical\nlet segmentId = 0\n\nexport default class Segment {\n id: number\n leftSE: SweepEvent\n rightSE: SweepEvent\n rings: RingIn[] | null\n windings: number[] | null\n ringOut: RingOut | undefined\n consumedBy: Segment | undefined\n prev: Segment | null | undefined\n _prevInResult: Segment | null | undefined\n _beforeState: State | undefined\n _afterState: State | undefined\n _isInResult: boolean | undefined\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n static compare(a: Segment, b: Segment) {\n const alx = a.leftSE.point.x\n const blx = b.leftSE.point.x\n const arx = a.rightSE.point.x\n const brx = b.rightSE.point.x\n\n // check if they're even in the same vertical plane\n if (brx.isLessThan(alx)) return 1\n if (arx.isLessThan(blx)) return -1\n\n const aly = a.leftSE.point.y\n const bly = b.leftSE.point.y\n const ary = a.rightSE.point.y\n const bry = b.rightSE.point.y\n\n // is left endpoint of segment B the right-more?\n if (alx.isLessThan(blx)) {\n // are the two segments in the same horizontal plane?\n if (bly.isLessThan(aly) && bly.isLessThan(ary)) return 1\n if (bly.isGreaterThan(aly) && bly.isGreaterThan(ary)) return -1\n\n // is the B left endpoint colinear to segment A?\n const aCmpBLeft = a.comparePoint(b.leftSE.point)\n if (aCmpBLeft < 0) return 1\n if (aCmpBLeft > 0) return -1\n\n // is the A right endpoint colinear to segment B ?\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return -1\n }\n\n // is left endpoint of segment A the right-more?\n if (alx.isGreaterThan(blx)) {\n if (aly.isLessThan(bly) && aly.isLessThan(bry)) return -1\n if (aly.isGreaterThan(bly) && aly.isGreaterThan(bry)) return 1\n\n // is the A left endpoint colinear to segment B?\n const bCmpALeft = b.comparePoint(a.leftSE.point)\n if (bCmpALeft !== 0) return bCmpALeft\n\n // is the B right endpoint colinear to segment A?\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return 1\n }\n\n // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n\n // consider the lower left-endpoint to come first\n if (aly.isLessThan(bly)) return -1\n if (aly.isGreaterThan(bly)) return 1\n\n // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n\n // is the A right endpoint more left-more?\n if (arx.isLessThan(brx)) {\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n }\n\n // is the B right endpoint more left-more?\n if (arx.isGreaterThan(brx)) {\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n }\n\n if (!arx.eq(brx)) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n const ay = ary.minus(aly)\n const ax = arx.minus(alx)\n const by = bry.minus(bly)\n const bx = brx.minus(blx)\n if (ay.isGreaterThan(ax) && by.isLessThan(bx)) return 1\n if (ay.isLessThan(ax) && by.isGreaterThan(bx)) return -1\n }\n\n // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n if (arx.isGreaterThan(brx)) return 1\n if (arx.isLessThan(brx)) return -1\n\n // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n\n // consider the lower right-endpoint to come first\n if (ary.isLessThan(bry)) return -1\n if (ary.isGreaterThan(bry)) return 1\n\n // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n if (a.id < b.id) return -1\n if (a.id > b.id) return 1\n\n // identical segment, ie a === b\n return 0\n }\n\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n constructor(leftSE: SweepEvent, rightSE: SweepEvent, rings: RingIn[], windings: number[]) {\n this.id = ++segmentId\n this.leftSE = leftSE\n leftSE.segment = this\n leftSE.otherSE = rightSE\n this.rightSE = rightSE\n rightSE.segment = this\n rightSE.otherSE = leftSE\n this.rings = rings\n this.windings = windings\n // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n static fromRing(pt1: Point, pt2: Point, ring: RingIn) {\n let leftPt: Point, rightPt: Point, winding: number\n\n // ordering the two points according to sweep line ordering\n const cmpPts = SweepEvent.comparePoints(pt1, pt2)\n if (cmpPts < 0) {\n leftPt = pt1\n rightPt = pt2\n winding = 1\n } else if (cmpPts > 0) {\n leftPt = pt2\n rightPt = pt1\n winding = -1\n } else\n throw new Error(\n `Tried to create degenerate segment at [${pt1.x}, ${pt1.y}]`,\n )\n\n const leftSE = new SweepEvent(leftPt, true)\n const rightSE = new SweepEvent(rightPt, false)\n return new Segment(leftSE, rightSE, [ring], [winding])\n }\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n replaceRightSE(newRightSE: SweepEvent) {\n this.rightSE = newRightSE\n this.rightSE.segment = this\n this.rightSE.otherSE = this.leftSE\n this.leftSE.otherSE = this.rightSE\n }\n\n bbox() {\n const y1 = this.leftSE.point.y\n const y2 = this.rightSE.point.y\n return {\n ll: { x: this.leftSE.point.x, y: y1.isLessThan(y2) ? y1 : y2 },\n ur: { x: this.rightSE.point.x, y: y1.isGreaterThan(y2) ? y1 : y2 },\n }\n }\n\n /* A vector from the left point to the right */\n vector() {\n return {\n x: this.rightSE.point.x.minus(this.leftSE.point.x),\n y: this.rightSE.point.y.minus(this.leftSE.point.y),\n }\n }\n\n isAnEndpoint(pt: Point) {\n return (\n (pt.x.eq(this.leftSE.point.x) && pt.y.eq(this.leftSE.point.y)) ||\n (pt.x.eq(this.rightSE.point.x) && pt.y.eq(this.rightSE.point.y))\n )\n }\n\n /* Compare this segment with a point.\n *\n * A point P is considered to be colinear to a segment if there\n * exists a distance D such that if we travel along the segment\n * from one * endpoint towards the other a distance D, we find\n * ourselves at point P.\n *\n * Return value indicates:\n *\n * 1: point lies above the segment (to the left of vertical)\n * 0: point is colinear to segment\n * -1: point lies below the segment (to the right of vertical)\n */\n comparePoint(point: Point) {\n return precision.orient(this.leftSE.point, point, this.rightSE.point)\n }\n\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n getIntersection(other: Segment) {\n // If bboxes don't overlap, there can't be any intersections\n const tBbox = this.bbox()\n const oBbox = other.bbox()\n const bboxOverlap = getBboxOverlap(tBbox, oBbox)\n if (bboxOverlap === null) return null\n\n // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n const tlp = this.leftSE.point\n const trp = this.rightSE.point\n const olp = other.leftSE.point\n const orp = other.rightSE.point\n\n // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n const touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0\n const touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0\n const touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0\n const touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0\n\n // do left endpoints match?\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp\n if (!touchesThisRSE && touchesOtherRSE) return orp\n // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n return null\n }\n\n // does this left endpoint matches (other doesn't)\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x.eq(orp.x) && tlp.y.eq(orp.y)) return null\n }\n // t-intersection on left endpoint\n return tlp\n }\n\n // does other left endpoint matches (this doesn't)\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x.eq(olp.x) && trp.y.eq(olp.y)) return null\n }\n // t-intersection on left endpoint\n return olp\n }\n\n // trivial intersection on right endpoints\n if (touchesThisRSE && touchesOtherRSE) return null\n\n // t-intersections on just one right endpoint\n if (touchesThisRSE) return trp\n if (touchesOtherRSE) return orp\n\n // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n const pt = intersection(tlp, this.vector(), olp, other.vector())\n\n // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n if (pt === null) return null\n\n // is the intersection found between the lines not on the segments?\n if (!isInBbox(bboxOverlap, pt)) return null\n\n // round the the computed point if needed\n return precision.snap(pt) as Point\n }\n\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n split(point: Point) {\n const newEvents = []\n const alreadyLinked = point.events !== undefined\n\n const newLeftSE = new SweepEvent(point, true)\n const newRightSE = new SweepEvent(point, false)\n const oldRightSE = this.rightSE\n this.replaceRightSE(newRightSE)\n newEvents.push(newRightSE)\n newEvents.push(newLeftSE)\n const newSeg = new Segment(\n newLeftSE,\n oldRightSE,\n this.rings!.slice(),\n this.windings!.slice(),\n )\n\n // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n if (\n SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0\n ) {\n newSeg.swapEvents()\n }\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents()\n }\n\n // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n if (alreadyLinked) {\n newLeftSE.checkForConsuming()\n newRightSE.checkForConsuming()\n }\n\n return newEvents\n }\n\n /* Swap which event is left and right */\n swapEvents() {\n const tmpEvt = this.rightSE\n this.rightSE = this.leftSE\n this.leftSE = tmpEvt\n this.leftSE.isLeft = true\n this.rightSE.isLeft = false\n for (let i = 0, iMax = this.windings!.length; i < iMax; i++) {\n this.windings![i] *= -1\n }\n }\n\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n consume(other: Segment) {\n let consumer = this as Segment\n let consumee = other\n while (consumer.consumedBy) consumer = consumer.consumedBy\n while (consumee.consumedBy) consumee = consumee.consumedBy\n\n const cmp = Segment.compare(consumer, consumee)\n if (cmp === 0) return // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n if (cmp > 0) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n // make sure a segment doesn't consume it's prev\n if (consumer.prev === consumee) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n for (let i = 0, iMax = consumee.rings!.length; i < iMax; i++) {\n const ring = consumee.rings![i]\n const winding = consumee.windings![i]\n const index = consumer.rings!.indexOf(ring)\n if (index === -1) {\n consumer.rings!.push(ring)\n consumer.windings!.push(winding)\n } else consumer.windings![index] += winding\n }\n consumee.rings = null\n consumee.windings = null\n consumee.consumedBy = consumer\n\n // mark sweep events consumed as to maintain ordering in sweep event queue\n consumee.leftSE.consumedBy = consumer.leftSE\n consumee.rightSE.consumedBy = consumer.rightSE\n }\n\n /* The first segment previous segment chain that is in the result */\n prevInResult(): Segment | null | undefined {\n if (this._prevInResult !== undefined) return this._prevInResult\n if (!this.prev) this._prevInResult = null\n else if (this.prev.isInResult()) this._prevInResult = this.prev\n else this._prevInResult = this.prev.prevInResult()\n return this._prevInResult\n }\n\n beforeState(): State {\n if (this._beforeState !== undefined) return this._beforeState\n if (!this.prev)\n this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: [],\n }\n else {\n const seg = this.prev.consumedBy || this.prev\n this._beforeState = seg.afterState()\n }\n return this._beforeState\n }\n\n afterState() {\n if (this._afterState !== undefined) return this._afterState\n\n const beforeState = this.beforeState()\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: [],\n }\n const ringsAfter = this._afterState.rings\n const windingsAfter = this._afterState.windings\n const mpsAfter = this._afterState.multiPolys\n\n // calculate ringsAfter, windingsAfter\n for (let i = 0, iMax = this.rings!.length; i < iMax; i++) {\n const ring = this.rings![i]\n const winding = this.windings![i]\n const index = ringsAfter.indexOf(ring)\n if (index === -1) {\n ringsAfter.push(ring)\n windingsAfter.push(winding)\n } else windingsAfter[index] += winding\n }\n\n // calcualte polysAfter\n const polysAfter = []\n const polysExclude = []\n for (let i = 0, iMax = ringsAfter.length; i < iMax; i++) {\n if (windingsAfter[i] === 0) continue // non-zero rule\n const ring = ringsAfter[i]\n const poly = ring.poly\n if (polysExclude.indexOf(poly) !== -1) continue\n if (ring.isExterior) polysAfter.push(poly)\n else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly)\n const index = polysAfter.indexOf(ring.poly)\n if (index !== -1) polysAfter.splice(index, 1)\n }\n }\n\n // calculate multiPolysAfter\n for (let i = 0, iMax = polysAfter.length; i < iMax; i++) {\n const mp = polysAfter[i].multiPoly\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp)\n }\n\n return this._afterState\n }\n\n /* Is this segment part of the final result? */\n isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false\n\n if (this._isInResult !== undefined) return this._isInResult\n\n const mpsBefore = this.beforeState().multiPolys\n const mpsAfter = this.afterState().multiPolys\n\n switch (operation.type) {\n case \"union\": {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n const noBefores = mpsBefore.length === 0\n const noAfters = mpsAfter.length === 0\n this._isInResult = noBefores !== noAfters\n break\n }\n\n case \"intersection\": {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n let least\n let most\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length\n most = mpsAfter.length\n } else {\n least = mpsAfter.length\n most = mpsBefore.length\n }\n this._isInResult = most === operation.numMultiPolys && least < most\n break\n }\n\n case \"xor\": {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n const diff = Math.abs(mpsBefore.length - mpsAfter.length)\n this._isInResult = diff % 2 === 1\n break\n }\n\n case \"difference\": {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n const isJustSubject = (mps: MultiPolyIn[]) => mps.length === 1 && mps[0].isSubject\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter)\n break\n }\n }\n\n return this._isInResult\n }\n}\n","import { Geom } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport operation from \"./operation.js\"\n\nexport { Geom }\n\nexport const union = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"union\", geom, moreGeoms)\n\nexport const intersection = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"intersection\", geom, moreGeoms)\n\nexport const xor = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"xor\", geom, moreGeoms)\n\nexport const difference = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"difference\", geom, moreGeoms)\n\nexport const setPrecision = precision.set","import {lngLatToWorld} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform WGS84 coordinates to tile coords.\n * It's the inverse of deck.gl coordinate-transform (https://github.com/visgl/deck.gl/blob/master/modules/geo-layers/src/mvt-layer/coordinate-transform.js)\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformToTileCoords<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = projectFlat([west, north]);\n const se = projectFlat([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = inverseLerp(nw[0], se[0], pointX);\n const y = inverseLerp(nw[1], se[1], pointY);\n\n return [x, y];\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(projectFlat(g), bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n\nfunction projectFlat(xyz: Position): Position {\n return lngLatToWorld(xyz);\n}\n\nfunction inverseLerp(a: number, b: number, x: number): number {\n return (x - a) / (b - a);\n}\n","import {SpatialIndex} from '../constants.js';\nimport {getResolution as quadbinGetResolution} from 'quadbin';\nimport type {SpatialFilter, SpatialIndexTile} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {getResolution as h3GetResolution} from 'h3-js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialDataType} from '../sources/types.js';\nimport {intersectTileH3, intersectTileQuadbin} from './tileIntersection.js';\n\nexport type TileFeaturesSpatialIndexOptions = {\n tiles: SpatialIndexTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n};\n\nexport function tileFeaturesSpatialIndex({\n tiles,\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n}: TileFeaturesSpatialIndexOptions): FeatureData[] {\n const map = new Map();\n const spatialIndex = getSpatialIndex(spatialDataType);\n const cellResolution = getResolution(tiles, spatialIndex);\n const spatialIndexIDName = spatialDataColumn\n ? spatialDataColumn\n : spatialIndex;\n\n if (!cellResolution) {\n return [];\n }\n\n let intersection: undefined | boolean | Set<bigint | string>;\n\n // Compute H3 intersection globally, Quadbin intersection per-tile. See tileIntersection.ts.\n if (spatialIndex === SpatialIndex.H3) {\n intersection = intersectTileH3(cellResolution as number, spatialFilter);\n }\n\n for (const tile of tiles) {\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n const parent = getTileIndex(tile, spatialIndex);\n intersection = intersectTileQuadbin(\n parent as bigint,\n cellResolution as bigint,\n spatialFilter\n );\n }\n\n if (!intersection) continue;\n\n tile.data.forEach((d: Feature) => {\n // @ts-expect-error Mixed types for cell indices.\n if (intersection === true || intersection.has(d.id as bigint | string)) {\n map.set(d.id, {...d.properties, [spatialIndexIDName]: d.id});\n }\n });\n }\n return Array.from(map.values());\n}\n\nfunction getTileIndex(\n tile: SpatialIndexTile,\n spatialIndex: SpatialIndex\n): bigint | string {\n if (spatialIndex === SpatialIndex.QUADBIN) {\n // @ts-expect-error Missing types for quadbin tile indices.\n return tile.index.q;\n }\n return tile.id;\n}\n\nfunction getResolution(\n tiles: SpatialIndexTile[],\n spatialIndex: SpatialIndex\n): bigint | number | undefined {\n const data = tiles.find((tile) => tile.data?.length)?.data;\n\n if (!data) {\n return;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n return Number(quadbinGetResolution(data[0].id));\n }\n\n if (spatialIndex === SpatialIndex.H3) {\n return h3GetResolution(data[0].id);\n }\n}\n\nfunction getSpatialIndex(spatialDataType: SpatialDataType): SpatialIndex {\n switch (spatialDataType) {\n case 'h3':\n return SpatialIndex.H3;\n case 'quadbin':\n return SpatialIndex.QUADBIN;\n default:\n throw new Error('Unexpected spatial data type');\n }\n}\n","/** @internal */\nexport const V3_MINOR_VERSION = '3.4';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_GEO_COLUMN = 'geom';\n\n/**\n * Fastly default limit is 8192; leave some padding.\n * @privateRemarks Source: @deck.gl/carto\n */\nexport const DEFAULT_MAX_LENGTH_URL = 7000;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport const DEFAULT_TILE_RESOLUTION = 0.5;\n\n/**\n * @todo TODO(v0.5): Update DEFAULT_TILE_RESOLUTION and remove this constant.\n * @internal\n */\nexport const REDUCED_QUERIES_TILE_RESOLUTION = 1;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_H3 = 4;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN = 6;\n\n/** @internal */\nexport const DEFAULT_AGGREGATION_EXP_ALIAS = '__aggregationValue';\nexport const DEFAULT_AGGREGATION_EXP = `1 AS ${DEFAULT_AGGREGATION_EXP_ALIAS}`;\n","import {cellToTile, getResolution, tileToCell} from 'quadbin';\nimport type {RasterTile, SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n RasterMetadata,\n RasterMetadataBand,\n SpatialDataType,\n} from '../sources/types.js';\nimport {intersectTileRaster} from './tileIntersection.js';\n\nexport type TileFeaturesRasterOptions = {\n tiles: RasterTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n rasterMetadata: RasterMetadata;\n};\n\nexport function tileFeaturesRaster({\n tiles,\n ...options\n}: TileFeaturesRasterOptions): FeatureData[] {\n // Cache band metadata for faster lookup while iterating over pixels.\n const metadataByBand: Record<string, RasterMetadataBand & {nodata: number}> =\n {};\n for (const band of options.rasterMetadata.bands) {\n // TODO(cleanup): Remove copy and cast after API is updated to return 'nodata' as a number.\n metadataByBand[band.name] = {...band, nodata: Number(band.nodata)};\n }\n\n // Omit empty and invisible tiles for simpler processing and types.\n tiles = tiles.filter(isRasterTileVisible);\n if (tiles.length === 0) return [];\n\n // Raster tiles, and all pixels, are quadbin cells. Resolution of a pixel is\n // the resolution of the tile, plus the number of subdivisions. Block size\n // must be square, N x N, where N is a power of two.\n const tileResolution = getResolution(tiles[0].index.q);\n const tileBlockSize = tiles[0].data!.blockSize;\n const cellResolution = tileResolution + BigInt(Math.log2(tileBlockSize));\n\n const data = new Map<bigint, FeatureData>();\n\n for (const tile of tiles as Required<RasterTile>[]) {\n const parent = tile.index.q;\n\n const intersection = intersectTileRaster(\n parent,\n cellResolution,\n options.spatialFilter\n );\n\n if (intersection === false) continue;\n\n const tileSortedCells = cellToChildrenRaster(parent, cellResolution);\n\n // For each pixel/cell within the spatial filter, create a FeatureData.\n // Order is row-major, starting from NW and ending at SE.\n for (let i = 0; i < tileSortedCells.length; i++) {\n if (intersection !== true && !intersection.has(tileSortedCells[i])) {\n continue;\n }\n\n const cellData: FeatureData = {};\n let cellDataExists = false;\n\n for (const band in tile.data.cells.numericProps) {\n const value = tile.data.cells.numericProps[band].value[i];\n const bandMetadata = metadataByBand[band];\n\n if (isValidBandValue(value, bandMetadata.nodata)) {\n cellData[band] = tile.data.cells.numericProps[band].value[i];\n cellDataExists = true;\n }\n }\n\n if (cellDataExists) {\n data.set(tileSortedCells[i], cellData);\n }\n }\n }\n\n return Array.from(data.values());\n}\n\n/**\n * Detects whether a given {@link Tile} is a {@link RasterTile}.\n * @privateRemarks Method of detection is arbitrary, and may be changed.\n */\nexport function isRasterTile(tile: Tile): tile is RasterTile {\n return !!(tile.data as Record<string, unknown>)?.cells;\n}\n\nfunction isRasterTileVisible(tile: RasterTile): tile is Required<RasterTile> {\n return !!(tile.isVisible && tile.data?.cells?.numericProps);\n}\n\n/**\n * Alternative to `quadbin` module's `cellToChildren()` function, modified to\n * return cells in row-major order, NW to SE, as stored in CARTO raster tiles.\n * Sorting after computing cells is too slow.\n */\nfunction cellToChildrenRaster(parent: bigint, resolution: bigint): bigint[] {\n const parentTile = cellToTile(parent);\n\n // 1. Calculate x/y/z of upper left pixel in raster tile.\n const childZ = Number(resolution);\n const blockSize = 2 ** (childZ - parentTile.z);\n const childBaseX = parentTile.x * blockSize;\n const childBaseY = parentTile.y * blockSize;\n\n // 2. Iterate pixels in raster tile order; compute cell ID from base x/y.\n const cells: bigint[] = [];\n for (let i = 0, il = blockSize ** 2; i < il; i++) {\n const x = childBaseX + (i % blockSize);\n const y = childBaseY + Math.floor(i / blockSize);\n cells.push(tileToCell({x, y, z: childZ}));\n }\n\n return cells;\n}\n\n/**\n * Returns true if the given value is valid (not NaN, not 'nodata')\n * for the given raster band.\n */\nfunction isValidBandValue(value: unknown, nodata: number): value is number {\n return Number.isNaN(value) ? false : nodata !== value;\n}\n","import {SchemaFieldType, type Filter, type SchemaField} from './types.js';\nimport {FilterType} from './constants.js';\nimport type {SpatialDataType} from './sources/types.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\n/**\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n\ntype Row<T> = Record<string, T> | Record<string, T>[] | T[] | T;\n\n/**\n * Due to each data warehouse having its own behavior with columns,\n * we need to normalize them and transform every key to lowercase.\n *\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function normalizeObjectKeys<T, R extends Row<T>>(el: R): R {\n if (Array.isArray(el)) {\n return el.map((value) => normalizeObjectKeys(value)) as R;\n } else if (typeof el !== 'object') {\n return el;\n }\n\n return Object.entries(el as Record<string, T>).reduce(\n (acc, [key, value]) => {\n acc[key.toLowerCase()] =\n typeof value === 'object' && value ? normalizeObjectKeys(value) : value;\n return acc;\n },\n {} as Record<string, T>\n ) as R;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * @privateRemarks Source: @carto/react-core\n * @internal\n */\nexport class InvalidColumnError extends Error {\n protected static readonly NAME = 'InvalidColumnError';\n\n constructor(message: string) {\n super(`${InvalidColumnError.NAME}: ${message}`);\n this.name = InvalidColumnError.NAME;\n }\n\n static is(error: unknown) {\n return (\n error instanceof InvalidColumnError ||\n (error as Error).message?.includes(InvalidColumnError.NAME)\n );\n }\n}\n\nexport function isEmptyObject(object: object): boolean {\n for (const _ in object) {\n return false;\n }\n return true;\n}\n\n/** @internal */\nexport const isObject: (x: unknown) => boolean = (x) =>\n x !== null && typeof x === 'object';\n\n/** @internal */\nexport const isPureObject: (x: any) => boolean = (x) =>\n isObject(x) && x.constructor === {}.constructor;\n\n/**\n * Merges one or more source objects into a target object. Unlike `Object.assign`, does not\n * assign properties with undefined values. Null values will overwrite existing properties.\n */\nexport function assignOptional<T extends object, U, V>(\n target: T,\n source1: U,\n source2: V\n): T & U & V;\nexport function assignOptional<T extends object, U>(\n target: T,\n source: U\n): T & U;\nexport function assignOptional<T extends object, U>(\n target: T,\n ...sources: any[]\n): any {\n for (const source of sources) {\n for (const key in source) {\n if (source[key] !== undefined) {\n (target as Record<string, unknown>)[key] = source[key];\n }\n }\n }\n return target as T & U;\n}\n\n/**\n * Returns the spatialDataType expected for widget operations, given layer source props. The\n * spatialDataType used in widget operations may be different from that of the layer. For\n * dynamically aggregated point datasets, widgets use type 'geo', not the aggregation type.\n */\nexport function getWidgetSpatialDataType(\n spatialDataType: SpatialDataType,\n spatialDataColumn: string,\n schema: SchemaField[]\n): SpatialDataType {\n const field = schema.find((field) => field.name === spatialDataColumn);\n if (field && field.type === SchemaFieldType.Geometry) {\n return 'geo';\n }\n\n return spatialDataType;\n}\n","import type {FilterType} from './constants.js';\nimport type {Polygon, MultiPolygon, Feature} from 'geojson';\nimport type {BinaryFeature, BinaryFeatureCollection} from '@loaders.gl/schema';\n\n/******************************************************************************\n * MAP INSTANTIATION\n */\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport enum SchemaFieldType {\n Number = 'number',\n Bigint = 'bigint',\n String = 'string',\n Geometry = 'geometry',\n Timestamp = 'timestamp',\n Object = 'object',\n Boolean = 'boolean',\n Variant = 'variant',\n Unknown = 'unknown',\n}\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport interface SchemaField {\n name: string;\n type: SchemaFieldType; // Field type in the CARTO stack, common for all providers\n}\n\n/******************************************************************************\n * MAPS AND TILES\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Format = 'json' | 'geojson' | 'tilejson';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport type MapType = 'boundary' | 'query' | 'table' | 'tileset' | 'raster';\n\n/** @privateRemarks Source: cloud-native */\nexport type ProviderType =\n | 'bigquery'\n | 'postgres'\n | 'snowflake'\n | 'redshift'\n | 'databricks'\n | 'carto'\n | 'carto_dw';\n\n/**\n * Alias for GeoJSON 'BBox' type, semantically representing a viewport.\n * Order of values is \"west\", \"south\", \"east\", \"north\".\n */\nexport type Viewport = [number, number, number, number];\n\n/**\n * Subset of deck.gl's Tile2DHeader type, containing only the properties\n * required for local widget calculations. Deeper dependencies on deck.gl\n * APIs should be minimized within this library: @deck.gl/carto depends\n * on the API client, not the other way around.\n * @privateRemarks Source: @deck.gl/geo-layers\n */\nexport type Tile = {\n index: {x: number; y: number; z: number};\n id: string;\n bbox: {west: number; east: number; north: number; south: number};\n isVisible: boolean;\n data?: BinaryFeatureCollection;\n};\n\n/** Subset of deck.gl's Tile2DHeader type, for spatial indexes. */\nexport type SpatialIndexTile = Tile & {\n data?: (Feature & {id: bigint})[];\n};\n\nexport type RasterTile = Tile & {\n id: string;\n index: {q: bigint; i: string};\n data?: Raster;\n};\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Raster = {\n blockSize: number;\n cells: {\n numericProps: BinaryFeature['numericProps'];\n properties: BinaryFeature['properties'];\n };\n};\n\n/******************************************************************************\n * AGGREGATION\n */\n\n/**\n * Enum type for the different types of aggregations available for widgets.\n *\n * @privateRemarks Source: @carto/constants\n * @privateRemarks Converted from enum to type union, for improved declarative API.\n */\nexport type AggregationType =\n | 'count'\n | 'avg'\n | 'min'\n | 'max'\n | 'sum'\n | 'custom';\n\n/******************************************************************************\n * FILTERS\n */\n\n/** @privateRemarks Source: @carto/react-api */\nexport type SpatialFilter = Polygon | MultiPolygon;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport interface Filters {\n [column: string]: Filter;\n}\n\n/** @privateRemarks Source: @carto/react-api, @deck.gl/carto */\nexport interface Filter {\n [FilterType.IN]?: {owner?: string; values: number[] | string[]};\n /** [a, b] both are included. */\n [FilterType.BETWEEN]?: {owner?: string; values: number[][]};\n /** [a, b) a is included, b is not. */\n [FilterType.CLOSED_OPEN]?: {owner?: string; values: number[][]};\n [FilterType.TIME]?: {owner?: string; values: number[][]};\n [FilterType.STRING_SEARCH]?: {\n owner?: string;\n values: string[];\n params?: StringSearchOptions;\n };\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport type FilterLogicalOperator = 'and' | 'or';\n\n/**\n * Type for minimum or maximum value of an interval. Values 'null' and\n * 'undefined' are intentionally allowed, and represent an unbounded value.\n */\nexport type FilterIntervalExtremum = number | null | undefined;\nexport type FilterInterval = [FilterIntervalExtremum, FilterIntervalExtremum];\nexport type FilterIntervalComplete = [number, number];\n\nexport type StringSearchOptions = {\n useRegExp?: boolean;\n mustStart?: boolean;\n mustEnd?: boolean;\n caseSensitive?: boolean;\n keepSpecialCharacters?: boolean;\n};\n\n/******************************************************************************\n * GROUPING\n */\n\n/**\n * Defines a step size increment for use with {@link TimeSeriesRequestOptions}.\n *\n * @privateRemarks Source: @carto/react-core\n */\nexport type GroupDateType =\n | 'year'\n | 'month'\n | 'week'\n | 'day'\n | 'hour'\n | 'minute'\n | 'second';\n\n/******************************************************************************\n * SORTING\n */\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortColumnType = 'number' | 'string' | 'date';\n\n/******************************************************************************\n * SQL QUERY PARAMETERS\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameterValue =\n | string\n | number\n | boolean\n | Array<QueryParameterValue>\n | object;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type NamedQueryParameter = Record<string, QueryParameterValue>;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type PositionalQueryParameter = QueryParameterValue[];\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameters = NamedQueryParameter | PositionalQueryParameter;\n","export {default as BASEMAP} from './basemap-styles.js';\nexport {fetchMap} from './fetch-map.js';\nexport type {FetchMapOptions, FetchMapResult} from './fetch-map.js';\nexport type {\n Basemap,\n MapLibreBasemap,\n GoogleBasemap,\n KeplerMapConfig,\n} from './types.js';\n\nexport * from './basemap.js';\nexport * from './layer-map.js';\nexport * from './parse-map.js';\n","import {CartoAPIError, type APIErrorContext} from '../api/index.js';\nimport type {GoogleBasemapProps} from './types.js';\n\nconst cartoStyleUrlTemplate =\n 'https://basemaps.cartocdn.com/gl/{basemap}-gl-style/style.json';\n\nexport const CARTO_MAP_STYLES = ['positron', 'dark-matter', 'voyager'];\n\nexport const GOOGLE_BASEMAPS: Record<string, GoogleBasemapProps> = {\n roadmap: {\n mapTypeId: 'roadmap',\n mapId: '3754c817b510f791',\n },\n 'google-positron': {\n mapTypeId: 'roadmap',\n mapId: 'ea84ae4203ef21cd',\n },\n 'google-dark-matter': {\n mapTypeId: 'roadmap',\n mapId: '2fccc3b36c22a0e2',\n },\n 'google-voyager': {\n mapTypeId: 'roadmap',\n mapId: '885caf1e15bb9ef2',\n },\n satellite: {\n mapTypeId: 'satellite',\n },\n hybrid: {\n mapTypeId: 'hybrid',\n },\n terrain: {\n mapTypeId: 'terrain',\n },\n};\n\ntype StyleLayerGroupSlug =\n | 'label'\n | 'road'\n | 'border'\n | 'building'\n | 'water'\n | 'land';\ntype StyleLayerGroup = {\n slug: StyleLayerGroupSlug;\n filter: (layer: any) => boolean;\n defaultVisibility: boolean;\n};\n\nexport const STYLE_LAYER_GROUPS: StyleLayerGroup[] = [\n {\n slug: 'label',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(\n /(?=(label|_label|place-|place_|poi-|poi_|watername_|roadname_|housenumber))/\n )\n ),\n defaultVisibility: true,\n },\n {\n slug: 'road',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(road|railway|tunnel|street|bridge))(?!.*label)/)),\n defaultVisibility: true,\n },\n {\n slug: 'border',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/border|boundaries|boundary_/)),\n defaultVisibility: false,\n },\n {\n slug: 'building',\n filter: ({id}: {id: string}) => Boolean(id.match(/building/)),\n defaultVisibility: true,\n },\n {\n slug: 'water',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(water|stream|ferry))/)),\n defaultVisibility: true,\n },\n {\n slug: 'land',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(/(?=(parks|landcover|industrial|sand|hillshade|park_))/)\n ),\n defaultVisibility: true,\n },\n];\n\nexport function applyLayerGroupFilters(\n style: any,\n visibleLayerGroups: Record<StyleLayerGroupSlug, boolean>\n) {\n if (!Array.isArray(style?.layers)) {\n return style;\n }\n\n const removedLayerFilters = STYLE_LAYER_GROUPS.filter(\n (lg) => !visibleLayerGroups[lg.slug]\n ).map((lg) => lg.filter);\n\n const visibleLayers = style.layers.filter((layer: any) =>\n removedLayerFilters.every((match) => !match(layer))\n );\n\n return {\n ...style,\n layers: visibleLayers,\n };\n}\n\nexport function someLayerGroupsDisabled(\n visibleLayerGroups?: Record<StyleLayerGroupSlug, boolean>\n) {\n return (\n visibleLayerGroups &&\n Object.values(visibleLayerGroups).every(Boolean) === false\n );\n}\n\nexport function getStyleUrl(styleType: string) {\n return cartoStyleUrlTemplate.replace('{basemap}', styleType);\n}\n\nexport async function fetchStyle({\n styleUrl,\n errorContext,\n}: {\n styleUrl: string;\n errorContext?: APIErrorContext;\n}) {\n /* global fetch */\n let response: Response | undefined;\n return await fetch(styleUrl, {mode: 'cors'})\n .then((res) => {\n response = res;\n return res.json();\n })\n .catch((error) => {\n throw new CartoAPIError(\n error,\n {...errorContext, requestType: 'Basemap style'},\n response\n );\n });\n}\n\nexport default {\n VOYAGER: getStyleUrl('voyager'),\n POSITRON: getStyleUrl('positron'),\n DARK_MATTER: getStyleUrl('dark-matter'),\n VOYAGER_NOLABELS: getStyleUrl('voyager-nolabels'),\n POSITRON_NOLABELS: getStyleUrl('positron-nolabels'),\n DARK_MATTER_NOLABELS: getStyleUrl('dark-matter-nolabels'),\n} as const;\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {\n CartoAPIError,\n type APIErrorContext,\n type APIRequestType,\n} from './carto-api-error.js';\n// Internal, but required for fetchMap().\nexport {buildPublicMapUrl, buildStatsUrl} from './endpoints.js';\nexport {query} from './query.js';\nexport type {QueryOptions} from './query.js';\nexport {\n requestWithParameters,\n clearDefaultRequestCache,\n} from './request-with-parameters.js';\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type APIRequestType =\n | 'Map data'\n | 'Map instantiation'\n | 'Public map'\n | 'Tile stats'\n | 'SQL'\n | 'Basemap style';\n\nexport type APIErrorContext = {\n requestType: APIRequestType;\n mapId?: string;\n connection?: string;\n source?: string;\n type?: MapType;\n};\n\n/**\n *\n * Custom error for reported errors in CARTO Maps API.\n * Provides useful debugging information in console and context for applications.\n *\n */\nexport class CartoAPIError extends Error {\n /** Source error from server */\n error: Error;\n\n /** Context (API call & parameters) in which error occured */\n errorContext: APIErrorContext;\n\n /** Response from server */\n response?: Response;\n\n /** JSON Response from server */\n responseJson?: any;\n\n constructor(\n error: Error,\n errorContext: APIErrorContext,\n response?: Response,\n responseJson?: any\n ) {\n let responseString = 'Failed to connect';\n if (response) {\n responseString = 'Server returned: ';\n if (response.status === 400) {\n responseString += 'Bad request';\n } else if (response.status === 401 || response.status === 403) {\n responseString += 'Unauthorized access';\n } else if (response.status === 404) {\n responseString += 'Not found';\n } else {\n responseString += 'Error';\n }\n\n responseString += ` (${response.status}):`;\n }\n responseString += ` ${error.message || error}`;\n\n let message = `${errorContext.requestType} API request failed`;\n message += `\\n${responseString}`;\n for (const key of Object.keys(errorContext)) {\n if (key === 'requestType') continue;\n message += `\\n${formatErrorKey(key)}: ${(errorContext as any)[key]}`;\n }\n message += '\\n';\n\n super(message);\n\n this.name = 'CartoAPIError';\n this.response = response;\n this.responseJson = responseJson;\n this.error = error;\n this.errorContext = errorContext;\n }\n}\n\n/**\n * Converts camelCase to Camel Case\n */\nfunction formatErrorKey(key: string) {\n return key.replace(/([A-Z])/g, ' $1').replace(/^./, (s) => s.toUpperCase());\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type V3Endpoint = 'maps' | 'stats' | 'sql';\n\nfunction joinPath(...args: string[]): string {\n return args\n .map((part) => (part.endsWith('/') ? part.slice(0, -1) : part))\n .join('/');\n}\n\nfunction buildV3Path(\n apiBaseUrl: string,\n version: 'v3',\n endpoint: V3Endpoint,\n ...rest: string[]\n): string {\n return joinPath(apiBaseUrl, version, endpoint, ...rest);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildPublicMapUrl({\n apiBaseUrl,\n cartoMapId,\n}: {\n apiBaseUrl: string;\n cartoMapId: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', 'public', cartoMapId);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildStatsUrl({\n attribute,\n apiBaseUrl,\n connectionName,\n source,\n type,\n}: {\n attribute: string;\n apiBaseUrl: string;\n connectionName: string;\n source: string;\n type: MapType;\n}): string {\n if (type === 'query') {\n return buildV3Path(apiBaseUrl, 'v3', 'stats', connectionName, attribute);\n }\n\n // type === 'table'\n return buildV3Path(\n apiBaseUrl,\n 'v3',\n 'stats',\n connectionName,\n source,\n attribute\n );\n}\n\nexport function buildSourceUrl({\n apiBaseUrl,\n connectionName,\n endpoint,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n endpoint: MapType;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', connectionName, endpoint);\n}\n\nexport function buildQueryUrl({\n apiBaseUrl,\n connectionName,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'sql', connectionName, 'query');\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {SOURCE_DEFAULTS} from '../sources/index.js';\nimport type {\n SourceOptions,\n QuerySourceOptions,\n QueryResult,\n} from '../sources/types.js';\nimport {buildQueryUrl} from './endpoints.js';\nimport {requestWithParameters} from './request-with-parameters.js';\nimport type {APIErrorContext} from './carto-api-error.js';\nimport {getClient} from '../client.js';\n\nexport type QueryOptions = SourceOptions &\n QuerySourceOptions & {\n /**\n * @internal\n * @experimental\n * Used to append additional parameters to the SQL API request for features specific to providers or integrations.\n */\n internalParameters?: Record<string, string | boolean | number>;\n /** Used to abort the request. */\n signal?: AbortSignal;\n };\ntype UrlParameters = {q: string; queryParameters?: string};\n\nexport const query = async function (\n options: QueryOptions\n): Promise<QueryResult> {\n const {\n apiBaseUrl = SOURCE_DEFAULTS.apiBaseUrl,\n maxLengthURL = SOURCE_DEFAULTS.maxLengthURL,\n clientId = getClient(),\n localCache,\n connectionName,\n sqlQuery,\n queryParameters,\n internalParameters,\n } = options;\n const urlParameters: UrlParameters = {q: sqlQuery};\n\n if (queryParameters) {\n urlParameters.queryParameters = JSON.stringify(queryParameters);\n }\n\n const baseUrl = buildQueryUrl({apiBaseUrl, connectionName});\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {\n client: clientId,\n ...options.tags,\n ...internalParameters,\n ...urlParameters,\n };\n\n const errorContext: APIErrorContext = {\n requestType: 'SQL',\n connection: options.connectionName,\n type: 'query',\n source: JSON.stringify(parameters, undefined, 2),\n };\n return await requestWithParameters<QueryResult>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n signal: options.signal,\n });\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {SOURCE_DEFAULTS} from './base-source.js';\nexport type {\n SourceOptions,\n SourceRequiredOptions,\n SourceOptionalOptions,\n TilejsonResult,\n QueryResult,\n FilterOptions,\n QuerySourceOptions,\n TableSourceOptions,\n TilesetSourceOptions,\n ColumnsOption,\n SpatialDataType,\n SpatialFilterPolyfillMode,\n TileResolution,\n Tilejson,\n Tilestats,\n Layer,\n Attribute,\n VectorLayer,\n RasterMetadata,\n RasterMetadataBand,\n RasterMetadataBandStats,\n RasterBandType,\n RasterBandColorinterp,\n} from './types.js';\n\nexport {boundaryQuerySource} from './boundary-query-source.js';\nexport type {\n BoundaryQuerySourceOptions,\n BoundaryQuerySourceResponse,\n} from './boundary-query-source.js';\n\nexport {boundaryTableSource} from './boundary-table-source.js';\nexport type {\n BoundaryTableSourceOptions,\n BoundaryTableSourceResponse,\n} from './boundary-table-source.js';\n\nexport {h3QuerySource} from './h3-query-source.js';\nexport type {\n H3QuerySourceOptions,\n H3QuerySourceResponse,\n} from './h3-query-source.js';\n\nexport {h3TableSource} from './h3-table-source.js';\nexport type {\n H3TableSourceOptions,\n H3TableSourceResponse,\n} from './h3-table-source.js';\n\nexport {h3TilesetSource} from './h3-tileset-source.js';\nexport type {\n H3TilesetSourceOptions,\n H3TilesetSourceResponse,\n} from './h3-tileset-source.js';\n\nexport {rasterSource} from './raster-source.js';\nexport type {RasterSourceOptions} from './raster-source.js';\n\nexport {quadbinQuerySource} from './quadbin-query-source.js';\nexport type {\n QuadbinQuerySourceOptions,\n QuadbinQuerySourceResponse,\n} from './quadbin-query-source.js';\n\nexport {quadbinTableSource} from './quadbin-table-source.js';\nexport type {\n QuadbinTableSourceOptions,\n QuadbinTableSourceResponse,\n} from './quadbin-table-source.js';\n\nexport {quadbinTilesetSource} from './quadbin-tileset-source.js';\nexport type {\n QuadbinTilesetSourceOptions,\n QuadbinTilesetSourceResponse,\n} from './quadbin-tileset-source.js';\n\nexport {vectorQuerySource} from './vector-query-source.js';\nexport type {\n VectorQuerySourceOptions,\n VectorQuerySourceResponse,\n} from './vector-query-source.js';\n\nexport {vectorTableSource} from './vector-table-source.js';\nexport type {\n VectorTableSourceOptions,\n VectorTableSourceResponse,\n} from './vector-table-source.js';\n\nexport {vectorTilesetSource} from './vector-tileset-source.js';\nexport type {\n VectorTilesetSourceOptions,\n VectorTilesetSourceResponse,\n} from './vector-tileset-source.js';\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_API_BASE_URL} from '../constants.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {buildSourceUrl} from '../api/endpoints.js';\nimport {requestWithParameters} from '../api/request-with-parameters.js';\nimport type {\n SourceOptionalOptions,\n SourceRequiredOptions,\n TilejsonMapInstantiation,\n TilejsonResult,\n} from './types.js';\nimport type {MapType} from '../types.js';\nimport type {APIErrorContext} from '../api/index.js';\nimport {getClient} from '../client.js';\n\nexport const SOURCE_DEFAULTS: Omit<SourceOptionalOptions, 'clientId'> = {\n apiBaseUrl: DEFAULT_API_BASE_URL,\n headers: {},\n maxLengthURL: DEFAULT_MAX_LENGTH_URL,\n};\n\nexport async function baseSource<UrlParameters extends Record<string, unknown>>(\n endpoint: MapType,\n options: Partial<SourceOptionalOptions> & SourceRequiredOptions,\n urlParameters: UrlParameters\n): Promise<TilejsonResult> {\n const {accessToken, connectionName, cache, ...optionalOptions} = options;\n const mergedOptions = {\n ...SOURCE_DEFAULTS,\n clientId: getClient(),\n accessToken,\n connectionName,\n endpoint,\n };\n for (const key in optionalOptions) {\n if (optionalOptions[key as keyof typeof optionalOptions]) {\n (mergedOptions as any)[key] =\n optionalOptions[key as keyof typeof optionalOptions];\n }\n }\n const baseUrl = buildSourceUrl(mergedOptions);\n const {clientId, maxLengthURL, localCache} = mergedOptions;\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {client: clientId, ...options.tags, ...urlParameters};\n\n const errorContext: APIErrorContext = {\n requestType: 'Map instantiation',\n connection: options.connectionName,\n type: endpoint,\n source: JSON.stringify(parameters, undefined, 2),\n };\n const {tilejson, schema} =\n await requestWithParameters<TilejsonMapInstantiation>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n\n const dataUrl = tilejson.url[0];\n if (cache) {\n cache.value = parseInt(\n new URL(dataUrl).searchParams.get('cache') || '',\n 10\n );\n }\n errorContext.requestType = 'Map data';\n\n const json = await requestWithParameters<TilejsonResult>({\n baseUrl: dataUrl,\n parameters: {client: clientId},\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n if (accessToken) {\n json.accessToken = accessToken;\n }\n if (schema) {\n json.schema = schema;\n }\n return json;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isPureObject} from '../utils.js';\nimport {CartoAPIError, type APIErrorContext} from './carto-api-error.js';\nimport {V3_MINOR_VERSION} from '../constants-internal.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {getClient} from '../client.js';\nimport type {LocalCacheOptions} from '../sources/types.js';\n\nconst DEFAULT_HEADERS = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n};\n\nconst DEFAULT_REQUEST_CACHE = new Map<string, Promise<unknown>>();\n\nexport async function requestWithParameters<T = any>({\n baseUrl,\n parameters = {},\n headers: customHeaders = {},\n errorContext,\n maxLengthURL = DEFAULT_MAX_LENGTH_URL,\n localCache,\n signal,\n}: {\n baseUrl: string;\n parameters?: Record<string, unknown>;\n headers?: Record<string, string>;\n errorContext: APIErrorContext;\n maxLengthURL?: number;\n localCache?: LocalCacheOptions;\n signal?: AbortSignal;\n}): Promise<T> {\n // Parameters added to all requests issued with `requestWithParameters()`.\n // These parameters override parameters already in the base URL, but not\n // user-provided parameters.\n parameters = {\n v: V3_MINOR_VERSION,\n client: getClient(),\n ...(typeof deck !== 'undefined' &&\n deck.VERSION && {deckglVersion: deck.VERSION}),\n ...parameters,\n };\n\n baseUrl = excludeURLParameters(baseUrl, Object.keys(parameters));\n const key = createCacheKey(baseUrl, parameters, customHeaders);\n\n const {\n cache: REQUEST_CACHE,\n canReadCache,\n canStoreInCache,\n } = getCacheSettings(localCache);\n\n if (canReadCache && REQUEST_CACHE.has(key)) {\n return REQUEST_CACHE.get(key) as Promise<T>;\n }\n\n const url = createURLWithParameters(baseUrl, parameters);\n const headers = {...DEFAULT_HEADERS, ...customHeaders};\n\n /* global fetch */\n const fetchPromise =\n url.length > maxLengthURL\n ? fetch(baseUrl, {\n method: 'POST',\n body: JSON.stringify(parameters),\n headers,\n signal,\n })\n : fetch(url, {headers, signal});\n\n let response: Response | undefined;\n let responseJson: unknown;\n const jsonPromise: Promise<T> = fetchPromise\n .then((_response: Response) => {\n response = _response;\n return response.json();\n })\n .then((json: any) => {\n responseJson = json;\n if (!response || !response.ok) {\n throw new Error(json.error);\n }\n return json;\n })\n .catch((error: Error) => {\n if (canStoreInCache) {\n REQUEST_CACHE.delete(key);\n }\n throw new CartoAPIError(error, errorContext, response, responseJson);\n });\n\n if (canStoreInCache) {\n REQUEST_CACHE.set(key, jsonPromise);\n }\n return jsonPromise;\n}\n\nfunction getCacheSettings(localCache: LocalCacheOptions | undefined) {\n const canReadCache = localCache?.cacheControl?.includes('no-cache')\n ? false\n : true;\n const canStoreInCache = localCache?.cacheControl?.includes('no-store')\n ? false\n : true;\n const cache = localCache?.cache || DEFAULT_REQUEST_CACHE;\n\n return {\n cache,\n canReadCache,\n canStoreInCache,\n };\n}\n\nfunction createCacheKey(\n baseUrl: string,\n parameters: Record<string, unknown>,\n headers: Record<string, string>\n): string {\n const parameterEntries = Object.entries(parameters).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n const headerEntries = Object.entries(headers).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n return JSON.stringify({\n baseUrl,\n parameters: parameterEntries,\n headers: headerEntries,\n });\n}\n\n/**\n * Appends query string parameters to a URL. Existing URL parameters are kept,\n * unless there is a conflict, in which case the new parameters override\n * those already in the URL.\n */\nfunction createURLWithParameters(\n baseUrlString: string,\n parameters: Record<string, unknown>\n): string {\n const baseUrl = new URL(baseUrlString);\n for (const [key, value] of Object.entries(parameters)) {\n if (isPureObject(value) || Array.isArray(value)) {\n baseUrl.searchParams.set(key, JSON.stringify(value));\n } else {\n if (value !== null && value !== undefined) {\n baseUrl.searchParams.set(\n key,\n (value as string | boolean | number).toString()\n );\n }\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Deletes query string parameters from a URL.\n */\nfunction excludeURLParameters(baseUrlString: string, parameters: string[]) {\n const baseUrl = new URL(baseUrlString);\n for (const param of parameters) {\n if (baseUrl.searchParams.has(param)) {\n baseUrl.searchParams.delete(param);\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Clears the HTTP response cache for all requests using the default cache.\n * @internal\n */\nexport function clearDefaultRequestCache() {\n DEFAULT_REQUEST_CACHE.clear();\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {QueryParameters} from '../types.js';\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryQuerySourceOptions = SourceOptions &\n FilterOptions & {\n columns?: string[];\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: QueryParameters;\n };\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: Record<string, unknown> | unknown[];\n};\n\nexport type BoundaryQuerySourceResponse = TilejsonResult;\n\nexport const boundaryQuerySource = async function (\n options: BoundaryQuerySourceOptions\n): Promise<BoundaryQuerySourceResponse> {\n const {\n columns,\n filters,\n tilesetTableName,\n propertiesSqlQuery,\n queryParameters,\n } = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesSqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryTableSourceOptions = SourceOptions &\n FilterOptions & {\n tilesetTableName: string;\n columns?: string[];\n propertiesTableName: string;\n };\ntype UrlParameters = {\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n columns?: string;\n propertiesTableName: string;\n};\n\nexport type BoundaryTableSourceResponse = TilejsonResult;\n\nexport const boundaryTableSource = async function (\n options: BoundaryTableSourceOptions\n): Promise<BoundaryTableSourceResponse> {\n const {filters, tilesetTableName, columns, propertiesTableName} = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesTableName,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type H3QuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type H3QuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;\n\nexport const h3QuerySource = async function (\n options: H3QuerySourceOptions\n): Promise<H3QuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n sqlQuery,\n spatialDataColumn = 'h3',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n spatialDataColumn,\n spatialDataType,\n q: sqlQuery,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","import type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {FilterLogicalOperator, Filter} from '../types.js';\nimport {getClient} from '../client.js';\nimport type {SourceOptions} from '../sources/index.js';\nimport {ApiVersion, DEFAULT_API_BASE_URL} from '../constants.js';\n\nexport interface WidgetSourceProps extends Omit<SourceOptions, 'filters'> {\n apiVersion?: ApiVersion;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n}\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetSource<\n Props extends WidgetSourceProps = WidgetSourceProps,\n> {\n readonly props: Props;\n\n static defaultProps: Partial<WidgetSourceProps> = {\n apiVersion: ApiVersion.V3,\n apiBaseUrl: DEFAULT_API_BASE_URL,\n clientId: getClient(),\n filters: {},\n filtersLogicalOperator: 'and',\n };\n\n constructor(props: Props) {\n this.props = {\n ...WidgetSource.defaultProps,\n clientId: getClient(), // Refresh clientId, default may have changed.\n ...props,\n };\n }\n\n /**\n * Destroys the widget source and releases allocated resources.\n *\n * For remote sources (tables, queries) this has no effect, but for local\n * sources (tilesets, rasters) these resources will affect performance\n * and stability if many (10+) sources are created and not released.\n */\n destroy() {\n // no-op in most cases, but required for worker sources.\n }\n\n /**\n * Returns a list of labeled datapoints for categorical data. Suitable for\n * charts including grouped bar charts, pie charts, and tree charts.\n */\n abstract getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse>;\n\n /**\n * Given a list of feature IDs (as found in `_carto_feature_id`) returns all\n * matching features. In datasets containing features with duplicate geometries,\n * feature IDs may be duplicated (IDs are a hash of geometry) and so more\n * results may be returned than IDs in the request.\n * @internal\n * @experimental\n */\n abstract getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse>;\n\n /**\n * Returns a scalar numerical statistic over all matching data. Suitable\n * for 'headline' or 'scorecard' figures such as counts and sums.\n */\n abstract getFormula(options: FormulaRequestOptions): Promise<FormulaResponse>;\n\n /**\n * Returns a list of labeled datapoints for 'bins' of data defined as ticks\n * over a numerical range. Suitable for histogram charts.\n */\n abstract getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse>;\n\n /**\n * Returns a range (min and max) for a numerical column of matching rows.\n * Suitable for displaying certain 'headline' or 'scorecard' statistics,\n * or rendering a range slider UI for filtering.\n */\n abstract getRange(options: RangeRequestOptions): Promise<RangeResponse>;\n\n /**\n * Returns a list of bivariate datapoints defined as numerical 'x' and 'y'\n * values. Suitable for rendering scatter plots.\n */\n abstract getScatter(options: ScatterRequestOptions): Promise<ScatterResponse>;\n\n /**\n * Returns a list of arbitrary data rows, with support for pagination and\n * sorting. Suitable for displaying tables and lists.\n */\n abstract getTable(options: TableRequestOptions): Promise<TableResponse>;\n\n /**\n * Returns a series of labeled numerical values, grouped into equally-sized\n * time intervals. Suitable for rendering time series charts.\n */\n abstract getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse>;\n}\n","import type {\n H3QuerySourceOptions,\n QuadbinQuerySourceOptions,\n VectorQuerySourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerQuerySourceOptions =\n | Omit<VectorQuerySourceOptions, 'filters'>\n | Omit<H3QuerySourceOptions, 'filters'>\n | Omit<QuadbinQuerySourceOptions, 'filters'>;\n\nexport type WidgetQuerySourceResult = {widgetSource: WidgetQuerySource};\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorQuerySource}, {@link h3QuerySource}, or {@link quadbinQuerySource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorQuerySource } from '@carto/api-client';\n *\n * const data = vectorQuerySource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * sqlQuery: 'SELECT * FROM carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetQuerySource extends WidgetRemoteSource<\n LayerQuerySourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'query',\n data: this.props.sqlQuery,\n queryParameters: this.props.queryParameters,\n };\n }\n}\n","import {executeModel, type ModelSource} from '../models/index.js';\nimport type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {assert, normalizeObjectKeys} from '../utils.js';\nimport {DEFAULT_TILE_RESOLUTION} from '../constants-internal.js';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport type {Filters} from '../types.js';\nimport {AggregationTypes, ApiVersion} from '../constants.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\n\nexport type WidgetRemoteSourceProps = WidgetSourceProps;\n\n/**\n * Source for Widget API requests.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetRemoteSource<\n Props extends WidgetRemoteSourceProps,\n> extends WidgetSource<Props> {\n /**\n * Subclasses of {@link WidgetRemoteSource} must implement this method, calling\n * {@link WidgetRemoteSource.prototype._getModelSource} for common source\n * properties, and adding additional required properties including 'type' and\n * 'data'.\n */\n protected abstract getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource;\n\n protected _getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): Omit<ModelSource, 'type' | 'data'> {\n const props = this.props;\n return {\n apiVersion: props.apiVersion as ApiVersion,\n apiBaseUrl: props.apiBaseUrl as string,\n clientId: props.clientId as string,\n accessToken: props.accessToken,\n connectionName: props.connectionName,\n filters: getApplicableFilters(filterOwner, filters || props.filters),\n filtersLogicalOperator: props.filtersLogicalOperator,\n spatialDataType: props.spatialDataType,\n spatialDataColumn: props.spatialDataColumn,\n tags: props.tags,\n };\n }\n\n async getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n rawResult,\n ...params\n } = options;\n const {column, operation, operationColumn, operationExp, othersThreshold} =\n params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n const result = await executeModel({\n model: 'category',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n operation,\n operationExp,\n operationColumn: operationColumn || column,\n othersThreshold,\n },\n opts: {signal, headers: this.props.headers},\n });\n\n const normalizedRows = normalizeObjectKeys(result.rows || []);\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return normalizedRows;\n }\n\n return [\n ...normalizedRows,\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n async getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, dataType, featureIds, z, limit, tileResolution} = params;\n\n type FeaturesModelResponse = {rows: Record<string, unknown>[]};\n\n return executeModel({\n model: 'pick',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n columns,\n dataType,\n featureIds,\n z,\n limit: limit || 1000,\n tileResolution: tileResolution || DEFAULT_TILE_RESOLUTION,\n },\n opts: {signal, headers: this.props.headers},\n // Avoid `normalizeObjectKeys()`, which changes column names.\n }).then(({rows}: FeaturesModelResponse) => ({rows}));\n }\n\n async getFormula(options: FormulaRequestOptions): Promise<FormulaResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n operationExp,\n ...params\n } = options;\n const {column, operation} = params;\n\n type FormulaModelResponse = {rows: {value: number}[]};\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n return executeModel({\n model: 'formula',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: column ?? '*',\n operation: operation ?? AggregationTypes.Count,\n operationExp,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: FormulaModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column, operation, ticks} = params;\n\n type HistogramModelResponse = {rows: {tick: number; value: number}[]};\n\n const data = await executeModel({\n model: 'histogram',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column, operation, ticks},\n opts: {signal, headers: this.props.headers},\n }).then((res: HistogramModelResponse) => normalizeObjectKeys(res.rows));\n\n if (data.length) {\n // Given N ticks the API returns up to N+1 bins, omitting any empty bins. Bins\n // include 1 bin below the lowest tick, N-1 between ticks, and 1 bin above the highest tick.\n const result = Array(ticks.length + 1).fill(0);\n data.forEach(\n ({tick, value}: {tick: number; value: number}) => (result[tick] = value)\n );\n return result;\n }\n\n return [];\n }\n\n async getRange(options: RangeRequestOptions): Promise<RangeResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column} = params;\n\n type RangeModelResponse = {rows: {min: number; max: number}[]};\n\n return executeModel({\n model: 'range',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column},\n opts: {signal, headers: this.props.headers},\n }).then((res: RangeModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getScatter(options: ScatterRequestOptions): Promise<ScatterResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {xAxisColumn, xAxisJoinOperation, yAxisColumn, yAxisJoinOperation} =\n params;\n\n // Make sure this is sync with the same constant in cloud-native/maps-api\n const HARD_LIMIT = 500;\n\n type ScatterModelResponse = {rows: {x: number; y: number}[]};\n\n return executeModel({\n model: 'scatterplot',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n xAxisColumn,\n xAxisJoinOperation,\n yAxisColumn,\n yAxisJoinOperation,\n limit: HARD_LIMIT,\n },\n opts: {signal, headers: this.props.headers},\n })\n .then((res: ScatterModelResponse) => normalizeObjectKeys(res.rows))\n .then((res) => res.map(({x, y}: {x: number; y: number}) => [x, y]));\n }\n\n async getTable(options: TableRequestOptions): Promise<TableResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, sortBy, sortDirection, offset = 0, limit = 10} = params;\n\n type TableModelResponse = {\n rows: Record<string, number | string>[];\n metadata: {total: number};\n };\n\n return executeModel({\n model: 'table',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: columns,\n sortBy,\n sortDirection,\n limit,\n offset,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TableModelResponse) => ({\n // Avoid `normalizeObjectKeys()`, which changes column names.\n rows: res.rows ?? (res as any).ROWS,\n totalCount: res.metadata?.total ?? (res as any).METADATA?.TOTAL,\n }));\n }\n\n async getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {\n column,\n operationColumn,\n joinOperation,\n operation,\n operationExp,\n stepSize,\n stepMultiplier,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n } = params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n type TimeSeriesModelResponse = {\n rows: {name: string; value: number}[];\n metadata: {categories: string[]};\n };\n\n return executeModel({\n model: 'timeseries',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n stepSize,\n stepMultiplier,\n operationColumn: operationColumn || column,\n joinOperation,\n operation,\n operationExp,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TimeSeriesModelResponse) => ({\n rows: normalizeObjectKeys(res.rows),\n categories: res.metadata?.categories,\n }));\n }\n}\n","export {executeModel} from './model.js';\nexport type {Model, ModelSource} from './model.js';\nexport type {ModelRequestOptions} from './common.js';\n","import {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {\n Filter,\n FilterLogicalOperator,\n MapType,\n QueryParameters,\n SpatialFilter,\n} from '../types.js';\nimport {assert, isPureObject} from '../utils.js';\nimport {type ModelRequestOptions, makeCall} from './common.js';\nimport {ApiVersion} from '../constants.js';\nimport type {\n SpatialDataType,\n SpatialFilterPolyfillMode,\n} from '../sources/types.js';\n\n/** @privateRemarks Source: @carto/react-api */\nconst AVAILABLE_MODELS = [\n 'category',\n 'histogram',\n 'formula',\n 'pick',\n 'timeseries',\n 'range',\n 'scatterplot',\n 'table',\n] as const;\n\nexport type Model = (typeof AVAILABLE_MODELS)[number];\n\nexport interface ModelSource {\n type: MapType;\n apiVersion: ApiVersion;\n apiBaseUrl: string;\n accessToken: string;\n clientId: string;\n connectionName: string;\n data: string;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n spatialFilter?: SpatialFilter;\n queryParameters?: QueryParameters;\n spatialDataColumn?: string;\n spatialDataType?: SpatialDataType;\n spatialFiltersMode?: SpatialFilterPolyfillMode;\n tags?: Record<string, string>;\n}\n\nconst {V3} = ApiVersion;\nconst REQUEST_GET_MAX_URL_LENGTH = 2048;\n\n/**\n * Execute a SQL model request.\n * @privateRemarks Source: @carto/react-api\n */\nexport function executeModel(props: {\n model: Model;\n source: ModelSource;\n params: Record<string, unknown>;\n opts?: Partial<ModelRequestOptions>;\n}) {\n assert(props.source, 'executeModel: missing source');\n assert(props.model, 'executeModel: missing model');\n assert(props.params, 'executeModel: missing params');\n\n assert(\n AVAILABLE_MODELS.includes(props.model),\n `executeModel: model provided isn't valid. Available models: ${AVAILABLE_MODELS.join(\n ', '\n )}`\n );\n\n const {model, source, params, opts} = props;\n const {type, apiVersion, apiBaseUrl, accessToken, connectionName, clientId} =\n source;\n\n assert(apiBaseUrl, 'executeModel: missing apiBaseUrl');\n assert(accessToken, 'executeModel: missing accessToken');\n assert(apiVersion === V3, 'executeModel: SQL Model API requires CARTO 3+');\n assert(type !== 'tileset', 'executeModel: Tilesets not supported');\n\n let url = `${apiBaseUrl}/v3/sql/${connectionName}/model/${model}`;\n\n const {\n data,\n filters,\n filtersLogicalOperator = 'and',\n spatialDataType = 'geo',\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialFiltersMode = 'intersects',\n tags,\n } = source;\n\n const queryParams: Record<string, unknown> = {\n type,\n client: clientId,\n source: data,\n params,\n queryParameters: source.queryParameters || '',\n filters,\n filtersLogicalOperator,\n ...(tags ?? {}),\n };\n\n queryParams.spatialDataType = spatialDataType;\n queryParams.spatialDataColumn = spatialDataColumn;\n\n if (source.spatialFilter) {\n // API supports multiple filters, we apply it only to spatialDataColumn\n queryParams.spatialFilters = {[spatialDataColumn]: source.spatialFilter};\n if (spatialDataType !== 'geo') {\n queryParams.spatialFiltersMode = spatialFiltersMode;\n }\n }\n\n const urlWithSearchParams =\n url + '?' + objectToURLSearchParams(queryParams).toString();\n const isGet = urlWithSearchParams.length <= REQUEST_GET_MAX_URL_LENGTH;\n if (isGet) {\n url = urlWithSearchParams;\n }\n return makeCall({\n url,\n accessToken: source.accessToken,\n opts: {\n ...opts,\n method: isGet ? 'GET' : 'POST',\n ...(!isGet && {body: JSON.stringify(queryParams)}),\n },\n });\n}\n\nfunction objectToURLSearchParams(object: Record<string, unknown>) {\n const params = new URLSearchParams();\n for (const key in object) {\n if (isPureObject(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (Array.isArray(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (object[key] === null) {\n params.append(key, 'null');\n } else if (object[key] !== undefined) {\n params.append(key, String(object[key] as unknown));\n }\n }\n return params;\n}\n","import {InvalidColumnError} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-api */\nexport interface ModelRequestOptions {\n method: 'GET' | 'POST';\n headers?: Record<string, string>;\n signal?: AbortSignal;\n otherOptions?: Record<string, unknown>;\n body?: string;\n}\n\ninterface ModelErrorResponse {\n error?: string | string[];\n hint?: string;\n column_name?: string;\n}\n\n/**\n * Return more descriptive error from API\n * @privateRemarks Source: @carto/react-api\n */\nexport function dealWithApiError({\n response,\n data,\n}: {\n response: Response;\n data: ModelErrorResponse;\n}) {\n if (data.error === 'Column not found') {\n throw new InvalidColumnError(`${data.error} ${data.column_name}`);\n }\n\n if (\n typeof data.error === 'string' &&\n data.error?.includes('Missing columns')\n ) {\n throw new InvalidColumnError(data.error);\n }\n\n switch (response.status) {\n case 401:\n throw new Error('Unauthorized access. Invalid credentials');\n case 403:\n throw new Error('Forbidden access to the requested data');\n default:\n throw new Error(\n data && data.error && typeof data.error === 'string'\n ? data.error\n : JSON.stringify(data?.hint || data.error?.[0])\n );\n }\n}\n\n/** @privateRemarks Source: @carto/react-api */\nexport async function makeCall({\n url,\n accessToken,\n opts,\n}: {\n url: string;\n accessToken: string;\n opts: ModelRequestOptions;\n}) {\n let response;\n let data;\n const isPost = opts?.method === 'POST';\n try {\n response = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...(isPost && {'Content-Type': 'application/json'}),\n ...opts.headers,\n },\n ...(isPost && {\n method: opts?.method,\n body: opts?.body,\n }),\n signal: opts?.signal,\n ...opts?.otherOptions,\n });\n data = await response.json();\n } catch (error) {\n if ((error as Error).name === 'AbortError') throw error;\n\n throw new Error(`Failed request: ${error as Error}`);\n }\n\n if (!response.ok) {\n dealWithApiError({response, data});\n }\n\n return data;\n}\n","import {FilterType} from './constants.js';\nimport type {Filter} from './types.js';\nimport {isEmptyObject} from './utils.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\ntype FilterTypeOptions<T extends FilterType> = {\n type: T;\n column: string;\n} & Filter[T];\n\nexport type AddFilterOptions =\n | FilterTypeOptions<FilterType.IN>\n | FilterTypeOptions<FilterType.BETWEEN>\n | FilterTypeOptions<FilterType.CLOSED_OPEN>\n | FilterTypeOptions<FilterType.TIME>\n | FilterTypeOptions<FilterType.STRING_SEARCH>;\n\n/**\n * Adds a {@link Filter} to the filter set. Any previous filters with the same\n * `column` and `type` will be replaced.\n */\nexport function addFilter(\n filters: Record<string, Filter>,\n {column, type, values, owner}: AddFilterOptions\n): Record<string, Filter> {\n if (!filters[column]) {\n filters[column] = {};\n }\n\n const filter = {values, owner} as FilterTypeOptions<typeof type>;\n (filters[column][type] as FilterTypeOptions<typeof type>) = filter;\n\n return filters;\n}\n\nexport type RemoveFilterOptions = {\n column: string;\n owner?: string;\n};\n\n/**\n * Removes one or more {@link Filter filters} from the filter set. If only\n * `column` is specified, then all filters on that column are removed. If both\n * `column` and `owner` are specified, then only filters for that column\n * associated with the owner are removed.\n */\nexport function removeFilter(\n filters: Record<string, Filter>,\n {column, owner}: RemoveFilterOptions\n): Record<string, Filter> {\n const filter = filters[column];\n if (!filter) {\n return filters;\n }\n\n if (owner) {\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n delete filter[type as FilterType];\n }\n }\n }\n\n if (!owner || isEmptyObject(filter)) {\n delete filters[column];\n }\n\n return filters;\n}\n\n/**\n * Clears all {@link Filter filters} from the filter set.\n */\nexport function clearFilters(\n filters: Record<string, Filter>\n): Record<string, Filter> {\n for (const column of Object.keys(filters)) {\n delete filters[column];\n }\n return filters;\n}\n\nexport type HasFilterOptions = {\n column: string;\n owner?: string;\n};\n\nexport function hasFilter(\n filters: Record<string, Filter>,\n {column, owner}: HasFilterOptions\n): boolean {\n const filter = filters[column];\n if (!filter) {\n return false;\n }\n\n if (!owner) {\n return true;\n }\n\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n return true;\n }\n }\n\n return false;\n}\n\nexport type GetFilterOptions<T extends FilterType> = {\n column: string;\n type: T;\n owner?: string;\n};\n\nexport function getFilter<T extends FilterType>(\n filters: Record<string, Filter>,\n {column, type, owner}: GetFilterOptions<T>\n): Filter[T] | null {\n const filter = filters[column];\n if (!filter) {\n return null;\n }\n\n if (!owner || owner === filter[type]?.owner) {\n return filter[type] || null;\n }\n\n return null;\n}\n\n/**\n * Given all filters for a dataset, returns the subset of filters that are not\n * attributable to the given owner. Typically used to allow filterable widgets\n * to affect other widgets *without* filtering themselves.\n *\n * @privateRemarks Source: @carto/react-widgets\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n","/**\n * Name of the category that represents the \"Others\" category.\n *\n * See `WidgetSource.getCategories` for more information.\n */\nexport const OTHERS_CATEGORY_NAME = '_carto_others';\n","import type {RasterMetadata} from '../sources/index.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceProps,\n} from './widget-tileset-source.js';\n\nexport type WidgetRasterSourceProps = WidgetTilesetSourceProps & {\n rasterMetadata: RasterMetadata;\n spatialDataType: 'quadbin';\n};\n\nexport type WidgetRasterSourceResult = {widgetSource: WidgetRasterSource};\n\nexport class WidgetRasterSource extends WidgetTilesetSource<WidgetRasterSourceProps> {}\n","import type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {TileFeatureExtractOptions} from '../filters/index.js';\nimport type {FeatureCollection} from 'geojson';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport {Method} from '../workers/constants.js';\nimport type {WorkerRequest, WorkerResponse} from '../workers/types.js';\nimport type {SpatialDataType, TilesetSourceOptions} from '../sources/types.js';\nimport {TileFormat} from '../constants.js';\nimport {WidgetTilesetSourceImpl} from './widget-tileset-source-impl.js';\n\nexport type WidgetTilesetSourceProps = WidgetSourceProps &\n Omit<TilesetSourceOptions, 'filters'> & {\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n };\n\nexport type WidgetTilesetSourceResult = {widgetSource: WidgetTilesetSource};\n\n/**\n * Source for Widget API requests on a data source defined by a tileset.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTilesetSource}, {@link h3TilesetSource}, or {@link quadbinTilesetSource},\n * which can be shared with map layers. Sources contain a `widgetSource`\n * property, for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTilesetSource } from '@carto/api-client';\n *\n * const data = vectorTilesetSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_rasters.my_tileset_source'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTilesetSource<\n Props extends WidgetTilesetSourceProps = WidgetTilesetSourceProps,\n> extends WidgetSource<Props> {\n protected _localImpl: WidgetTilesetSourceImpl | null = null;\n\n protected _workerImpl: Worker | null = null;\n protected _workerEnabled: boolean;\n protected _workerNextRequestId = 1;\n\n constructor(props: Props) {\n super(props);\n\n this._workerEnabled =\n (props.widgetWorker ?? true) &&\n TSUP_FORMAT !== 'cjs' &&\n typeof Worker !== 'undefined';\n\n if (!this._workerEnabled) {\n this._localImpl = new WidgetTilesetSourceImpl(this.props);\n }\n }\n\n destroy() {\n this._localImpl?.destroy();\n this._localImpl = null;\n\n this._workerImpl?.terminate();\n this._workerImpl = null;\n\n super.destroy();\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WEB WORKER MANAGEMENT\n\n /**\n * Returns an initialized Worker, to be reused for the lifecycle of this\n * source instance.\n */\n protected _getWorker(): Worker {\n if (this._workerImpl) {\n return this._workerImpl;\n }\n\n if (this.props.widgetWorkerUrl) {\n this._workerImpl = new Worker(this.props.widgetWorkerUrl, {\n name: 'cartowidgettileset',\n });\n } else {\n // For Vite (and perhaps other bundlers) to parse WorkerOptions, it\n // must be a static, inline object – duplicated below.\n this._workerImpl = new Worker(\n new URL('@carto/api-client/worker', import.meta.url),\n {\n type: 'module',\n name: 'cartowidgettileset',\n }\n );\n }\n\n this._workerImpl.addEventListener('error', (e) => {\n console.error('widget-tileset-source worker error', e);\n });\n\n this._workerImpl.postMessage({\n method: Method.INIT,\n params: [this.props],\n } as WorkerRequest);\n\n return this._workerImpl;\n }\n\n /** Executes a given method on the worker. */\n protected _executeWorkerMethod<T>(\n method: Method,\n params: unknown[],\n signal?: AbortSignal\n ): Promise<T> {\n if (!this._workerEnabled) {\n // @ts-expect-error No type-checking dynamic method name.\n return this._localImpl[method](...params);\n }\n\n const worker = this._getWorker();\n const requestId = this._workerNextRequestId++;\n\n let resolve: ((value: T) => void) | null = null;\n let reject: ((reason: any) => void) | null = null;\n\n // If worker sends message to main process, check whether it's a response\n // to this request, and whether the request can been aborted. Then resolve\n // or reject the Promise.\n function onMessage(e: MessageEvent) {\n const response = e.data as WorkerResponse;\n if (response.requestId !== requestId) return;\n if (signal?.aborted) return; // handled by 'abort' listener\n\n if (response.ok) {\n resolve!(response.result as T);\n } else {\n reject!(new Error(response.error));\n }\n }\n\n // If request is aborted by user, immediately reject the Promise.\n function onAbort() {\n reject!(new Error(signal!.reason));\n }\n\n worker.addEventListener('message', onMessage);\n signal?.addEventListener('abort', onAbort);\n\n // Send the task to the worker, creating a Promise to resolve/reject later.\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n\n worker.postMessage({\n requestId,\n method,\n params,\n } as WorkerRequest);\n });\n\n // Whether the task completes, fails, or aborts: clean up afterward.\n void promise.finally(() => {\n worker.removeEventListener('message', onMessage);\n signal?.removeEventListener('abort', onAbort);\n });\n\n return promise;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // DATA LOADING\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadTiles(tiles);\n }\n\n const worker = this._getWorker();\n\n // We cannot pass an instance of Tile2DHeader to a Web Worker, and must\n // extract properties required for widget calculations. Note that the\n // `tile: Tile = {...}` assignment is structured so TS will warn if any\n // types required by the internal 'Tile' type are missing.\n tiles = (tiles as Tile[]).map(\n ({id, index, bbox, isVisible, data}: Tile) => {\n const tile: Tile = {\n id,\n index,\n isVisible,\n data,\n bbox,\n };\n return tile;\n }\n );\n\n worker.postMessage({\n method: Method.LOAD_TILES,\n params: [tiles],\n } as WorkerRequest);\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n if (!this._workerEnabled) {\n return this._localImpl?.setTileFeatureExtractOptions(options);\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.SET_TILE_FEATURE_EXTRACT_OPTIONS,\n params: [options],\n });\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadGeoJSON({geojson, spatialFilter});\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.LOAD_GEOJSON,\n params: [{geojson, spatialFilter}],\n } as WorkerRequest);\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WIDGETS API\n\n // eslint-disable-next-line @typescript-eslint/require-await\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n signal,\n ...options\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n return this._executeWorkerMethod(Method.GET_FORMULA, [options], signal);\n }\n\n override async getHistogram({\n signal,\n ...options\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n return this._executeWorkerMethod(Method.GET_HISTOGRAM, [options], signal);\n }\n\n override async getCategories({\n signal,\n ...options\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n return this._executeWorkerMethod(Method.GET_CATEGORIES, [options], signal);\n }\n\n override async getScatter({\n signal,\n ...options\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n return this._executeWorkerMethod(Method.GET_SCATTER, [options], signal);\n }\n\n override async getTable({\n signal,\n ...options\n }: TableRequestOptions): Promise<TableResponse> {\n return this._executeWorkerMethod(Method.GET_TABLE, [options], signal);\n }\n\n override async getTimeSeries({\n signal,\n ...options\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n return this._executeWorkerMethod(Method.GET_TIME_SERIES, [options], signal);\n }\n\n override async getRange({\n signal,\n ...options\n }: RangeRequestOptions): Promise<RangeResponse> {\n return this._executeWorkerMethod(Method.GET_RANGE, [options], signal);\n }\n}\n","/* eslint-disable @typescript-eslint/require-await */\nimport type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {InvalidColumnError, assert, assignOptional} from '../utils.js';\nimport type {Filter, SpatialFilter, Tile} from '../types.js';\n\nimport {\n type TileFeatureExtractOptions,\n applyFilters,\n geojsonFeatures,\n tileFeatures,\n} from '../filters/index.js';\nimport {\n aggregationFunctions,\n applySorting,\n groupValuesByColumn,\n groupValuesByDateColumn,\n histogram,\n scatterPlot,\n} from '../operations/index.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {FeatureCollection} from 'geojson';\nimport {WidgetSource} from './widget-source.js';\nimport {booleanEqual} from '@turf/boolean-equal';\nimport type {WidgetTilesetSourceProps} from './widget-tileset-source.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {AggregationTypes} from '../constants.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\n\n// TODO(cleanup): Parameter defaults in source functions and widget API calls are\n// currently duplicated and possibly inconsistent. Consider consolidating and\n// operating on Required<T> objects. See:\n// https://github.com/CartoDB/carto-api-client/issues/39\n\n/**\n * Local (in-memory) implementation of tileset widget calculations. This class\n * may be instantiated by {@link WidgetTilesetSource} in a Web Worker when\n * supported, or on the main thread.\n */\nexport class WidgetTilesetSourceImpl extends WidgetSource<WidgetTilesetSourceProps> {\n private _tiles: Tile[] = [];\n private _features: FeatureData[] = [];\n private _tileFeatureExtractOptions: TileFeatureExtractOptions = {};\n private _tileFeatureExtractPreviousInputs: {spatialFilter?: SpatialFilter} =\n {};\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n this._tiles = tiles as Tile[];\n this._features.length = 0;\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n this._tileFeatureExtractOptions = options;\n this._features.length = 0;\n }\n\n protected _extractTileFeatures(spatialFilter?: SpatialFilter) {\n // When spatial filter has not changed, don't redo extraction. If tiles or\n // tile extract options change, features will have been cleared already.\n const prevInputs = this._tileFeatureExtractPreviousInputs;\n if (\n this._features.length &&\n spatialFilterEquals(prevInputs.spatialFilter, spatialFilter)\n ) {\n return;\n }\n\n this._features = tileFeatures({\n ...assignOptional({}, this.props, this._tileFeatureExtractOptions),\n tiles: this._tiles,\n spatialFilter,\n });\n\n prevInputs.spatialFilter = spatialFilter;\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n this._features = geojsonFeatures({\n geojson,\n spatialFilter,\n ...this._tileFeatureExtractOptions,\n });\n this._tileFeatureExtractPreviousInputs.spatialFilter = spatialFilter;\n }\n\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n column = '*',\n operation = AggregationTypes.Count,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (filteredFeatures.length === 0 && operation !== AggregationTypes.Count) {\n return {value: null};\n }\n\n if (operation === AggregationTypes.Custom) {\n throw new Error('Custom aggregation not supported for tilesets');\n }\n\n // Column is required except when operation is 'count'.\n if ((column && column !== '*') || operation !== AggregationTypes.Count) {\n assertColumn(this._features, column);\n }\n\n const targetOperation = aggregationFunctions[operation];\n return {\n value: targetOperation(filteredFeatures, column, joinOperation),\n };\n }\n\n override async getHistogram({\n operation = AggregationTypes.Count,\n ticks,\n column,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n return [];\n }\n\n assertColumn(this._features, column);\n\n return histogram({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(column),\n joinOperation,\n ticks,\n operation,\n });\n }\n\n override async getCategories({\n column,\n operation = AggregationTypes.Count,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n othersThreshold,\n rawResult,\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, column, operationColumn as string);\n\n const result = groupValuesByColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n joinOperation,\n keysColumn: column,\n operation,\n othersThreshold,\n });\n\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return result?.rows || [];\n }\n\n return [\n ...(result?.rows || []),\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n override async getScatter({\n xAxisColumn,\n yAxisColumn,\n xAxisJoinOperation,\n yAxisJoinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, xAxisColumn, yAxisColumn);\n\n return scatterPlot({\n data: filteredFeatures,\n xAxisColumns: normalizeColumns(xAxisColumn),\n xAxisJoinOperation,\n yAxisColumns: normalizeColumns(yAxisColumn),\n yAxisJoinOperation,\n });\n }\n\n override async getTable({\n columns,\n searchFilterColumn,\n searchFilterText,\n sortBy,\n sortDirection,\n sortByColumnType,\n offset = 0,\n limit = 10,\n filters,\n filterOwner,\n spatialFilter,\n }: TableRequestOptions): Promise<TableResponse> {\n // Filter.\n let filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: [], totalCount: 0};\n }\n\n // Search.\n // TODO(v0.6): Remove \"searchFilterText\" and \"searchFilterColumn\".\n if (searchFilterColumn && searchFilterText) {\n console.warn(\n 'WidgetTilesetSource: \"searchFilterText\" is deprecated, use \"filters\" and FilterType.STRING_SEARCH instead.'\n );\n filteredFeatures = filteredFeatures.filter(\n (row) =>\n row[searchFilterColumn] &&\n String(row[searchFilterColumn] as unknown)\n .toLowerCase()\n .includes(String(searchFilterText).toLowerCase())\n );\n }\n\n // Sort.\n let rows = applySorting(filteredFeatures, {\n sortBy,\n sortByDirection: sortDirection,\n sortByColumnType,\n });\n const totalCount = rows.length;\n\n // Offset and limit.\n rows = rows.slice(\n Math.min(offset, totalCount),\n Math.min(offset + limit, totalCount)\n );\n\n // Select columns.\n rows = rows.map((srcRow: FeatureData) => {\n const dstRow: FeatureData = {};\n for (const column of columns) {\n dstRow[column] = srcRow[column];\n }\n return dstRow;\n });\n\n return {rows, totalCount} as TableResponse;\n }\n\n override async getTimeSeries({\n column,\n stepSize,\n operation,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: []};\n }\n\n assertColumn(this._features, column, operationColumn as string);\n assert(\n operation !== 'custom',\n 'Custom operation not supported for tilesets'\n );\n\n const rows =\n groupValuesByDateColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n keysColumn: column,\n groupType: stepSize,\n operation,\n joinOperation,\n }) || [];\n\n return {rows};\n }\n\n override async getRange({\n column,\n filters,\n filterOwner,\n spatialFilter,\n }: RangeRequestOptions): Promise<RangeResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n // TODO: Is this the only nullable response in the Widgets API? If so,\n // can we do something more consistent?\n return null;\n }\n\n assertColumn(this._features, column);\n\n return {\n min: aggregationFunctions.min(filteredFeatures, column),\n max: aggregationFunctions.max(filteredFeatures, column),\n };\n }\n\n /****************************************************************************\n * INTERNAL\n */\n\n private _getFilteredFeatures(\n spatialFilter?: SpatialFilter,\n filters?: Record<string, Filter>,\n filterOwner?: string\n ): FeatureData[] {\n this._extractTileFeatures(spatialFilter);\n return applyFilters(\n this._features,\n getApplicableFilters(filterOwner, filters || this.props.filters),\n this.props.filtersLogicalOperator || 'and'\n );\n }\n}\n\nfunction assertColumn(\n features: FeatureData[],\n ...columnArgs: string[] | string[][]\n) {\n // Due to the multiple column shape, we normalise it as an array with normalizeColumns\n const columns = Array.from(new Set(columnArgs.map(normalizeColumns).flat()));\n\n const featureKeys = Object.keys(features[0]);\n\n // For backward compatibility, '' should pass column validation. For example,\n // operation='count',operationColumn='' is accepted.\n const invalidColumns = columns.filter(\n (column) => column && !featureKeys.includes(column)\n );\n\n if (invalidColumns.length) {\n throw new InvalidColumnError(\n `Missing column(s): ${invalidColumns.join(', ')}`\n );\n }\n}\n\nfunction normalizeColumns(columns: string | string[]): string[] {\n return Array.isArray(columns)\n ? columns\n : typeof columns === 'string'\n ? [columns]\n : [];\n}\n\nfunction spatialFilterEquals(a?: SpatialFilter, b?: SpatialFilter) {\n if (a === b) return true;\n if (!a || !b) return false;\n return booleanEqual(a, b);\n}\n","import type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type AggregationFunction = (\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n) => number;\n\n/** @privateRemarks Source: @carto/react-core */\nexport const aggregationFunctions: Record<\n Exclude<AggregationType, 'custom'>,\n AggregationFunction\n> = {\n count: (values) => values.length,\n min: (...args) => applyAggregationFunction(min, ...args),\n max: (...args) => applyAggregationFunction(max, ...args),\n sum: (...args) => applyAggregationFunction(sum, ...args),\n avg: (...args) => applyAggregationFunction(avg, ...args),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function aggregate(\n feature: FeatureData,\n keys?: string[],\n operation?: AggregationType\n): unknown {\n if (!keys?.length) {\n throw new Error('Cannot aggregate a feature without having keys');\n } else if (keys.length === 1) {\n const value = feature[keys[0]];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n }\n\n const aggregationFn =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!aggregationFn) {\n throw new Error(`${operation} isn't a valid aggregation function`);\n }\n\n return aggregationFn(\n keys.map((column) => {\n const value = feature[column];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n })\n );\n}\n\n/*\n * Forced casting to Number (just of non empty strings) allows to work-around\n * some specific situations, where a big numeric field is transformed into a string when generating the tileset(eg.PG)\n */\nfunction isPotentiallyValidNumber(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nconst applyAggregationFunction = (\n aggFn: AggregationFunction,\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n operation?: AggregationType\n) => {\n const normalizedKeys = normalizeKeys(keys);\n const elements =\n (normalizedKeys?.length || 0) <= 1\n ? filterFalsyElements(values as unknown[], normalizedKeys || [])\n : values;\n return aggFn(elements, keys, operation);\n};\n\nfunction filterFalsyElements(\n values: unknown[] | FeatureData[],\n keys: string[]\n) {\n const filterFn = (value: unknown) => value !== null && value !== undefined;\n\n if (!keys?.length) {\n return values.filter(filterFn);\n }\n\n return (values as FeatureData[]).filter((v) => filterFn(v[keys[0]]));\n}\n\n// Aggregation functions\nfunction avg(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n return sum(values, keys, joinOperation) / (values.length || 1);\n}\n\nfunction sum(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) => a + (aggregate(b, normalizedKeys, joinOperation) as number),\n 0\n );\n }\n\n return values.reduce((a: number, b: unknown) => a + (b as number), 0);\n}\n\nfunction min(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.min(a, aggregate(b, normalizedKeys, joinOperation) as number),\n Infinity\n );\n }\n\n let min = Number.POSITIVE_INFINITY;\n for (const value of values as number[]) {\n min = Math.min(min, value);\n }\n return min;\n}\n\nfunction max(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.max(a, aggregate(b, normalizedKeys, joinOperation) as number),\n -Infinity\n );\n }\n\n let max = Number.NEGATIVE_INFINITY;\n for (const value of values as number[]) {\n max = Math.max(max, value);\n }\n return max;\n}\n\n// Aux\n\n// Keys can come as a string (one column) or a strings array (multiple column)\n// Use always an array to make the code easier\nfunction normalizeKeys(keys: unknown): string[] | undefined {\n return Array.isArray(keys)\n ? keys\n : typeof keys === 'string'\n ? [keys]\n : undefined;\n}\n","import {firstBy} from 'thenby';\nimport type {SortDirection} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n// TODO(cleanup): Could this be simplified?\ntype SortColumns = string | string[] | object[];\n\ninterface SortOptions {\n sortBy?: SortColumns;\n sortByDirection?: SortDirection;\n sortByColumnType?: 'number' | 'string' | 'date';\n}\n\n/**\n * Apply sort structure to a collection of features\n * @param features\n * @param [sortOptions]\n * @param [sortOptions.sortBy] - One or more columns to sort by\n * @param [sortOptions.sortByDirection] - Direction by the columns will be sorted\n * @param [sortOptions.sortByColumnType] - Column type\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function applySorting(\n features: FeatureData[],\n {\n sortBy,\n sortByDirection = 'asc',\n sortByColumnType = 'string',\n }: SortOptions = {}\n): FeatureData[] {\n // If sortBy is undefined, pass all features\n if (sortBy === undefined) {\n return features;\n }\n\n // sortOptions exists, but are bad formatted\n const isValidSortBy =\n (Array.isArray(sortBy) && sortBy.length) || // sortBy can be an array of columns\n typeof sortBy === 'string'; // or just one column\n\n if (!isValidSortBy) {\n throw new Error('Sorting options are bad formatted');\n }\n const sortFn = createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType: sortByColumnType || 'string',\n });\n return features.sort(sortFn);\n}\n\n// Aux\nfunction createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const [firstSortOption, ...othersSortOptions] = normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n }) as Parameters<typeof firstBy>[];\n\n let sortFn = firstBy(...firstSortOption);\n for (const sortOptions of othersSortOptions) {\n sortFn = sortFn.thenBy(...sortOptions);\n }\n\n return sortFn;\n}\n\nfunction normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const numberFormat = sortByColumnType === 'number' && {\n cmp: (a: number, b: number) => a - b,\n };\n if (!Array.isArray(sortBy)) {\n sortBy = [sortBy];\n }\n return sortBy.map((sortByEl) => {\n // sortByEl is 'column'\n if (typeof sortByEl === 'string') {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n if (Array.isArray(sortByEl)) {\n // sortBy is ['column']\n if (sortByEl[1] === undefined) {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n // sortBy is ['column', { ... }]\n if (typeof sortByEl[1] === 'object') {\n const othersSortOptions = numberFormat\n ? {...numberFormat, ...sortByEl[1]}\n : sortByEl[1];\n return [\n sortByEl[0],\n {direction: sortByDirection, ...othersSortOptions},\n ];\n }\n }\n return sortByEl;\n });\n}\n","import {aggregationFunctions, aggregate} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {CategoryResponseRaw} from '../widget-sources/types.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n operation,\n othersThreshold,\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: AggregationType;\n keysColumn: string;\n operation: AggregationType;\n othersThreshold?: number;\n}): CategoryResponseRaw | null {\n if (Array.isArray(data) && data.length === 0) {\n return {rows: null};\n }\n const groups = data.reduce((accumulator, item) => {\n const group = item[keysColumn];\n\n const values = accumulator.get(group) || [];\n accumulator.set(group, values);\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid =\n (operation === 'count' ? true : aggregatedValue !== null) &&\n aggregatedValue !== undefined;\n\n if (isValid) {\n values.push(aggregatedValue);\n accumulator.set(group, values);\n }\n\n return accumulator;\n }, new Map()); // We use a map to be able to maintain the type in the key value\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!targetOperation) {\n return {rows: []};\n }\n\n const allCategories = Array.from(groups)\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort((a, b) => b.value - a.value);\n\n if (othersThreshold && allCategories.length > othersThreshold) {\n const otherValue = allCategories\n .slice(othersThreshold)\n .flatMap(({name}) => groups.get(name));\n return {\n rows: allCategories,\n metadata: {\n others: targetOperation(otherValue),\n },\n };\n }\n\n return {\n rows: allCategories,\n };\n}\n","import type {AggregationType, GroupDateType} from '../types.js';\nimport {getUTCMonday} from '../utils/dateUtils.js';\nimport {aggregate, aggregationFunctions} from './aggregation.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type GroupByFeature = {\n name: string;\n value: number;\n}[];\n\nconst GROUP_KEY_FN_MAPPING: Record<GroupDateType, (date: Date) => number> = {\n year: (date: Date) => Date.UTC(date.getUTCFullYear()),\n month: (date: Date) => Date.UTC(date.getUTCFullYear(), date.getUTCMonth()),\n week: (date: Date) => getUTCMonday(date),\n day: (date: Date) =>\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()),\n hour: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours()\n ),\n minute: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes()\n ),\n second: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds()\n ),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByDateColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n groupType,\n operation,\n}: {\n data: Record<string, unknown>[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n keysColumn: string;\n groupType: GroupDateType;\n operation?: Exclude<AggregationType, 'custom'>;\n}): GroupByFeature | null {\n if (Array.isArray(data) && data.length === 0) {\n return null;\n }\n\n const groupKeyFn = GROUP_KEY_FN_MAPPING[groupType];\n\n if (!groupKeyFn) {\n return null;\n }\n\n const groups = data.reduce((acc, item) => {\n const value = item[keysColumn];\n const formattedValue = new Date(value as number);\n const groupKey = groupKeyFn(formattedValue);\n\n if (!isNaN(groupKey)) {\n let groupedValues = acc.get(groupKey);\n if (!groupedValues) {\n groupedValues = [];\n acc.set(groupKey, groupedValues);\n }\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid = aggregatedValue !== null && aggregatedValue !== undefined;\n\n if (isValid) {\n groupedValues.push(aggregatedValue);\n acc.set(groupKey, groupedValues);\n }\n }\n\n return acc;\n }, new Map());\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n return [...groups.entries()]\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort((a, b) => a.name - b.name);\n}\n","/**\n * Returns midnight (local time) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getDay();\n const diff = dateCp.getDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setDate(diff);\n dateCp.setHours(0, 0, 0, 0);\n return dateCp.getTime();\n}\n\n/**\n * Returns midnight (UTC) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getUTCMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getUTCDay();\n const diff = dateCp.getUTCDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setUTCDate(diff);\n return Date.UTC(\n dateCp.getUTCFullYear(),\n dateCp.getUTCMonth(),\n dateCp.getUTCDate()\n );\n}\n","import {aggregate, aggregationFunctions} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/**\n * Histogram computation.\n * @privateRemarks Source: @carto/react-core\n */\nexport function histogram({\n data,\n valuesColumns,\n joinOperation,\n ticks,\n operation,\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n ticks: number[];\n operation: Exclude<AggregationType, 'custom'>;\n}): number[] {\n if (Array.isArray(data) && data.length === 0) {\n return [];\n }\n\n const binsContainer = [Number.MIN_SAFE_INTEGER, ...ticks].map(\n (tick, index, arr) => ({\n bin: index,\n start: tick,\n end: index === arr.length - 1 ? Number.MAX_SAFE_INTEGER : arr[index + 1],\n values: [] as number[],\n })\n );\n\n data.forEach((feature) => {\n const featureValue = aggregate(\n feature,\n valuesColumns,\n joinOperation\n ) as number;\n\n const isValid = featureValue !== null && featureValue !== undefined;\n\n if (!isValid) {\n return;\n }\n\n const binContainer = binsContainer.find(\n (bin) => bin.start <= featureValue && bin.end > featureValue\n );\n\n if (!binContainer) {\n return;\n }\n\n binContainer.values.push(featureValue);\n });\n\n const targetOperation = aggregationFunctions[operation];\n const transformedBins = binsContainer.map(\n (binContainer) => binContainer.values\n );\n return transformedBins.map((values) =>\n values.length ? targetOperation(values) : 0\n );\n}\n","import {aggregate} from './aggregation.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {AggregationType} from '../types.js';\n\nexport type ScatterPlotFeature = [number, number][];\n\n/**\n * Filters invalid features and formats data.\n * @privateRemarks Source: @carto/react-core\n */\nexport function scatterPlot({\n data,\n xAxisColumns,\n xAxisJoinOperation,\n yAxisColumns,\n yAxisJoinOperation,\n}: {\n data: FeatureData[];\n xAxisColumns: string[];\n xAxisJoinOperation?: AggregationType;\n yAxisColumns: string[];\n yAxisJoinOperation?: AggregationType;\n}): ScatterPlotFeature {\n return data.reduce(\n (acc, feature) => {\n const xValue = aggregate(\n feature,\n xAxisColumns,\n xAxisJoinOperation\n ) as number;\n\n const xIsValid = xValue !== null && xValue !== undefined;\n\n const yValue = aggregate(\n feature,\n yAxisColumns,\n yAxisJoinOperation\n ) as number;\n\n const yIsValid = yValue !== null && yValue !== undefined;\n\n if (xIsValid && yIsValid) {\n acc.push([xValue, yValue]);\n }\n\n return acc;\n },\n [] as [number, number][]\n );\n}\n","import {\n Feature,\n LineString,\n Position,\n GeoJSON,\n Point,\n Polygon,\n GeometryCollection,\n FeatureCollection,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\n/**\n\n * GeoJSON equality checking utility.\n * Adapted from https://github.com/geosquare/geojson-equality\n *\n * @memberof helpers\n * @type {Class}\n */\nclass GeojsonEquality {\n private precision: number;\n private direction = false;\n private compareProperties = true;\n\n constructor(opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }) {\n this.precision = 10 ** -(opts?.precision ?? 17);\n this.direction = opts?.direction ?? false;\n this.compareProperties = opts?.compareProperties ?? true;\n }\n\n compare(g1: GeoJSON, g2: GeoJSON): boolean {\n if (g1.type !== g2.type) {\n return false;\n }\n\n if (!sameLength(g1, g2)) {\n return false;\n }\n\n switch (g1.type) {\n case \"Point\":\n return this.compareCoord(g1.coordinates, (g2 as Point).coordinates);\n case \"LineString\":\n return this.compareLine(g1.coordinates, (g2 as LineString).coordinates);\n case \"Polygon\":\n return this.comparePolygon(g1, g2 as Polygon);\n case \"GeometryCollection\":\n return this.compareGeometryCollection(g1, g2 as GeometryCollection);\n case \"Feature\":\n return this.compareFeature(g1, g2 as Feature);\n case \"FeatureCollection\":\n return this.compareFeatureCollection(g1, g2 as FeatureCollection);\n default:\n if (g1.type.startsWith(\"Multi\")) {\n const g1s = explode(g1);\n const g2s = explode(\n g2 as MultiLineString | MultiPoint | MultiPolygon\n );\n return g1s.every((g1part) =>\n g2s.some((g2part) => this.compare(g1part as any, g2part as any))\n );\n }\n }\n return false;\n }\n\n private compareCoord(c1: Position, c2: Position) {\n return (\n c1.length === c2.length &&\n c1.every((c, i) => Math.abs(c - c2[i]) < this.precision)\n );\n }\n\n private compareLine(\n path1: Position[],\n path2: Position[],\n ind = 0,\n isPoly = false\n ): boolean {\n if (!sameLength(path1, path2)) {\n return false;\n }\n const p1 = path1;\n let p2 = path2;\n if (isPoly && !this.compareCoord(p1[0], p2[0])) {\n // fix start index of both to same point\n const startIndex = this.fixStartIndex(p2, p1);\n if (!startIndex) {\n return false;\n } else {\n p2 = startIndex;\n }\n }\n // for linestring ind =0 and for polygon ind =1\n const sameDirection = this.compareCoord(p1[ind], p2[ind]);\n if (this.direction || sameDirection) {\n return this.comparePath(p1, p2);\n } else {\n if (this.compareCoord(p1[ind], p2[p2.length - (1 + ind)])) {\n return this.comparePath(p1.slice().reverse(), p2);\n }\n return false;\n }\n }\n\n private fixStartIndex(sourcePath: Position[], targetPath: Position[]) {\n //make sourcePath first point same as of targetPath\n let correctPath,\n ind = -1;\n for (let i = 0; i < sourcePath.length; i++) {\n if (this.compareCoord(sourcePath[i], targetPath[0])) {\n ind = i;\n break;\n }\n }\n if (ind >= 0) {\n correctPath = ([] as Position[]).concat(\n sourcePath.slice(ind, sourcePath.length),\n sourcePath.slice(1, ind + 1)\n );\n }\n return correctPath;\n }\n\n private comparePath(p1: Position[], p2: Position[]) {\n return p1.every((c, i) => this.compareCoord(c, p2[i]));\n }\n\n private comparePolygon(g1: Polygon, g2: Polygon) {\n if (this.compareLine(g1.coordinates[0], g2.coordinates[0], 1, true)) {\n const holes1 = g1.coordinates.slice(1, g1.coordinates.length);\n const holes2 = g2.coordinates.slice(1, g2.coordinates.length);\n return holes1.every((h1) =>\n holes2.some((h2) => this.compareLine(h1, h2, 1, true))\n );\n }\n return false;\n }\n\n private compareGeometryCollection(\n g1: GeometryCollection,\n g2: GeometryCollection\n ) {\n return (\n sameLength(g1.geometries, g2.geometries) &&\n this.compareBBox(g1, g2) &&\n g1.geometries.every((g, i) => this.compare(g, g2.geometries[i]))\n );\n }\n\n private compareFeature(g1: Feature, g2: Feature) {\n return (\n g1.id === g2.id &&\n (this.compareProperties ? equal(g1.properties, g2.properties) : true) &&\n this.compareBBox(g1, g2) &&\n this.compare(g1.geometry, g2.geometry)\n );\n }\n\n private compareFeatureCollection(\n g1: FeatureCollection,\n g2: FeatureCollection\n ) {\n return (\n sameLength(g1.features, g2.features) &&\n this.compareBBox(g1, g2) &&\n g1.features.every((f, i) => this.compare(f, g2.features[i]))\n );\n }\n\n private compareBBox(g1: GeoJSON, g2: GeoJSON): boolean {\n return (\n Boolean(!g1.bbox && !g2.bbox) ||\n (g1.bbox && g2.bbox ? this.compareCoord(g1.bbox, g2.bbox) : false)\n );\n }\n}\n\nfunction sameLength(g1: any, g2: any) {\n return g1.coordinates\n ? g1.coordinates.length === g2.coordinates.length\n : g1.length === g2.length;\n}\n\nfunction explode(g: MultiLineString | MultiPoint | MultiPolygon) {\n return g.coordinates.map((part) => ({\n type: g.type.replace(\"Multi\", \"\"),\n coordinates: part,\n }));\n}\n\nfunction geojsonEquality(\n g1: GeoJSON,\n g2: GeoJSON,\n opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }\n): boolean {\n const eq = new GeojsonEquality(opts);\n\n return eq.compare(g1, g2);\n}\n\n// Adapted from https://medium.com/syncfusion/5-different-ways-to-deep-compare-javascript-objects-6708a0da9f05\nfunction equal(object1: GeoJsonProperties, object2: GeoJsonProperties) {\n if (object1 === null && object2 === null) {\n return true;\n }\n\n if (object1 === null || object2 === null) {\n return false;\n }\n\n const objKeys1 = Object.keys(object1);\n const objKeys2 = Object.keys(object2);\n\n if (objKeys1.length !== objKeys2.length) return false;\n\n for (var key of objKeys1) {\n const value1 = object1[key];\n const value2 = object2[key];\n\n const isObjects = isObject(value1) && isObject(value2);\n\n if (\n (isObjects && !equal(value1, value2)) ||\n (!isObjects && value1 !== value2)\n ) {\n return false;\n }\n }\n return true;\n}\n\nconst isObject = (object: any) => {\n return object != null && typeof object === \"object\";\n};\n\nexport { GeojsonEquality, geojsonEquality };\nexport default GeojsonEquality;\n","import type {\n H3TableSourceOptions,\n QuadbinTableSourceOptions,\n VectorTableSourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerTableSourceOptions =\n | Omit<VectorTableSourceOptions, 'filters'>\n | Omit<H3TableSourceOptions, 'filters'>\n | Omit<QuadbinTableSourceOptions, 'filters'>;\n\nexport type WidgetTableSourceResult = {widgetSource: WidgetTableSource};\n\n/**\n * Source for Widget API requests on a data source defined as a table.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTableSource}, {@link h3TableSource}, or {@link quadbinTableSource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTableSource } from '@carto/api-client';\n *\n * const data = vectorTableSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTableSource extends WidgetRemoteSource<\n LayerTableSourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'table',\n data: this.props.tableName,\n };\n }\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type H3TableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type H3TableSourceResponse = TilejsonResult & WidgetTableSourceResult;\n\nexport const h3TableSource = async function (\n options: H3TableSourceOptions\n): Promise<H3TableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n spatialDataColumn = 'h3',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type H3TilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type H3TilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const h3TilesetSource = async function (\n options: H3TilesetSourceOptions\n): Promise<H3TilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'h3'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'h3',\n }),\n })\n ) as Promise<H3TilesetSourceResponse>;\n};\n","import {TileFormat} from '../constants.js';\nimport type {Tilejson} from '../sources/types.js';\n\nexport function getTileFormat(tilejson: Tilejson): TileFormat {\n const tileParams = new URL(tilejson.tiles[0]).searchParams;\n return tileParams.get('formatTiles') === 'mvt'\n ? TileFormat.MVT\n : TileFormat.BINARY;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetRasterSource,\n type WidgetRasterSourceResult,\n} from '../widget-sources/index.js';\n\nimport type {\n FilterOptions,\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type RasterSourceOptions = SourceOptions &\n TilesetSourceOptions &\n FilterOptions;\ntype UrlParameters = {\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type RasterSourceResponse = TilejsonResult & WidgetRasterSourceResult;\n\nexport const rasterSource = async function (\n options: RasterSourceOptions\n): Promise<RasterSourceResponse> {\n const {tableName, filters} = options;\n const urlParameters: UrlParameters = {name: tableName};\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('raster', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetRasterSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn: 'quadbin',\n spatialDataType: 'quadbin',\n rasterMetadata: result.raster_metadata!,\n }),\n })\n ) as Promise<RasterSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const quadbinQuerySource = async function (\n options: QuadbinQuerySourceOptions\n): Promise<QuadbinQuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n sqlQuery,\n spatialDataColumn = 'quadbin',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n q: sqlQuery,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinTableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const quadbinTableSource = async function (\n options: QuadbinTableSourceOptions\n): Promise<QuadbinTableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n spatialDataColumn = 'quadbin',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type QuadbinTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type QuadbinTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const quadbinTilesetSource = async function (\n options: QuadbinTilesetSourceOptions\n): Promise<QuadbinTilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'quadbin'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'quadbin',\n }),\n })\n ) as Promise<QuadbinTilesetSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n SourceOptions,\n QuerySourceOptions,\n SpatialDataType,\n TilejsonResult,\n ColumnsOption,\n} from './types.js';\n\nexport type VectorQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n aggregationExp?: string;\n};\n\nexport type VectorQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const vectorQuerySource = async function (\n options: VectorQuerySourceOptions\n): Promise<VectorQuerySourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n sqlQuery,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n queryParameters,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n q: sqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n ColumnsOption,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTableSourceOptions = SourceOptions &\n TableSourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n name: string;\n aggregationExp?: string;\n};\n\nexport type VectorTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const vectorTableSource = async function (\n options: VectorTableSourceOptions\n): Promise<VectorTableSourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n tableName,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilesetSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type VectorTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const vectorTilesetSource = async function (\n options: VectorTilesetSourceOptions\n): Promise<VectorTilesetSourceResponse> {\n const {tableName, spatialDataColumn = DEFAULT_GEO_COLUMN} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'geo',\n }),\n })\n ) as Promise<VectorTilesetSourceResponse>;\n};\n","import {DEFAULT_API_BASE_URL} from '../constants.js';\n\nimport {\n type APIErrorContext,\n CartoAPIError,\n buildPublicMapUrl,\n buildStatsUrl,\n requestWithParameters,\n} from '../api/index.js';\n\nimport {type ParseMapResult, parseMap} from './parse-map.js';\nimport {assert} from '../utils.js';\nimport type {Basemap, Dataset, KeplerMapConfig} from './types.js';\nimport {fetchBasemapProps} from './basemap.js';\nimport {configureSource} from './source.js';\nimport type {Filters} from '../types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\n\n/* global clearInterval, setInterval, URL */\nasync function _fetchMapDataset(\n dataset: Dataset,\n filters: Filters,\n context: _FetchMapContext\n) {\n const {connectionName} = dataset;\n const cache: {value?: number} = {};\n const configuredSource = configureSource({\n dataset,\n filters: isRemoteCalculationSupported(dataset) ? filters : undefined,\n options: {\n ...context,\n connection: connectionName,\n headers: context.headers,\n accessToken: context.accessToken!,\n apiBaseUrl: context.apiBaseUrl,\n maxLengthURL: context.maxLengthURL,\n },\n });\n dataset.data = await configuredSource;\n\n let cacheChanged = true;\n if (cache.value) {\n cacheChanged = dataset.cache !== cache.value;\n dataset.cache = cache.value;\n }\n\n return cacheChanged;\n}\n\nasync function _fetchTilestats(\n attribute: string,\n dataset: Dataset,\n context: _FetchMapContext\n) {\n const {connectionName, data, id, source, type, queryParameters} = dataset;\n const {apiBaseUrl} = context;\n const errorContext: APIErrorContext = {\n requestType: 'Tile stats',\n connection: connectionName,\n type,\n source,\n };\n if (!('tilestats' in data)) {\n throw new CartoAPIError(\n new Error(`Invalid dataset for tilestats: ${id}`),\n errorContext\n );\n }\n\n const baseUrl = buildStatsUrl({attribute, apiBaseUrl, ...dataset});\n const client = new URLSearchParams(data.tiles[0]).get('client');\n const headers = {Authorization: `Bearer ${context.accessToken}`};\n const parameters: Record<string, string> = {};\n if (client) {\n parameters.client = client;\n }\n if (type === 'query') {\n parameters.q = source;\n if (queryParameters) {\n parameters.queryParameters = JSON.stringify(queryParameters);\n }\n }\n const stats = await requestWithParameters({\n baseUrl,\n headers,\n parameters,\n errorContext,\n maxLengthURL: context.maxLengthURL,\n });\n\n // Replace tilestats for attribute with value from API\n const {attributes} = data.tilestats.layers[0];\n const index = attributes.findIndex((d) => d.attribute === attribute);\n attributes[index] = stats;\n return true;\n}\n\nasync function fillInMapDatasets(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const {filters} = keplerMapConfig.config as KeplerMapConfig;\n const promises = datasets.map((dataset) =>\n _fetchMapDataset(dataset, filters[dataset.id], context)\n );\n return await Promise.all(promises);\n}\n\nasync function fillInTileStats(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const attributes: {attribute: string; dataset: any}[] = [];\n const {layers} = keplerMapConfig.config.visState;\n for (const layer of layers) {\n for (const channel of Object.keys(layer.visualChannels)) {\n const attribute = layer.visualChannels[channel]?.name;\n if (attribute) {\n const dataset = datasets.find((d) => d.id === layer.config.dataId);\n if (dataset && dataset.type !== 'tileset' && dataset.data.tilestats) {\n // Only fetch stats for QUERY & TABLE map types\n attributes.push({attribute, dataset});\n }\n }\n }\n }\n // Remove duplicates to avoid repeated requests\n const filteredAttributes: {attribute: string; dataset: any}[] = [];\n for (const a of attributes) {\n if (\n !filteredAttributes.find(\n ({attribute, dataset}) =>\n attribute === a.attribute && dataset === a.dataset\n )\n ) {\n filteredAttributes.push(a);\n }\n }\n\n const promises = filteredAttributes.map(({attribute, dataset}) =>\n _fetchTilestats(attribute, dataset, context)\n );\n return await Promise.all(promises);\n}\n\nexport type FetchMapOptions = {\n /**\n * CARTO platform access token. Only required for private maps.\n */\n accessToken?: string;\n\n /**\n * Base URL of the CARTO Maps API.\n *\n * Example for account located in EU-west region: `https://gcp-eu-west1.api.carto.com`\n *\n * @default https://gcp-us-east1.api.carto.com\n */\n apiBaseUrl?: string;\n\n /**\n * Identifier of map created in CARTO Builder.\n */\n cartoMapId: string;\n clientId?: string;\n\n /**\n * Custom HTTP headers added to map instantiation and data requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Interval in seconds at which to autoRefresh the data. If provided, `onNewData` must also be provided.\n */\n autoRefresh?: number;\n\n /**\n * Callback function that will be invoked whenever data in layers is changed. If provided, `autoRefresh` must also be provided.\n */\n onNewData?: (map: any) => void;\n\n /**\n * Maximum URL character length. Above this limit, requests use POST.\n * Used to avoid browser and CDN limits.\n * @default {@link DEFAULT_MAX_LENGTH_URL}\n */\n maxLengthURL?: number;\n};\n\n/**\n * Context reused while fetching and updating a map with fetchMap().\n */\ntype _FetchMapContext = {apiBaseUrl: string} & Pick<\n FetchMapOptions,\n 'accessToken' | 'clientId' | 'headers' | 'maxLengthURL'\n>;\n\nexport type FetchMapResult = ParseMapResult & {\n /**\n * Basemap properties.\n */\n basemap: Basemap | null;\n stopAutoRefresh?: () => void;\n};\n\nexport async function fetchMap({\n accessToken,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n cartoMapId,\n clientId,\n headers,\n autoRefresh,\n onNewData,\n maxLengthURL,\n}: FetchMapOptions): Promise<FetchMapResult> {\n assert(\n cartoMapId,\n 'Must define CARTO map id: fetchMap({cartoMapId: \"XXXX-XXXX-XXXX\"})'\n );\n\n if (accessToken) {\n headers = {Authorization: `Bearer ${accessToken}`, ...headers};\n }\n\n if (autoRefresh || onNewData) {\n assert(onNewData, 'Must define `onNewData` when using autoRefresh');\n assert(typeof onNewData === 'function', '`onNewData` must be a function');\n assert(\n typeof autoRefresh === 'number' && autoRefresh > 0,\n '`autoRefresh` must be a positive number'\n );\n }\n\n const baseUrl = buildPublicMapUrl({apiBaseUrl, cartoMapId});\n const errorContext: APIErrorContext = {\n requestType: 'Public map',\n mapId: cartoMapId,\n };\n const map = await requestWithParameters({\n baseUrl,\n headers,\n errorContext,\n maxLengthURL,\n });\n const context: _FetchMapContext = {\n accessToken: map.token || accessToken,\n apiBaseUrl,\n clientId,\n headers,\n maxLengthURL,\n };\n\n // Periodically check if the data has changed. Note that this\n // will not update when a map is published.\n let stopAutoRefresh: (() => void) | undefined;\n if (autoRefresh) {\n const intervalId = setInterval(async () => {\n const changed = await fillInMapDatasets(map, {\n ...context,\n headers: {\n ...headers,\n 'If-Modified-Since': new Date().toUTCString(),\n },\n });\n if (onNewData && changed.some((v) => v === true)) {\n onNewData(parseMap(map));\n }\n }, autoRefresh * 1000);\n stopAutoRefresh = () => {\n clearInterval(intervalId);\n };\n }\n\n const geojsonLayers = map.keplerMapConfig.config.visState.layers.filter(\n ({type}: {type: string}) => type === 'geojson' || type === 'point'\n );\n const geojsonDatasetIds = geojsonLayers.map(\n ({config}: {config: any}) => config.dataId\n );\n map.datasets.forEach((dataset: any) => {\n if (geojsonDatasetIds.includes(dataset.id)) {\n const {config} = geojsonLayers.find(\n ({config}: {config: any}) => config.dataId === dataset.id\n );\n dataset.format = 'geojson';\n // Support for very old maps. geoColumn was not stored in the past\n if (!dataset.geoColumn && config.columns.geojson) {\n dataset.geoColumn = config.columns.geojson;\n }\n }\n });\n\n const [basemap] = await Promise.all([\n fetchBasemapProps({config: map.keplerMapConfig.config, errorContext}),\n\n // Mutates map.datasets so that dataset.data contains data\n fillInMapDatasets(map, context),\n ]);\n\n // Mutates attributes in visualChannels to contain tile stats\n await fillInTileStats(map, context);\n\n const out = {...parseMap(map), basemap, ...{stopAutoRefresh}};\n\n const textLayers = out.layers.filter((layer: any) => {\n const pointType = layer.props?.pointType || '';\n return pointType.includes('text');\n });\n\n /* global FontFace, window, document */\n if (\n textLayers.length &&\n window.FontFace &&\n !document.fonts.check('12px Inter')\n ) {\n // Fetch font needed for labels\n const font = new FontFace(\n 'Inter',\n 'url(https://fonts.gstatic.com/s/inter/v12/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2)'\n );\n await font.load().then((f) => document.fonts.add(f));\n }\n\n return out as FetchMapResult;\n}\n","import type {ColorParameters} from '@luma.gl/core';\nimport {\n calculateClusterRadius,\n calculateClusterTextFontSize,\n getDefaultAggregationExpColumnAliasForLayerType,\n getLayerProps,\n getColorAccessor,\n getSizeAccessor,\n getTextAccessor,\n opacityToAlpha,\n getIconUrlAccessor,\n negateAccessor,\n getMaxMarkerSize,\n type LayerType,\n OPACITY_MAP,\n TEXT_NUMBER_FORMATTER,\n TEXT_LABEL_INDEX,\n TEXT_OUTLINE_OPACITY,\n type D3Scale,\n type ScaleType,\n} from './layer-map.js';\n\nimport {assert, isEmptyObject} from '../utils.js';\nimport type {Filters} from '../types.js';\nimport type {\n KeplerMapConfig,\n MapLayerConfig,\n VisualChannels,\n VisConfig,\n MapConfigLayer,\n Dataset,\n VisualChannelField,\n} from './types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\n\nexport type Scale = {\n field: VisualChannelField;\n domain: string[] | number[];\n range: string[] | number[];\n type: ScaleType;\n};\n\nexport type LayerDescriptor = {\n type: LayerType;\n props: Record<string, any>;\n filters?: Filters;\n scales: Record<ScaleKey, Scale>;\n};\n\nexport type ParseMapResult = {\n /** Map id. */\n id: string;\n\n /** Title of map. */\n title: string;\n\n /** Description of map. */\n description?: string;\n createdAt: string;\n updatedAt: string;\n initialViewState: any;\n\n /** @deprecated Use `basemap`. */\n mapStyle: any;\n popupSettings: any;\n token: string;\n\n layers: LayerDescriptor[];\n};\n\nexport function parseMap(json: any) {\n const {keplerMapConfig, datasets, token} = json;\n assert(keplerMapConfig.version === 'v1', 'Only support Kepler v1');\n const config = keplerMapConfig.config as KeplerMapConfig;\n const {filters, mapState, mapStyle, popupSettings, legendSettings} = config;\n const {layers, layerBlending, interactionConfig} = config.visState;\n\n return {\n id: json.id,\n title: json.title,\n description: json.description,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n initialViewState: mapState,\n /** @deprecated Use `basemap`. */\n mapStyle,\n popupSettings,\n legendSettings,\n token,\n layers: layers\n .reverse()\n .map(({id, type, config, visualChannels}: MapConfigLayer) => {\n try {\n const {dataId} = config;\n const dataset: Dataset | null = datasets.find(\n (d: any) => d.id === dataId\n );\n assert(dataset, `No dataset matching dataId: ${dataId}`);\n const {data} = dataset;\n assert(data, `No data loaded for dataId: ${dataId}`);\n\n const {propMap, defaultProps} = getLayerProps(type, config, dataset);\n\n const styleProps = createStyleProps(config, propMap);\n\n const {channelProps, scales} = createChannelProps(\n id,\n type,\n config,\n visualChannels,\n data,\n dataset\n );\n const layer: LayerDescriptor = {\n type,\n filters:\n isEmptyObject(filters) || isRemoteCalculationSupported(dataset)\n ? undefined\n : filters[dataId],\n props: {\n id,\n data,\n ...defaultProps,\n ...createInteractionProps(interactionConfig),\n ...styleProps,\n ...channelProps,\n ...createParametersProp(\n layerBlending,\n styleProps.parameters || {}\n ), // Must come after style\n ...createLoadOptions(token),\n },\n scales,\n };\n return layer;\n } catch (e: any) {\n console.error(e.message);\n return undefined;\n }\n }),\n };\n}\n\nfunction createParametersProp(\n layerBlending: string,\n parameters: ColorParameters\n) {\n if (layerBlending === 'additive') {\n parameters.blendColorSrcFactor = parameters.blendAlphaSrcFactor =\n 'src-alpha';\n parameters.blendColorDstFactor = parameters.blendAlphaDstFactor =\n 'dst-alpha';\n parameters.blendColorOperation = parameters.blendAlphaOperation = 'add';\n } else if (layerBlending === 'subtractive') {\n parameters.blendColorSrcFactor = 'one';\n parameters.blendColorDstFactor = 'one-minus-dst-color';\n parameters.blendAlphaSrcFactor = 'src-alpha';\n parameters.blendAlphaDstFactor = 'dst-alpha';\n parameters.blendColorOperation = 'subtract';\n parameters.blendAlphaOperation = 'add';\n }\n\n return Object.keys(parameters).length ? {parameters} : {};\n}\n\nfunction createInteractionProps(interactionConfig: any) {\n const pickable = interactionConfig && interactionConfig.tooltip.enabled;\n return {\n autoHighlight: pickable,\n pickable,\n };\n}\n\nfunction mapProps(source: any, target: any, mapping: any) {\n for (const sourceKey in mapping) {\n const sourceValue = source[sourceKey];\n const targetKey = mapping[sourceKey];\n if (sourceValue === undefined) {\n continue;\n }\n if (typeof targetKey === 'string') {\n target[targetKey] = sourceValue;\n } else if (typeof targetKey === 'function') {\n const [key, value] = Object.entries(targetKey(sourceValue))[0];\n target[key] = value;\n } else if (typeof targetKey === 'object') {\n // Nested definition, recurse down one level (also handles arrays)\n mapProps(sourceValue, target, targetKey);\n }\n }\n}\n\nfunction createStyleProps(config: MapLayerConfig, mapping: any) {\n const result: Record<string, any> = {};\n mapProps(config, result, mapping);\n\n // Kepler format sometimes omits strokeColor. TODO: remove once we can rely on\n // `strokeColor` always being set when `stroke: true`.\n if (result.stroked && !result.getLineColor) {\n result.getLineColor = result.getFillColor;\n }\n\n for (const colorAccessor in OPACITY_MAP) {\n if (Array.isArray(result[colorAccessor])) {\n const color = [...result[colorAccessor]];\n const opacityKey = OPACITY_MAP[colorAccessor];\n const opacity = config.visConfig[opacityKey as keyof VisConfig];\n color[3] = opacityToAlpha(opacity);\n result[colorAccessor] = color;\n }\n }\n\n result.highlightColor = config.visConfig.enable3d\n ? [255, 255, 255, 60]\n : [252, 242, 26, 255];\n return result;\n}\n\nfunction domainAndRangeFromScale(\n scale: D3Scale\n): Pick<Scale, 'domain' | 'range'> {\n return {\n domain: scale.domain(),\n range: scale.range(),\n };\n}\n\nexport type ScaleKey =\n | 'fillColor'\n | 'pointRadius'\n | 'lineColor'\n | 'elevation'\n | 'weight';\n\nfunction createChannelProps(\n id: string,\n layerType: LayerType,\n config: MapLayerConfig,\n visualChannels: VisualChannels,\n data: any,\n dataset: Dataset\n): {channelProps: Record<string, any>; scales: Record<ScaleKey, Scale>} {\n const {\n colorField,\n colorScale,\n radiusField,\n radiusScale,\n strokeColorField,\n strokeColorScale,\n weightField,\n } = visualChannels;\n const {heightField, heightScale} = visualChannels;\n const {textLabel, visConfig} = config;\n const result: Record<string, any> = {};\n\n const scales: Record<string, Scale> = {};\n\n if (colorField) {\n const {colorAggregation: aggregation, colorRange: range} = visConfig;\n const {accessor, scale} = getColorAccessor(\n colorField,\n colorScale!,\n {aggregation, range},\n visConfig.opacity,\n data\n );\n result.getFillColor = accessor;\n scales.fillColor = {\n field: colorField,\n type: colorScale!,\n ...domainAndRangeFromScale(scale),\n };\n } else if (visConfig.filled) {\n scales.fillColor = {} as any;\n }\n\n if (layerType === 'clusterTile') {\n const aggregationExpAlias = getDefaultAggregationExpColumnAliasForLayerType(\n layerType,\n dataset.providerId,\n data.schema\n );\n\n result.pointType = visConfig.isTextVisible ? 'circle+text' : 'circle';\n result.clusterLevel = visConfig.clusterLevel;\n\n result.getWeight = (d: any) => {\n return d.properties[aggregationExpAlias];\n };\n\n result.getPointRadius = (d: any, info: any) => {\n return calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n };\n\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n\n result.getText = (d: any) =>\n TEXT_NUMBER_FORMATTER.format(d.properties[aggregationExpAlias]);\n\n result.getTextColor = config.textLabel[TEXT_LABEL_INDEX].color;\n result.textOutlineColor = [\n ...(config.textLabel[TEXT_LABEL_INDEX].outlineColor as number[]),\n TEXT_OUTLINE_OPACITY,\n ];\n result.textOutlineWidth = 5;\n result.textSizeUnits = 'pixels';\n\n result.getTextSize = (d: any, info: any) => {\n const radius = calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n return calculateClusterTextFontSize(radius);\n };\n }\n\n if (radiusField) {\n const {accessor, scale} = getSizeAccessor(\n radiusField,\n radiusScale,\n visConfig.sizeAggregation,\n visConfig.radiusRange || visConfig.sizeRange,\n data\n );\n result.getPointRadius = accessor;\n scales.pointRadius = {\n field: radiusField,\n type: radiusScale || 'identity',\n ...domainAndRangeFromScale(scale),\n };\n }\n\n if (strokeColorField) {\n const opacity =\n visConfig.strokeOpacity !== undefined ? visConfig.strokeOpacity : 1;\n const {strokeColorAggregation: aggregation, strokeColorRange: range} =\n visConfig;\n const {accessor, scale} = getColorAccessor(\n strokeColorField,\n strokeColorScale!,\n {aggregation, range},\n opacity,\n data\n );\n result.getLineColor = accessor;\n scales.lineColor = {\n field: strokeColorField,\n type: strokeColorScale!,\n ...domainAndRangeFromScale(scale),\n };\n }\n if (heightField && visConfig.enable3d) {\n const {accessor, scale} = getSizeAccessor(\n heightField,\n heightScale,\n visConfig.heightAggregation,\n visConfig.heightRange || visConfig.sizeRange,\n data\n );\n result.getElevation = accessor;\n scales.elevation = {\n field: heightField,\n type: heightScale || 'identity',\n ...domainAndRangeFromScale(scale),\n };\n }\n\n if (weightField) {\n const {accessor, scale} = getSizeAccessor(\n weightField,\n undefined,\n visConfig.weightAggregation,\n undefined,\n data\n );\n result.getWeight = accessor;\n scales.weight = {\n field: weightField,\n type: 'identity',\n ...domainAndRangeFromScale(scale),\n };\n }\n\n if (visConfig.customMarkers) {\n const maxIconSize = getMaxMarkerSize(visConfig, visualChannels);\n const {getPointRadius, getFillColor} = result;\n const {\n customMarkersUrl,\n customMarkersRange,\n filled: useMaskedIcons,\n } = visConfig;\n\n result.pointType = 'icon';\n result.getIcon = getIconUrlAccessor(\n visualChannels.customMarkersField,\n customMarkersRange,\n {fallbackUrl: customMarkersUrl, maxIconSize, useMaskedIcons},\n data\n );\n result._subLayerProps = {\n 'points-icon': {\n loadOptions: {\n image: {\n type: 'imagebitmap',\n },\n imagebitmap: {\n resizeWidth: maxIconSize,\n resizeHeight: maxIconSize,\n resizeQuality: 'high',\n },\n },\n },\n };\n\n if (getFillColor && useMaskedIcons) {\n result.getIconColor = getFillColor;\n }\n\n if (getPointRadius) {\n result.getIconSize = getPointRadius;\n }\n\n if (visualChannels.rotationField) {\n const {accessor} = getSizeAccessor(\n visualChannels.rotationField,\n undefined,\n null,\n undefined,\n data\n );\n result.getIconAngle = negateAccessor(accessor);\n }\n } else if (layerType === 'tileset') {\n result.pointType = 'circle';\n }\n\n if (textLabel && textLabel.length && textLabel[0].field) {\n const [mainLabel, secondaryLabel] = textLabel;\n const collisionGroup = id;\n\n ({\n alignment: result.getTextAlignmentBaseline,\n anchor: result.getTextAnchor,\n color: result.getTextColor,\n outlineColor: result.textOutlineColor,\n size: result.textSizeScale,\n } = mainLabel);\n const {\n color: getSecondaryColor,\n field: secondaryField,\n outlineColor: secondaryOutlineColor,\n size: secondarySizeScale,\n } = secondaryLabel || {};\n\n result.getText = mainLabel.field && getTextAccessor(mainLabel.field, data);\n const getSecondaryText =\n secondaryField && getTextAccessor(secondaryField, data);\n\n result.pointType = `${result.pointType}+text`;\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n result.textOutlineWidth = 3;\n\n result._subLayerProps = {\n ...result._subLayerProps,\n 'points-text': {\n collisionEnabled: true,\n collisionGroup,\n\n // getPointRadius already has radiusScale baked in, so only pass one or the other\n ...(result.getPointRadius\n ? {getRadius: result.getPointRadius}\n : {radiusScale: visConfig.radius}),\n\n ...(secondaryField && {\n getSecondaryText,\n getSecondaryColor,\n secondarySizeScale,\n secondaryOutlineColor,\n }),\n },\n };\n }\n\n return {channelProps: result, scales};\n}\n\nfunction createLoadOptions(accessToken: string) {\n return {\n loadOptions: {fetch: {headers: {Authorization: `Bearer ${accessToken}`}}},\n };\n}\n","import {extent, groupSort} from 'd3-array';\nimport {rgb} from 'd3-color';\nimport {\n scaleLinear,\n scaleOrdinal,\n scaleLog,\n scalePoint,\n scaleQuantile,\n scaleQuantize,\n scaleSqrt,\n scaleThreshold,\n} from 'd3-scale';\nimport {format as d3Format} from 'd3-format';\n\nexport type LayerType =\n | 'clusterTile'\n | 'h3'\n | 'heatmapTile'\n | 'mvt'\n | 'quadbin'\n | 'raster'\n | 'tileset';\n\nimport {\n createBinaryProxy,\n formatDate,\n formatTimestamp,\n scaleIdentity,\n} from './utils.js';\nimport type {\n CustomMarkersRange,\n Dataset,\n MapLayerConfig,\n VisConfig,\n VisualChannelField,\n VisualChannels,\n} from './types.js';\nimport type {ProviderType, SchemaField} from '../types.js';\nimport {DEFAULT_AGGREGATION_EXP_ALIAS} from '../constants-internal.js';\nimport {AggregationTypes} from '../constants.js';\n\nexport type D3Scale = {\n domain: (d?: any) => any[];\n range: (d?: any) => any[];\n unknown?: (d?: string) => any;\n} & ((d: any) => any);\ntype D3ScaleFactory = () => D3Scale;\n\nexport type ScaleType =\n | 'linear'\n | 'ordinal'\n | 'log'\n | 'point'\n | 'quantile'\n | 'quantize'\n | 'sqrt'\n | 'custom'\n | 'identity';\nconst SCALE_FUNCS: Record<ScaleType, D3ScaleFactory> = {\n linear: scaleLinear,\n ordinal: scaleOrdinal,\n log: scaleLog,\n point: scalePoint,\n quantile: scaleQuantile,\n quantize: scaleQuantize,\n sqrt: scaleSqrt,\n custom: scaleThreshold,\n identity: scaleIdentity,\n};\n\nfunction identity<T>(v: T): T {\n return v;\n}\n\nconst UNKNOWN_COLOR = '#868d91';\n\nexport const OPACITY_MAP: Record<string, string> = {\n getFillColor: 'opacity',\n getLineColor: 'strokeOpacity',\n getTextColor: 'opacity',\n};\n\nconst hexToRGBA = (c: any) => {\n const {r, g, b, opacity} = rgb(c);\n return [r, g, b, 255 * opacity];\n};\n\n// Kepler prop value -> Deck.gl prop value\n// Supports nested definitions, and function transforms:\n// {keplerProp: 'deckProp'} is equivalent to:\n// {keplerProp: x => ({deckProp: x})}\nconst sharedPropMap = {\n // Apply the value of Kepler `color` prop to the deck `getFillColor` prop\n color: 'getFillColor',\n isVisible: 'visible',\n label: 'cartoLabel',\n textLabel: {\n alignment: 'getTextAlignmentBaseline',\n anchor: 'getTextAnchor',\n // Apply the value of Kepler `textLabel.color` prop to the deck `getTextColor` prop\n color: 'getTextColor',\n size: 'getTextSize',\n },\n visConfig: {\n enable3d: 'extruded',\n elevationScale: 'elevationScale',\n filled: 'filled',\n strokeColor: 'getLineColor',\n stroked: 'stroked',\n thickness: 'getLineWidth',\n radius: 'getPointRadius',\n wireframe: 'wireframe',\n },\n};\n\nconst customMarkersPropsMap = {\n color: 'getIconColor',\n visConfig: {\n radius: 'getIconSize',\n },\n};\n\nconst heatmapTilePropsMap = {\n visConfig: {\n colorRange: (x: any) => ({colorRange: x.colors.map(hexToRGBA)}),\n radius: (radius: number) => ({radiusPixels: 20 + radius}),\n opacity: 'opacity',\n },\n};\n\nconst defaultProps = {\n lineMiterLimit: 2,\n lineWidthUnits: 'pixels',\n pointRadiusUnits: 'pixels',\n rounded: true,\n wrapLongitude: false,\n};\n\nfunction mergePropMaps(\n a: Record<string, any> = {},\n b: Record<string, any> = {}\n) {\n return {...a, ...b, visConfig: {...a.visConfig, ...b.visConfig}};\n}\n\nconst deprecatedLayerTypes = [\n 'geojson',\n 'grid',\n 'heatmap',\n 'hexagon',\n 'hexagonId',\n 'point',\n];\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_LABEL_INDEX = 0;\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_OUTLINE_OPACITY = 64;\n\nexport const TEXT_NUMBER_FORMATTER = new Intl.NumberFormat('en-US', {\n maximumFractionDigits: 2,\n notation: 'compact',\n});\n\nexport function getLayerProps(\n type: LayerType,\n config: MapLayerConfig,\n dataset: Dataset\n): {propMap: any; defaultProps: any} {\n if (deprecatedLayerTypes.includes(type)) {\n throw new Error(\n `Outdated layer type: ${type}. Please open map in CARTO Builder to automatically migrate.`\n );\n }\n\n let basePropMap: any = sharedPropMap;\n if (config.visConfig?.customMarkers) {\n basePropMap = mergePropMaps(basePropMap, customMarkersPropsMap);\n }\n if (type === 'heatmapTile') {\n basePropMap = mergePropMaps(basePropMap, heatmapTilePropsMap);\n }\n const {aggregationExp, aggregationResLevel} = dataset;\n\n return {\n propMap: basePropMap,\n defaultProps: {\n ...defaultProps,\n ...(aggregationExp && {aggregationExp}),\n ...(aggregationResLevel && {aggregationResLevel}),\n uniqueIdProperty: 'geoid',\n },\n };\n}\n\nfunction domainFromAttribute(\n attribute: any,\n scaleType: ScaleType,\n scaleLength: number\n) {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n return attribute.categories\n .map((c: any) => c.category)\n .filter((c: any) => c !== undefined && c !== null);\n }\n\n if (scaleType === 'quantile' && attribute.quantiles) {\n return attribute.quantiles.global\n ? attribute.quantiles.global[scaleLength]\n : attribute.quantiles[scaleLength];\n }\n\n let {min} = attribute;\n if (scaleType === 'log' && min === 0) {\n min = 1e-5;\n }\n return [min, attribute.max];\n}\n\nfunction domainFromValues(values: any, scaleType: ScaleType) {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n return groupSort(\n values,\n (g) => -g.length,\n (d) => d\n );\n } else if (scaleType === 'quantile') {\n return values.sort((a: any, b: any) => a - b);\n } else if (scaleType === 'log') {\n const [d0, d1] = extent(values as number[]);\n return [d0 === 0 ? 1e-5 : d0, d1];\n }\n return extent(values);\n}\n\nfunction calculateDomain(\n data: any,\n name: any,\n scaleType: ScaleType,\n scaleLength?: number\n) {\n if (data.tilestats) {\n // Tileset data type\n const {attributes} = data.tilestats.layers[0];\n const attribute = attributes.find((a: any) => a.attribute === name);\n return domainFromAttribute(attribute, scaleType, scaleLength as number);\n }\n\n return [0, 1];\n}\n\nfunction normalizeAccessor(accessor: any, data: any) {\n if (data.features || data.tilestats) {\n return (object: any, info: any) => {\n if (object) {\n return accessor(object.properties || object.__source.object.properties);\n }\n\n const {data, index} = info;\n const proxy = createBinaryProxy(data, index);\n return accessor(proxy);\n };\n }\n return accessor;\n}\n\nexport function opacityToAlpha(opacity?: number) {\n return opacity !== undefined\n ? Math.round(255 * Math.pow(opacity, 1 / 2.2))\n : 255;\n}\n\nfunction getAccessorKeys(name: string, aggregation?: string | null): string[] {\n let keys = [name];\n if (aggregation) {\n // Snowflake will capitalized the keys, need to check lower and upper case version\n keys = keys.concat(\n [aggregation, aggregation.toUpperCase()].map((a) => `${name}_${a}`)\n );\n }\n return keys;\n}\n\nfunction findAccessorKey(keys: string[], properties: any): string[] {\n for (const key of keys) {\n if (key in properties) {\n return [key];\n }\n }\n\n // If data doesn't contain any valid keys, return all keys to run search\n // on next feature\n return keys;\n}\n\nexport function getColorAccessor(\n {name, colorColumn}: VisualChannelField,\n scaleType: ScaleType,\n {aggregation, range}: {aggregation: string; range: any},\n opacity: number | undefined,\n data: any\n): {accessor: any; scale: any} {\n const scale = calculateLayerScale(\n colorColumn || name,\n scaleType,\n range,\n data\n );\n const alpha = opacityToAlpha(opacity);\n\n let accessorKeys = getAccessorKeys(name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n const {r, g, b} = rgb(scale(propertyValue));\n return [r, g, b, propertyValue === null ? 0 : alpha];\n };\n return {accessor: normalizeAccessor(accessor, data), scale};\n}\n\nfunction calculateLayerScale(\n name: any,\n scaleType: ScaleType,\n range: any,\n data: any\n) {\n const scale = SCALE_FUNCS[scaleType]();\n let domain: (string | number)[] = [];\n let scaleColor: string[] = [];\n\n if (scaleType !== 'identity') {\n const {colorMap, colors} = range;\n\n if (Array.isArray(colorMap)) {\n colorMap.forEach(([value, color]) => {\n domain.push(value);\n scaleColor.push(color);\n });\n } else {\n domain = calculateDomain(data, name, scaleType, colors.length);\n scaleColor = colors;\n }\n\n if (scaleType === 'ordinal') {\n domain = domain.slice(0, scaleColor.length);\n }\n }\n\n scale.domain(domain);\n scale.range(scaleColor);\n scale.unknown!(UNKNOWN_COLOR);\n\n return scale;\n}\n\nconst FALLBACK_ICON =\n 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';\n\nexport function getIconUrlAccessor(\n field: VisualChannelField | null | undefined,\n range: CustomMarkersRange | null | undefined,\n {\n fallbackUrl,\n maxIconSize,\n useMaskedIcons,\n }: {\n fallbackUrl?: string | null;\n maxIconSize: number;\n useMaskedIcons?: boolean;\n },\n data: any\n) {\n const urlToUnpackedIcon = (url: string) => ({\n id: `${url}@@${maxIconSize}`,\n url,\n width: maxIconSize,\n height: maxIconSize,\n mask: useMaskedIcons,\n });\n let unknownValue = fallbackUrl || FALLBACK_ICON;\n\n if (range?.othersMarker) {\n unknownValue = range.othersMarker;\n }\n\n const unknownIcon = urlToUnpackedIcon(unknownValue);\n if (!range || !field) {\n return () => unknownIcon;\n }\n\n const mapping: Record<string, any> = {};\n for (const {value, markerUrl} of range.markerMap) {\n if (markerUrl) {\n mapping[value] = urlToUnpackedIcon(markerUrl);\n }\n }\n\n const accessor = (properties: any) => {\n const propertyValue = properties[field.name];\n return mapping[propertyValue] || unknownIcon;\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport function getMaxMarkerSize(\n visConfig: VisConfig,\n visualChannels: VisualChannels\n): number {\n const {radiusRange, radius} = visConfig;\n const {radiusField, sizeField} = visualChannels;\n const field = radiusField || sizeField;\n return Math.ceil(radiusRange && field ? radiusRange[1] : radius);\n}\n\ntype Accessor = number | ((d: any, i: any) => number);\nexport function negateAccessor(accessor: Accessor): Accessor {\n if (typeof accessor === 'function') {\n return (d: any, i: any) => -accessor(d, i);\n }\n return -accessor;\n}\n\nexport function getSizeAccessor(\n {name}: VisualChannelField,\n scaleType: ScaleType | undefined,\n aggregation: string | null | undefined,\n range: Iterable<Range> | null | undefined,\n data: any\n): {accessor: any; scale: any} {\n const scale = scaleType ? SCALE_FUNCS[scaleType]() : identity;\n if (scaleType) {\n if (aggregation !== AggregationTypes.Count) {\n (scale as D3Scale).domain(calculateDomain(data, name, scaleType));\n }\n (scale as D3Scale).range(range);\n }\n\n let accessorKeys = getAccessorKeys(name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n return scale(propertyValue);\n };\n return {accessor: normalizeAccessor(accessor, data), scale};\n}\n\nconst FORMATS: Record<string, (value: any) => string> = {\n date: formatDate,\n integer: d3Format('i'),\n float: d3Format('.5f'),\n timestamp: formatTimestamp,\n default: String,\n};\n\nexport function getTextAccessor({name, type}: VisualChannelField, data: any) {\n const format = FORMATS[type] || FORMATS.default;\n const accessor = (properties: any) => {\n return format(properties[name]);\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport {domainFromValues as _domainFromValues};\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterRadius(\n properties: {[column: string]: number},\n stats: Record<string, {min: number; max: number}>,\n radiusRange: [number, number],\n column: string\n): number {\n const {min, max} = stats[column];\n const value = properties[column];\n\n // When there's a single cluster on the screen, min and max are equivalent, so we should return the maximum radius\n if (min === max) return radiusRange[1];\n\n const normalizedValue = (value - min) / (max - min);\n return radiusRange[0] + normalizedValue * (radiusRange[1] - radiusRange[0]);\n}\n\n/** @privateRemarks Source: Builder */\nexport function getDefaultAggregationExpColumnAliasForLayerType(\n layerType: LayerType,\n provider: ProviderType,\n schema: SchemaField[]\n): string {\n if (schema && layerType === 'clusterTile') {\n return getColumnAliasForAggregationExp(\n getDefaultColumnFromSchemaForAggregationExp(schema),\n 'count',\n provider\n );\n } else {\n return DEFAULT_AGGREGATION_EXP_ALIAS;\n }\n}\n\n/** @privateRemarks Source: Builder */\nfunction getColumnAliasForAggregationExp(\n name: string,\n aggregation: string,\n provider: ProviderType\n) {\n const columnAlias = `${name}_${aggregation}`;\n return provider === 'snowflake' ? columnAlias.toUpperCase() : columnAlias;\n}\n\n/** @privateRemarks Source: Builder */\nfunction getDefaultColumnFromSchemaForAggregationExp(\n schema: SchemaField[]\n): string {\n return schema ? schema[0].name : '';\n}\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterTextFontSize(radius: number): number {\n if (radius >= 80) return 24;\n if (radius >= 72) return 24;\n if (radius >= 56) return 20;\n if (radius >= 40) return 16;\n if (radius >= 24) return 13;\n if (radius >= 8) return 11;\n return 11;\n}\n","export {default as bisect, bisectRight, bisectLeft, bisectCenter} from \"./bisect.js\";\nexport {default as ascending} from \"./ascending.js\";\nexport {default as bisector} from \"./bisector.js\";\nexport {blur, blur2, blurImage} from \"./blur.js\";\nexport {default as count} from \"./count.js\";\nexport {default as cross} from \"./cross.js\";\nexport {default as cumsum} from \"./cumsum.js\";\nexport {default as descending} from \"./descending.js\";\nexport {default as deviation} from \"./deviation.js\";\nexport {default as extent} from \"./extent.js\";\nexport {Adder, fsum, fcumsum} from \"./fsum.js\";\nexport {default as group, flatGroup, flatRollup, groups, index, indexes, rollup, rollups} from \"./group.js\";\nexport {default as groupSort} from \"./groupSort.js\";\nexport {default as bin, default as histogram} from \"./bin.js\"; // Deprecated; use bin.\nexport {default as thresholdFreedmanDiaconis} from \"./threshold/freedmanDiaconis.js\";\nexport {default as thresholdScott} from \"./threshold/scott.js\";\nexport {default as thresholdSturges} from \"./threshold/sturges.js\";\nexport {default as max} from \"./max.js\";\nexport {default as maxIndex} from \"./maxIndex.js\";\nexport {default as mean} from \"./mean.js\";\nexport {default as median, medianIndex} from \"./median.js\";\nexport {default as merge} from \"./merge.js\";\nexport {default as min} from \"./min.js\";\nexport {default as minIndex} from \"./minIndex.js\";\nexport {default as mode} from \"./mode.js\";\nexport {default as nice} from \"./nice.js\";\nexport {default as pairs} from \"./pairs.js\";\nexport {default as permute} from \"./permute.js\";\nexport {default as quantile, quantileIndex, quantileSorted} from \"./quantile.js\";\nexport {default as quickselect} from \"./quickselect.js\";\nexport {default as range} from \"./range.js\";\nexport {default as rank} from \"./rank.js\";\nexport {default as least} from \"./least.js\";\nexport {default as leastIndex} from \"./leastIndex.js\";\nexport {default as greatest} from \"./greatest.js\";\nexport {default as greatestIndex} from \"./greatestIndex.js\";\nexport {default as scan} from \"./scan.js\"; // Deprecated; use leastIndex.\nexport {default as shuffle, shuffler} from \"./shuffle.js\";\nexport {default as sum} from \"./sum.js\";\nexport {default as ticks, tickIncrement, tickStep} from \"./ticks.js\";\nexport {default as transpose} from \"./transpose.js\";\nexport {default as variance} from \"./variance.js\";\nexport {default as zip} from \"./zip.js\";\nexport {default as every} from \"./every.js\";\nexport {default as some} from \"./some.js\";\nexport {default as filter} from \"./filter.js\";\nexport {default as map} from \"./map.js\";\nexport {default as reduce} from \"./reduce.js\";\nexport {default as reverse} from \"./reverse.js\";\nexport {default as sort} from \"./sort.js\";\nexport {default as difference} from \"./difference.js\";\nexport {default as disjoint} from \"./disjoint.js\";\nexport {default as intersection} from \"./intersection.js\";\nexport {default as subset} from \"./subset.js\";\nexport {default as superset} from \"./superset.js\";\nexport {default as union} from \"./union.js\";\nexport {InternMap, InternSet} from \"internmap\";\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","import {InternMap} from \"internmap\";\nimport identity from \"./identity.js\";\n\nexport default function group(values, ...keys) {\n return nest(values, identity, identity, keys);\n}\n\nexport function groups(values, ...keys) {\n return nest(values, Array.from, identity, keys);\n}\n\nfunction flatten(groups, keys) {\n for (let i = 1, n = keys.length; i < n; ++i) {\n groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value]));\n }\n return groups;\n}\n\nexport function flatGroup(values, ...keys) {\n return flatten(groups(values, ...keys), keys);\n}\n\nexport function flatRollup(values, reduce, ...keys) {\n return flatten(rollups(values, reduce, ...keys), keys);\n}\n\nexport function rollup(values, reduce, ...keys) {\n return nest(values, identity, reduce, keys);\n}\n\nexport function rollups(values, reduce, ...keys) {\n return nest(values, Array.from, reduce, keys);\n}\n\nexport function index(values, ...keys) {\n return nest(values, identity, unique, keys);\n}\n\nexport function indexes(values, ...keys) {\n return nest(values, Array.from, unique, keys);\n}\n\nfunction unique(values) {\n if (values.length !== 1) throw new Error(\"duplicate key\");\n return values[0];\n}\n\nfunction nest(values, map, reduce, keys) {\n return (function regroup(values, i) {\n if (i >= keys.length) return reduce(values);\n const groups = new InternMap();\n const keyof = keys[i++];\n let index = -1;\n for (const value of values) {\n const key = keyof(value, ++index, values);\n const group = groups.get(key);\n if (group) group.push(value);\n else groups.set(key, [value]);\n }\n for (const [key, values] of groups) {\n groups.set(key, regroup(values, i));\n }\n return map(groups);\n })(values, 0);\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","export default function identity(x) {\n return x;\n}\n","import ascending from \"./ascending.js\";\nimport group, {rollup} from \"./group.js\";\nimport sort from \"./sort.js\";\n\nexport default function groupSort(values, reduce, key) {\n return (reduce.length !== 2\n ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk)))\n : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk))))\n .map(([key]) => key);\n}\n","import ascending from \"./ascending.js\";\nimport permute from \"./permute.js\";\n\nexport default function sort(values, ...F) {\n if (typeof values[Symbol.iterator] !== \"function\") throw new TypeError(\"values is not iterable\");\n values = Array.from(values);\n let [f] = F;\n if ((f && f.length !== 2) || F.length > 1) {\n const index = Uint32Array.from(values, (d, i) => i);\n if (F.length > 1) {\n F = F.map(f => values.map(f));\n index.sort((i, j) => {\n for (const f of F) {\n const c = ascendingDefined(f[i], f[j]);\n if (c) return c;\n }\n });\n } else {\n f = values.map(f);\n index.sort((i, j) => ascendingDefined(f[i], f[j]));\n }\n return permute(values, index);\n }\n return values.sort(compareDefined(f));\n}\n\nexport function compareDefined(compare = ascending) {\n if (compare === ascending) return ascendingDefined;\n if (typeof compare !== \"function\") throw new TypeError(\"compare is not a function\");\n return (a, b) => {\n const x = compare(a, b);\n if (x || x === 0) return x;\n return (compare(b, b) === 0) - (compare(a, a) === 0);\n };\n}\n\nexport function ascendingDefined(a, b) {\n return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);\n}\n","export default function permute(source, keys) {\n return Array.from(keys, key => source[key]);\n}\n","export {default as color, rgb, hsl} from \"./color.js\";\nexport {default as lab, hcl, lch, gray} from \"./lab.js\";\nexport {default as cubehelix} from \"./cubehelix.js\";\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import type {BinaryFeature} from '@loaders.gl/schema';\nimport type {Dataset} from './types.js';\ntype Properties = BinaryFeature['properties'];\ntype NumericProps = BinaryFeature['numericProps'];\n\n// Returns a Proxy object that allows accessing binary data\n// as if it were JSON properties\nexport function createBinaryProxy(\n data: {numericProps: NumericProps; properties: Properties[]},\n index: number\n) {\n const {properties, numericProps} = data;\n return new Proxy(properties[index] || {}, {\n get(target, property) {\n if (property in numericProps) {\n return numericProps[property as string].value[index];\n }\n return target[property as any];\n },\n\n has(target, property) {\n return property in numericProps || property in target;\n },\n\n ownKeys(target) {\n return [...Object.keys(numericProps), ...Reflect.ownKeys(target)];\n },\n\n getOwnPropertyDescriptor() {\n return {enumerable: true, configurable: true};\n },\n });\n}\n\nexport function scaleIdentity() {\n let unknown: any;\n\n function scale(x: any) {\n return x === null ? unknown : x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = (d: any) => d;\n\n scale.unknown = (u: any) => {\n if (u) {\n unknown = u;\n }\n\n return unknown;\n };\n\n scale.copy = () => {\n const scaleCopy = scaleIdentity();\n scaleCopy.unknown(unknown);\n return scaleCopy;\n };\n\n return scale;\n}\n\nexport function isRemoteCalculationSupported(dataset: Dataset) {\n if (dataset?.type === 'tileset' || dataset.providerId === 'databricks') {\n return false;\n }\n\n return true;\n}\n\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n year: '2-digit',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function formatDate(value: string | number | Date): string {\n return DATE_FORMATTER.format(new Date(value));\n}\n\nexport function formatTimestamp(value: string | number | Date): string {\n return String(Math.floor(new Date(value).getTime() / 1000));\n}\n","import {\n GOOGLE_BASEMAPS,\n CARTO_MAP_STYLES,\n applyLayerGroupFilters,\n fetchStyle,\n getStyleUrl,\n someLayerGroupsDisabled,\n} from './basemap-styles.js';\nimport type {Basemap, KeplerMapConfig, MapLibreBasemapProps} from './types.js';\nimport type {APIErrorContext} from '../api/index.js';\n\nconst CUSTOM_STYLE_ID_PREFIX = 'custom:';\nconst DEFAULT_CARTO_STYLE = 'positron';\n\n// Subset of type from @deck.gl/core to avoid adding dependency\ntype MapViewState = {\n /** Longitude of the map center */\n longitude: number;\n /** Latitude of the map center */\n latitude: number;\n /** Zoom level */\n zoom: number;\n /** Pitch (tilt) of the map, in degrees. `0` looks top down */\n pitch?: number;\n /** Bearing (rotation) of the map, in degrees. `0` is north up */\n bearing?: number;\n};\n\nfunction mapLibreViewpros(\n config: KeplerMapConfig\n): Omit<MapLibreBasemapProps, 'style'> {\n const {longitude, latitude, ...rest} = config.mapState as MapViewState;\n return {\n center: [longitude, latitude],\n ...rest,\n };\n}\n\n/**\n * Get basemap properties for Carto map.\n *\n * For maplibre-based basemaps it returns style or style URL that can be used with `maplibregl.Map` compatible component.\n * * style url is returned for non-filtered standard Carto basemaps or if user used style URL directly in configuration\n * * filtered style object returned for Carto basemaps with layer groups filtered\n *\n * For Google-maps base maps, it returns options that can be used with `google.maps.Map` constructor.\n */\nexport async function fetchBasemapProps({\n config,\n errorContext,\n\n applyLayerFilters = true,\n}: {\n config: KeplerMapConfig;\n\n /** By default `fetchBasemapProps` applies layers filters to style. Set this to `false` to disable it. */\n applyLayerFilters?: boolean;\n errorContext?: APIErrorContext;\n}): Promise<Basemap | null> {\n const {mapStyle} = config;\n const styleType = mapStyle.styleType || DEFAULT_CARTO_STYLE;\n if (styleType.startsWith(CUSTOM_STYLE_ID_PREFIX)) {\n const currentCustomStyle = config.customBaseMaps?.customStyle;\n if (currentCustomStyle) {\n return {\n type: 'maplibre',\n props: {\n style: currentCustomStyle.style || currentCustomStyle.url,\n ...mapLibreViewpros(config),\n },\n attribution: currentCustomStyle.customAttribution,\n };\n }\n }\n\n if (CARTO_MAP_STYLES.includes(styleType)) {\n const {visibleLayerGroups} = mapStyle;\n const styleUrl = getStyleUrl(styleType);\n let style = styleUrl;\n let rawStyle = styleUrl;\n if (\n applyLayerFilters &&\n visibleLayerGroups &&\n someLayerGroupsDisabled(visibleLayerGroups)\n ) {\n rawStyle = await fetchStyle({styleUrl, errorContext});\n style = applyLayerGroupFilters(rawStyle, visibleLayerGroups);\n }\n return {\n type: 'maplibre',\n props: {\n style,\n ...mapLibreViewpros(config),\n },\n visibleLayerGroups,\n rawStyle,\n };\n }\n const googleBasemapDef = GOOGLE_BASEMAPS[styleType];\n if (googleBasemapDef) {\n const {mapState} = config;\n return {\n type: 'google-maps',\n props: {\n ...googleBasemapDef,\n center: {lat: mapState.latitude, lng: mapState.longitude},\n zoom: mapState.zoom + 1,\n tilt: mapState.pitch,\n heading: mapState.bearing,\n },\n };\n }\n return {\n type: 'maplibre',\n props: {\n style: getStyleUrl(DEFAULT_CARTO_STYLE),\n ...mapLibreViewpros(config),\n },\n };\n}\n","import type {Dataset} from './types.js';\nimport {SpatialIndex, SpatialIndexColumn} from '../constants.js';\nimport type {\n QuerySourceOptions,\n TableSourceOptions,\n TilejsonResult,\n TileResolution,\n} from '../sources/types.js';\nimport {\n DEFAULT_AGGREGATION_EXP,\n DEFAULT_AGGREGATION_RES_LEVEL_H3,\n DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n DEFAULT_TILE_RESOLUTION,\n REDUCED_QUERIES_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n h3QuerySource,\n type H3QuerySourceOptions,\n h3TableSource,\n type H3TableSourceOptions,\n quadbinQuerySource,\n type QuadbinQuerySourceOptions,\n quadbinTableSource,\n type QuadbinTableSourceOptions,\n rasterSource,\n vectorQuerySource,\n type VectorQuerySourceOptions,\n vectorTableSource,\n type VectorTableSourceOptions,\n vectorTilesetSource,\n type VectorTilesetSourceOptions,\n} from '../sources/index.js';\nimport type {Filter} from '../types.js';\n\ntype FetchDatasetOptions = {\n accessToken: string;\n apiBaseUrl: string;\n connection: string;\n headers?: Record<string, string>;\n localCache?: {\n cacheControl: 'no-cache'[];\n };\n maxLengthURL?: number;\n};\n\ntype FetchDataset = {\n dataset: Dataset;\n filters?: Filter;\n options: FetchDatasetOptions;\n};\n\n// Copy of getCartoSource from cloud-native:\n// https://github.com/CartoDB/cloud-native/blob/main/workspace-www/src/features/common/utils/cartoDeckGL.ts#L79\nexport function configureSource({\n dataset,\n filters,\n options,\n}: FetchDataset): Promise<TilejsonResult> {\n const {\n geoColumn,\n columns,\n type,\n source,\n queryParameters,\n aggregationExp,\n aggregationResLevel: originalAggregationResLevel,\n } = dataset;\n const sourceOptions = getSourceOptions(options);\n const spatialDataColumn = getColumnNameFromGeoColumn(geoColumn) || undefined;\n const spatialIndex = geoColumn\n ? getSpatialIndexFromGeoColumn(geoColumn)\n : undefined;\n const tileResolution = getDynamicTileResolution(spatialIndex);\n const isH3 = spatialIndex === SpatialIndex.H3;\n const isQuadbin = spatialIndex === SpatialIndex.QUADBIN;\n let aggregationResLevel = originalAggregationResLevel;\n\n if (typeof originalAggregationResLevel !== 'number' && isH3) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3;\n } else if (typeof originalAggregationResLevel !== 'number' && isQuadbin) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN;\n }\n\n const spatialIndexOptions = {\n aggregationExp: !aggregationExp ? DEFAULT_AGGREGATION_EXP : aggregationExp,\n aggregationResLevel: scaleAggregationResLevel(\n aggregationResLevel,\n tileResolution\n ),\n spatialDataColumn,\n ...(filters && {filters}),\n } as H3QuerySourceOptions;\n const tilesetOptions = {\n ...sourceOptions,\n tableName: source,\n } as VectorTilesetSourceOptions;\n const tableOptions = {\n ...sourceOptions,\n tableName: source,\n tileResolution,\n } as TableSourceOptions;\n const queryOptions = {\n ...sourceOptions,\n sqlQuery: source,\n tileResolution,\n ...(queryParameters && {queryParameters}),\n } as QuerySourceOptions;\n const vectorOptions = {\n spatialDataColumn,\n ...(columns && {columns}),\n ...(filters && {filters}),\n ...(aggregationExp && {aggregationExp}),\n } as VectorTableSourceOptions;\n\n if (type === 'raster') {\n return rasterSource({\n ...sourceOptions,\n tableName: source,\n ...(filters && {filters: filters as any}),\n });\n }\n if (type === 'tileset') {\n return vectorTilesetSource({...tilesetOptions});\n }\n\n if (type === 'table') {\n if (isH3) {\n return h3TableSource({\n ...(tableOptions as H3TableSourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinTableSource({\n ...(tableOptions as QuadbinTableSourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorTableSource({\n ...(tableOptions as VectorTableSourceOptions),\n ...vectorOptions,\n });\n }\n }\n\n if (type === 'query') {\n if (isH3) {\n return h3QuerySource({\n ...(queryOptions as H3QuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinQuerySource({\n ...(queryOptions as QuadbinQuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorQuerySource({\n ...(queryOptions as VectorQuerySourceOptions),\n ...vectorOptions,\n });\n }\n }\n throw new Error(`Invalid source type: ${type}`);\n}\n\nfunction getSourceOptions({\n accessToken,\n apiBaseUrl,\n connection,\n headers,\n maxLengthURL,\n}: FetchDatasetOptions) {\n return {\n accessToken,\n connectionName: connection,\n apiBaseUrl,\n headers,\n maxLengthURL,\n ...(headers?.['Cache-Control']?.includes('no-cache') && {\n localCache: {\n cacheControl: ['no-cache'] as 'no-cache'[],\n },\n }),\n };\n}\n\n/**\n * Returns default tile resolution for dynamic tilesets, based on layer configuration\n * Result is not applicable for static tilesets, for which tile resolution is defined\n * by tilejson.\n */\nfunction getDynamicTileResolution(\n spatialIndex?: SpatialIndex | null\n): TileResolution {\n // TODO: Support increased tile size and resolution for dynamic H3 spatial indexes.\n if (spatialIndex !== SpatialIndex.H3) {\n return REDUCED_QUERIES_TILE_RESOLUTION;\n }\n\n return DEFAULT_TILE_RESOLUTION;\n}\n\n/**\n * @internal\n * State of `aggregationResLevel` in the UI and backend config is based on an assumption of\n * 512x512px tiles. Because we may change tile resolution for performance goals, the\n * `aggregationResLevel` passed to the deck.gl layer must be scaled with tile resolution.\n */\nexport function scaleAggregationResLevel(\n aggregationResLevel: number,\n tileResolution: number\n): number | undefined {\n if (typeof aggregationResLevel !== 'number') return;\n return aggregationResLevel - Math.log2(0.5 / tileResolution);\n}\n\n/**\n * @internal\n */\nexport function getColumnNameFromGeoColumn(\n geoColumn: string | null | undefined\n) {\n if (!geoColumn) {\n return geoColumn;\n }\n const parts = geoColumn.split(':');\n return parts.length === 1 ? parts[0] : parts.length === 2 ? parts[1] : null;\n}\n\n/**\n * @internal\n */\nexport function getSpatialIndexFromGeoColumn(geoColumn: string) {\n const spatialIndexToSearch = geoColumn.split(':')[0];\n\n for (const index of Object.values(SpatialIndex)) {\n if (SpatialIndexColumn[index].includes(spatialIndexToSearch)) {\n return index;\n }\n }\n return null;\n}\n","import bboxClip from '@turf/bbox-clip';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport union from '@turf/union';\nimport {getType} from '@turf/invariant';\nimport {polygon, multiPolygon, feature, featureCollection} from '@turf/helpers';\nimport type {BBox, Geometry, MultiPolygon, Polygon, Position} from 'geojson';\nimport type {SpatialFilter} from './types.js';\n\n/**\n * Returns a {@link SpatialFilter} for a given viewport, typically obtained\n * from deck.gl's `viewport.getBounds()` method ([west, south, east, north]).\n * If the viewport covers the entire world (to some margin of error in Web\n * Mercator space), `undefined` is returned instead.\n *\n * If the viewport extends beyond longitude range [-180, +180], the polygon\n * may be reformatted for compatibility with CARTO APIs.\n */\nexport function createViewportSpatialFilter(\n viewport: BBox\n): SpatialFilter | undefined {\n if (_isGlobalViewport(viewport)) {\n return;\n }\n return createPolygonSpatialFilter(bboxPolygon(viewport).geometry);\n}\n\n/**\n * Returns a {@link SpatialFilter} for a given {@link Polygon} or\n * {@link MultiPolygon}. If the polygon(s) extend outside longitude\n * range [-180, +180], the result may be reformatted for compatibility\n * with CARTO APIs.\n */\nexport function createPolygonSpatialFilter(\n spatialFilter: Polygon | MultiPolygon\n): SpatialFilter | undefined {\n return (spatialFilter && _normalizeGeometry(spatialFilter)) || undefined;\n}\n\n/**\n * Check if a viewport is large enough to represent a global coverage.\n * In this case the spatial filter parameter for widget calculation is removed.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _isGlobalViewport(viewport: BBox) {\n const [minx, miny, maxx, maxy] = viewport;\n return maxx - minx > 179.5 * 2 && maxy - miny > 85.05 * 2;\n}\n\n/**\n * Normalized a geometry, coming from a mask or a viewport. The parts\n * spanning outside longitude range [-180, +180] are clipped and \"folded\"\n * back to the valid range and unioned to the polygons inide that range.\n *\n * It results in a Polygon or MultiPolygon strictly inside the validity range.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _normalizeGeometry(\n geometry: Polygon | MultiPolygon\n): Polygon | MultiPolygon | null {\n const WORLD = [-180, -90, +180, +90] as BBox;\n const worldClip = _clean(\n bboxClip(geometry, WORLD).geometry as Polygon | MultiPolygon\n );\n\n const geometryTxWest = _tx(geometry, 360);\n const geometryTxEast = _tx(geometry, -360);\n\n let result: Polygon | MultiPolygon | null = worldClip;\n\n if (result && geometryTxWest) {\n const worldWestClip = _clean(\n bboxClip(geometryTxWest, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldWestClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldWestClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n if (result && geometryTxEast) {\n const worldEastClip = _clean(\n bboxClip(geometryTxEast, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldEastClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldEastClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n return result;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanPolygonCoords(cc: Position[][]) {\n const coords = cc.filter((c) => c.length > 0);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanMultiPolygonCoords(ccc: Position[][][]) {\n const coords = ccc.map(_cleanPolygonCoords).filter((cc) => cc);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _clean(\n geometry: Polygon | MultiPolygon | null\n): Polygon | MultiPolygon | null {\n if (!geometry) {\n return null;\n }\n\n if (_isPolygon(geometry)) {\n const coords = _cleanPolygonCoords(geometry.coordinates);\n return coords ? polygon(coords).geometry : null;\n }\n\n if (_isMultiPolygon(geometry)) {\n const coords = _cleanMultiPolygonCoords(geometry.coordinates);\n return coords ? multiPolygon(coords as Position[][][]).geometry : null;\n }\n\n return null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txContourCoords(cc: Position[], distance: number) {\n return cc.map((c) => [c[0] + distance, c[1]]);\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txPolygonCoords(ccc: Position[][], distance: number) {\n return ccc.map((cc) => _txContourCoords(cc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txMultiPolygonCoords(cccc: Position[][][], distance: number) {\n return cccc.map((ccc) => _txPolygonCoords(ccc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _tx(geometry: Polygon | MultiPolygon, distance: number) {\n if (geometry && getType(geometry) === 'Polygon') {\n const coords = _txPolygonCoords(\n (geometry as Polygon).coordinates,\n distance\n );\n return polygon(coords).geometry;\n } else if (geometry && getType(geometry) === 'MultiPolygon') {\n const coords = _txMultiPolygonCoords(\n (geometry as MultiPolygon).coordinates,\n distance\n );\n return multiPolygon(coords).geometry;\n } else {\n return null;\n }\n}\n\nfunction _isPolygon(geometry: Geometry): geometry is Polygon {\n return getType(geometry) === 'Polygon';\n}\n\nfunction _isMultiPolygon(geometry: Geometry): geometry is MultiPolygon {\n return getType(geometry) === 'MultiPolygon';\n}\n","// Default tile display size in deck.gl, in viewport pixels. May differ\n// from size or resolution assumed when generating the tile data,\nconst DEFAULT_TILE_SIZE = 512;\n\n// Relative scale factor (0 = no biasing, 2 = a few hexagons cover view)\nconst BIAS = 2;\n\n/**\n * Resolution conversion function. Takes a WebMercatorViewport and returns\n * a H3 resolution such that the screen space size of the hexagons is\n * \"similar\" to the given tileSize on screen. Intended for use with deck.gl.\n * @internal\n * @privateRemarks Source: https://github.com/visgl/deck.gl/blob/master/modules/carto/src/layers/h3-tileset-2d.ts\n */\nexport function _getHexagonResolution(\n viewport: {zoom: number; latitude: number},\n tileSize: number\n): number {\n // Difference in given tile size compared to deck's internal 512px tile size,\n // expressed as an offset to the viewport zoom.\n const zoomOffset = Math.log2(tileSize / DEFAULT_TILE_SIZE);\n const hexagonScaleFactor = (2 / 3) * (viewport.zoom - zoomOffset);\n const latitudeScaleFactor = Math.log(\n 1 / Math.cos((Math.PI * viewport.latitude) / 180)\n );\n\n // Clip and bias\n return Math.max(\n 0,\n Math.floor(hexagonScaleFactor + latitudeScaleFactor - BIAS)\n );\n}\n","/** Flags 'empty' values in a Uint32Array index. */\nconst EMPTY_U32 = 2 ** 32 - 1;\n\n/**\n * Custom Set-like interface optimized for BigUint64 cell IDs. Unlike Set,\n * limited in most JavaScript runtimes to ~16M entries, this implementation\n * can support up to `n = 2^32 - 1` (4 billion) entries, with lookups in\n * amortized O(1) time.\n */\nexport class CellSet {\n /** List of cells stored by the set. Stored by reference, without copying. */\n private cells: bigint[];\n\n /** DataView representing a single cell ID. Pre-allocated to reduce memory during queries. */\n private cellView = new DataView(new ArrayBuffer(8));\n\n /** Hash table, mapping a hash index (computed) to an index in the 'cells' array. */\n private hashTable: Uint32Array;\n\n constructor(cells: bigint[]) {\n this.cells = cells;\n\n // Pre-allocate hash table for queries.\n this.hashTable = new Uint32Array(hashBuckets(cells.length)).fill(EMPTY_U32);\n for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n this.hashTable[this.hashLookup(cells[cellIndex])] = cellIndex;\n }\n }\n\n has(cell: bigint): boolean {\n const hashIndex = this.hashLookup(cell);\n return this.hashTable[hashIndex] !== EMPTY_U32;\n }\n\n private hashLookup(cell: bigint): number {\n // Hash implementation operates on 32-bit chunks, so write the cell ID\n // into a pre-allocated DataView for easier iteration.\n this.cellView.setBigUint64(0, cell);\n const hashval = hash(this.cellView);\n const hashmod = this.hashTable.length - 1;\n let bucket = hashval & hashmod;\n\n // Find the first bucket in the hash table where either (a) no cell\n // is yet stored, or (b) the stored cell and the query cell are equal.\n for (let probe = 0; probe <= hashmod; probe++) {\n const cellIndex = this.hashTable[bucket];\n\n if (cellIndex === EMPTY_U32 || cell === this.cells[cellIndex]) {\n return bucket;\n }\n\n bucket = (bucket + probe + 1) & hashmod; // Hash collision; quadratic probing.\n }\n\n throw new Error('Hash table full.'); // Unreachable.\n }\n}\n\n/**\n * MurmurHash2\n *\n * References:\n * - https://github.com/mikolalysenko/murmurhash-js/blob/f19136e9f9c17f8cddc216ca3d44ec7c5c502f60/murmurhash2_gc.js#L14\n * - https://github.com/zeux/meshoptimizer/blob/e47e1be6d3d9513153188216455bdbed40a206ef/src/indexgenerator.cpp#L12\n */\nfunction hash(view: DataView, h = 0): number {\n const m = 0x5bd1e995;\n const r = 24;\n\n for (let i = 0, il = view.byteLength / 4; i < il; i++) {\n let k = view.getUint32(i * 4);\n\n k = Math.imul(k, m) >>> 0;\n k = (k ^ (k >> r)) >>> 0;\n k = Math.imul(k, m) >>> 0;\n\n h = Math.imul(h, m) >>> 0;\n h = (h ^ k) >>> 0;\n }\n\n return h;\n}\n\nfunction hashBuckets(initialCount: number) {\n let buckets = 1;\n while (buckets < initialCount + initialCount / 4) {\n buckets *= 2;\n }\n return buckets;\n}\n"],"mappings":"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","names":["exports","module","identity","v","FilterType","ApiVersion","TileFormat","SpatialIndex","Provider","stringRegExp","feature","u3","u","bc","ca","ab","u","abt","bct","cat","_8","_16","fin","fin2","ab","bc","_8","_8b","_16","_48","fin","polygon","u2","point","polygon","bbox","compare","featureId","ringId","eventId","intersection","sweeplineIntersections","intersection","featureId","bbox","lineString","polygon","feature","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","bbox","multiLineString","lineString","polygon","multiPolygon","bbox","isPointOnLineSegment","epsilon","isLineOnLine","isLineInPoly","isPolyInPoly","point","compareCoords","lineString","polygon","clone","BigNumber","v","sum","compare","format","min","max","compare","compare","v","u","set","node","v","eps","bbox","point","Segment","pt","nextPt","SplayTreeSet","evt","BigNumber","intersection","intersection","TRANSFORM_FN","transformPoint","transformMultiPoint","transformLineString","transformMultiLineString","transformPolygon","transformMultiPolygon","bbox","getPoints","multiLineString","lineString","polygon","multiPolygon","bbox","intersect","feature","quadbinCellToBoundary","quadbinGeometryToCells","h3PolygonToCells","intersection","bbox","featureId","import_quadbin","import_h3_js","intersection","quadbinGetResolution","h3GetResolution","import_quadbin","intersection","SchemaFieldType","assert","isObject","field","assert","v","feature","assert","FILTER_TYPES","operation","assert","sum","feature","operation","v","min","max","operation","group","operation","operation","feature","feature","_GeojsonEquality","_a","_b","isObject","equals","isPointOnLineSegment","point","precision","operation","assert","bbox","min","max","key","values","keyof","group","f","compare","key","min","max","scale","u","identity","v","config","min","data","scale","color","d3Format","min","max","assert","config","defaultProps","color","scale","config","client","assert","v","config","union","cc"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../node_modules/thenby/thenBy.module.js","../src/index.ts","../src/client.ts","../src/constants.ts","../src/deck/get-data-filter-extension-props.ts","../src/filters/Filter.ts","../src/filters/FilterTypes.ts","../src/utils/makeIntervalComplete.ts","../src/filters/geosjonFeatures.ts","../node_modules/point-in-polygon-hao/dist/esm/index.js","../node_modules/robust-predicates/index.js","../node_modules/robust-predicates/esm/orient2d.js","../node_modules/robust-predicates/esm/util.js","../node_modules/robust-predicates/esm/orient3d.js","../node_modules/robust-predicates/esm/incircle.js","../node_modules/robust-predicates/esm/insphere.js","../node_modules/@turf/helpers/index.ts","../node_modules/@turf/boolean-point-in-polygon/index.ts","../node_modules/sweepline-intersections/dist/sweeplineIntersections.esm.js","../node_modules/@turf/boolean-disjoint/index.ts","../src/filters/tileFeatures.ts","../src/filters/tileFeaturesGeometries.ts","../src/utils/transformTileCoordsToWGS84.ts","../node_modules/@math.gl/core/src/index.ts","../node_modules/@math.gl/core/src/lib/common.ts","../node_modules/@math.gl/web-mercator/src/index.ts","../node_modules/@math.gl/web-mercator/src/web-mercator-viewport.ts","../node_modules/@math.gl/web-mercator/src/math-utils.ts","../node_modules/@math.gl/web-mercator/src/web-mercator-utils.ts","../node_modules/@math.gl/web-mercator/src/assert.ts","../node_modules/@math.gl/web-mercator/src/fit-bounds.ts","../node_modules/@math.gl/web-mercator/src/get-bounds.ts","../node_modules/@math.gl/web-mercator/src/normalize-viewport-props.ts","../node_modules/@math.gl/web-mercator/src/fly-to-viewport.ts","../src/filters/tileIntersection.ts","../node_modules/@turf/bbox/index.ts","../node_modules/bignumber.js/bignumber.mjs","../node_modules/polyclip-ts/src/geom-in.ts","../node_modules/polyclip-ts/src/constant.ts","../node_modules/polyclip-ts/src/compare.ts","../node_modules/polyclip-ts/src/orient.ts","../node_modules/polyclip-ts/src/snap.ts","../node_modules/polyclip-ts/src/identity.ts","../node_modules/polyclip-ts/src/precision.ts","../node_modules/polyclip-ts/src/bbox.ts","../node_modules/polyclip-ts/src/operation.ts","../node_modules/polyclip-ts/src/vector.ts","../node_modules/polyclip-ts/src/sweep-event.ts","../node_modules/polyclip-ts/src/geom-out.ts","../node_modules/polyclip-ts/src/sweep-line.ts","../node_modules/polyclip-ts/src/segment.ts","../node_modules/polyclip-ts/src/index.ts","../src/utils/transformToTileCoords.ts","../src/filters/tileFeaturesSpatialIndex.ts","../src/constants-internal.ts","../src/filters/tileFeaturesRaster.ts","../src/utils.ts","../src/types.ts","../src/fetch-map/index.ts","../src/fetch-map/basemap-styles.ts","../src/api/index.ts","../src/api/carto-api-error.ts","../src/api/endpoints.ts","../src/api/query.ts","../src/sources/index.ts","../src/sources/base-source.ts","../src/api/request-with-parameters.ts","../src/sources/boundary-query-source.ts","../src/sources/boundary-table-source.ts","../src/sources/h3-query-source.ts","../src/widget-sources/widget-source.ts","../src/widget-sources/widget-query-source.ts","../src/widget-sources/widget-remote-source.ts","../src/models/index.ts","../src/models/model.ts","../src/models/common.ts","../src/filters.ts","../src/widget-sources/constants.ts","../src/widget-sources/widget-raster-source.ts","../src/widget-sources/widget-tileset-source.ts","../src/widget-sources/widget-tileset-source-impl.ts","../src/operations/aggregation.ts","../src/operations/applySorting.ts","../src/operations/groupBy.ts","../src/operations/groupByDate.ts","../src/utils/dateUtils.ts","../src/operations/histogram.ts","../src/operations/scatterPlot.ts","../node_modules/geojson-equality-ts/index.ts","../src/widget-sources/widget-table-source.ts","../src/sources/h3-table-source.ts","../src/sources/h3-tileset-source.ts","../src/utils/getTileFormat.ts","../src/sources/raster-source.ts","../src/sources/quadbin-query-source.ts","../src/sources/quadbin-table-source.ts","../src/sources/quadbin-tileset-source.ts","../src/sources/vector-query-source.ts","../src/sources/vector-table-source.ts","../src/sources/vector-tileset-source.ts","../src/fetch-map/fetch-map.ts","../src/fetch-map/parse-map.ts","../src/fetch-map/layer-map.ts","../node_modules/d3-array/src/index.js","../node_modules/d3-array/src/ascending.js","../node_modules/d3-array/src/extent.js","../node_modules/d3-array/src/group.js","../node_modules/internmap/src/index.js","../node_modules/d3-array/src/identity.js","../node_modules/d3-array/src/groupSort.js","../node_modules/d3-array/src/sort.js","../node_modules/d3-array/src/permute.js","../node_modules/d3-color/src/index.js","../node_modules/d3-color/src/color.js","../node_modules/d3-color/src/define.js","../src/fetch-map/utils.ts","../src/fetch-map/basemap.ts","../src/fetch-map/source.ts","../src/geo.ts","../src/spatial-index.ts","../src/utils/CellSet.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/***\n Copyright 2013 Teun Duynstee\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nmodule.exports = (function() {\n\n function identity(v){return v;}\n\n function ignoreCase(v){return typeof(v)===\"string\" ? v.toLowerCase() : v;}\n\n function makeCompareFunction(f, opt){\n opt = typeof(opt)===\"object\" ? opt : {direction:opt};\n \n if(typeof(f)!=\"function\"){\n var prop = f;\n // make unary function\n f = function(v1){return !!v1[prop] ? v1[prop] : \"\";}\n }\n if(f.length === 1) {\n // f is a unary function mapping a single item to its sort score\n var uf = f;\n var preprocess = opt.ignoreCase?ignoreCase:identity;\n var cmp = opt.cmp || function(v1,v2) {return v1 < v2 ? -1 : v1 > v2 ? 1 : 0;}\n f = function(v1,v2) {return cmp(preprocess(uf(v1)), preprocess(uf(v2)));}\n }\n const descTokens = {\"-1\":'', desc:''};\n if(opt.direction in descTokens) return function(v1,v2){return -f(v1,v2)};\n return f;\n }\n\n /* adds a secondary compare function to the target function (`this` context)\n which is applied in case the first one returns 0 (equal)\n returns a new compare function, which has a `thenBy` method as well */\n function tb(func, opt) {\n /* should get value false for the first call. This can be done by calling the \n exported function, or the firstBy property on it (for es6 module compatibility)\n */\n var x = (typeof(this) == \"function\" && !this.firstBy) ? this : false;\n var y = makeCompareFunction(func, opt);\n var f = x ? function(a, b) {\n return x(a,b) || y(a,b);\n }\n : y;\n f.thenBy = tb;\n return f;\n }\n tb.firstBy = tb;\n return tb;\n})();\n","export * from './client.js';\nexport * from './constants.js';\nexport * from './deck/index.js';\nexport * from './fetch-map/index.js';\nexport type {LayerDescriptor, LayerType} from './fetch-map/index.js';\nexport * from './filters.js';\nexport * from './geo.js';\nexport * from './sources/index.js';\nexport * from './widget-sources/index.js';\nexport * from './types.js';\n\nexport {\n type APIErrorContext,\n type APIRequestType,\n CartoAPIError,\n type QueryOptions,\n buildPublicMapUrl, // Internal, but required for fetchMap().\n buildStatsUrl, // Internal, but required for fetchMap().\n query,\n requestWithParameters,\n clearDefaultRequestCache, // Internal, for unit testing.\n} from './api/index.js';\n\nexport {_getHexagonResolution} from './spatial-index.js';\n\n// For unit testing only.\nexport * from './filters/index.js';\nexport * from './operations/index.js';\nexport * from './utils/makeIntervalComplete.js';\nexport * from './utils/transformToTileCoords.js';\nexport * from './utils/CellSet.js';\nexport * from './fetch-map/source.js';\n","/**\n * @internal\n * @privateRemarks Source: @carto/react-core, @carto/constants, @deck.gl/carto\n */\nlet client = 'deck-gl-carto';\n\n/**\n * Returns current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function getClient() {\n return client;\n}\n\n/**\n * Sets current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function setClient(c: string) {\n client = c;\n}\n","/**\n * Defines a comparator used when matching a column's values against given filter values.\n *\n * Example:\n *\n * ```javascript\n * import { FilterType } from '@carto/api-client';\n * const filters = {\n * column_name: { [FilterType.IN]: { values: ['a', 'b', 'c'] } }\n * };\n * ```\n *\n * @privateRemarks Source: @carto/react-api, @deck.gl/carto\n */\nexport enum FilterType {\n IN = 'in',\n /** [a, b] both are included. */\n BETWEEN = 'between',\n /** [a, b) a is included, b is not. */\n CLOSED_OPEN = 'closed_open',\n TIME = 'time',\n STRING_SEARCH = 'stringSearch',\n}\n\n/** @privateRemarks Source: @carto/constants */\nexport enum ApiVersion {\n V1 = 'v1',\n V2 = 'v2',\n V3 = 'v3',\n}\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_API_BASE_URL = 'https://gcp-us-east1.api.carto.com';\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum TileFormat {\n MVT = 'mvt',\n JSON = 'json',\n GEOJSON = 'geojson',\n BINARY = 'binary',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum SpatialIndex {\n H3 = 'h3',\n QUADBIN = 'quadbin',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum Provider {\n BIGQUERY = 'bigquery',\n REDSHIFT = 'redshift',\n POSTGRES = 'postgres',\n SNOWFLAKE = 'snowflake',\n DATABRICKS = 'databricks',\n DATABRICKS_REST = 'databricksRest',\n}\n\nexport const SpatialIndexColumn = Object.freeze({\n [SpatialIndex.H3]: ['h3', 'hex', 'h3id', 'hex_id', 'h3hex'],\n [SpatialIndex.QUADBIN]: ['quadbin'],\n});\n\n/**\n * Enum like container for all types of aggregations available for widgets.\n */\nexport const AggregationTypes = {\n Count: 'count' as const,\n Avg: 'avg' as const,\n Min: 'min' as const,\n Max: 'max' as const,\n Sum: 'sum' as const,\n Custom: 'custom' as const,\n} as const;\n","import type {Feature} from 'geojson';\nimport type {FilterLogicalOperator, Filters} from '../types.js';\nimport {FilterType} from '../constants.js';\nimport {_buildFeatureFilter} from '../filters/index.js';\nimport type {FeatureData} from '../types-internal.js';\n\ntype TimeFilter = Filters['string'][FilterType.TIME] & {\n params?: {offsetBy?: number};\n};\n\n/**\n * deck.gl's DataFilterExtension supports GPU filtering with 1–4 values. We\n * allocate filters[0] to generic filters and filters[1] to time filters.\n *\n * getFilterValue() _must_ return an array of the same size as the filterSize\n * used to initialize the DataFilterExtension. We document that users must use\n * filterSize=4 for compatibility with @link {getDataFilterExtensionProps}.\n */\nconst DEFAULT_FILTER_SIZE = 4;\n\n/** @experimental Prefer type definition from deck.gl. */\nexport type _DataFilterExtensionProps = {\n filterRange: number[][];\n updateTriggers: Record<string, string>;\n getFilterValue: (feature: Feature | FeatureData) => number[];\n};\n\n/**\n * Creates props for DataFilterExtension, from `@deck.gl/extensions`, given\n * a set of filters. Requires that DataFilterExtension is initialized with\n * filterSize=4, where the CARTO filters will occupy the first two slots.\n *\n * @example To create a deck.gl layer with GPU data filtering:\n * ```typescript\n * import {DataFilterExtension} from '@deck.gl/extensions';\n * import {VectorTileLayer} from '@deck.gl/layers';\n * import {getDataFilterExtensionProps} from '@carto/api-client';\n *\n * const layer = new VectorTileLayer({\n * data: data,\n * extensions: [new DataFilterExtension({filterSize: 4})],\n * ...getDataFilterExtensionProps(filters),\n * });\n * ```\n */\nexport function getDataFilterExtensionProps(\n filters: Filters,\n filtersLogicalOperator?: FilterLogicalOperator\n): _DataFilterExtensionProps {\n const {filtersWithoutTimeType, timeColumn, timeFilter} =\n getFiltersByType(filters);\n return {\n filterRange: getFilterRange(timeFilter, DEFAULT_FILTER_SIZE),\n updateTriggers: getUpdateTriggers(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter\n ),\n getFilterValue: getFilterValue(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n DEFAULT_FILTER_SIZE,\n filtersLogicalOperator\n ),\n };\n}\n\n/** @internal */\nfunction getFiltersByType(filters: Filters) {\n const filtersWithoutTimeType: Filters = {};\n\n let timeColumn: string | null = null;\n let timeFilter: TimeFilter | null = null;\n\n for (const [column, columnData] of Object.entries(filters)) {\n for (const [type, typeData] of Object.entries(columnData) as [\n FilterType,\n unknown,\n ][]) {\n if (type === FilterType.TIME) {\n timeColumn = column;\n timeFilter = typeData as TimeFilter;\n } else {\n filtersWithoutTimeType[column] = {[type]: typeData};\n }\n }\n }\n\n return {\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n };\n}\n\n/** @internal */\nfunction getFilterRange(\n timeFilter: TimeFilter | null,\n filterSize: number\n): number[][] {\n const result = Array(filterSize).fill([0, 0]);\n // According to getFilterValue all filters are resolved as 0 or 1 in the first position of the array\n // except the time filter value that is resolved with the real value of the feature in the second position of the array\n result[0] = [1, 1];\n if (timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n result[1] = timeFilter.values[0].map((v) => v - offsetBy);\n }\n return result;\n}\n\n/** @internal */\nfunction getUpdateTriggers(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null\n) {\n const result: Record<string, object> = {...filtersWithoutTimeType};\n\n // We don't want to change the layer UpdateTriggers every time that the time filter changes\n // because this filter is changed by the time series widget during its animation\n // so we remove the time filter value from the `updateTriggers`\n if (timeColumn && timeFilter) {\n result[timeColumn] = {\n ...result[timeColumn],\n offsetBy: timeFilter.params?.offsetBy,\n [FilterType.TIME]: {}, // Allows working with other filters, without an impact on performance.\n };\n }\n return {\n getFilterValue: JSON.stringify(result),\n };\n}\n\n/** @internal */\nfunction getFilterValue(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null,\n filterSize: number,\n filtersLogicalOperator?: FilterLogicalOperator\n) {\n const result = Array(filterSize).fill(0);\n const featureFilter = _buildFeatureFilter({\n filters: filtersWithoutTimeType,\n type: 'number',\n filtersLogicalOperator,\n });\n\n // We evaluate all filters except the time filter using _buildFeatureFilter function.\n // For the time filter, we return the value of the feature and we will change the getFilterRange result\n // every time this filter changes\n return (feature: Feature | FeatureData) => {\n result[0] = featureFilter(feature);\n\n if (timeColumn && timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n const f = (feature.properties || feature) as Record<string, unknown>;\n result[1] = (f[timeColumn] as number) - offsetBy;\n }\n return result;\n };\n}\n","import {filterFunctions} from './FilterTypes.js';\nimport type {Filter, FilterLogicalOperator, Filters} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {FilterType} from '../constants.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {BinaryFeature} from '@loaders.gl/schema';\n\nconst LOGICAL_OPERATOR_METHODS: Record<\n FilterLogicalOperator,\n 'every' | 'some'\n> = {\n and: 'every',\n or: 'some',\n};\n\nfunction passesFilter(\n columns: string[],\n filters: Filters,\n feature: FeatureData,\n filtersLogicalOperator: FilterLogicalOperator\n): boolean {\n const method = LOGICAL_OPERATOR_METHODS[filtersLogicalOperator];\n return columns[method]((column) => {\n const columnFilters = filters[column];\n const columnFilterTypes = Object.keys(columnFilters) as FilterType[];\n\n if (!feature || feature[column] === null || feature[column] === undefined) {\n return false;\n }\n\n return columnFilterTypes.every((filter) => {\n const filterFunction = filterFunctions[filter];\n\n if (!filterFunction) {\n throw new Error(`\"${filter}\" filter is not implemented.`);\n }\n\n return filterFunction(\n columnFilters[filter]!.values,\n feature[column],\n (columnFilters[filter] as Filter[FilterType.STRING_SEARCH])!.params\n );\n });\n });\n}\n\n/**\n * @internal\n * @privateRemarks Exported for use in @deck.gl/carto's getDataFilterExtensionProps.\n */\nexport function _buildFeatureFilter({\n filters = {},\n type = 'boolean',\n filtersLogicalOperator = 'and',\n}: {\n filters?: Filters;\n type?: 'number' | 'boolean';\n filtersLogicalOperator?: FilterLogicalOperator;\n}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => (type === 'number' ? 1 : true);\n }\n\n return (feature: Feature | FeatureData) => {\n const f = feature.properties || feature;\n const featurePassesFilter = passesFilter(\n columns,\n filters,\n f as FeatureData,\n filtersLogicalOperator\n );\n\n return type === 'number'\n ? Number(featurePassesFilter)\n : featurePassesFilter;\n };\n}\n\n/**\n * Apply certain filters to a collection of features.\n * @internal\n */\nexport function applyFilters(\n features: FeatureData[],\n filters: Filters,\n filtersLogicalOperator: FilterLogicalOperator\n) {\n return Object.keys(filters).length\n ? features.filter(_buildFeatureFilter({filters, filtersLogicalOperator}))\n : features;\n}\n\n/**\n * Binary.\n * @internal\n */\nexport function buildBinaryFeatureFilter({filters = {}}: {filters: Filters}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => 1;\n }\n\n return (featureIdIdx: number, binaryData: BinaryFeature) =>\n passesFilterUsingBinary(columns, filters, featureIdIdx, binaryData);\n}\n\nfunction getValueFromNumericProps(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n return binaryData.numericProps?.[column]?.value[featureIdIdx];\n}\n\nfunction getValueFromProperties(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n const propertyIdx = binaryData.featureIds.value[featureIdIdx];\n return (binaryData.properties[propertyIdx] as Record<string, unknown>)?.[\n column\n ];\n}\n\nconst GET_VALUE_BY_BINARY_PROP = {\n properties: getValueFromProperties,\n numericProps: getValueFromNumericProps,\n};\n\nfunction getBinaryPropertyByFilterValues(filterValues: unknown[]) {\n return typeof filterValues.flat()[0] === 'string'\n ? 'properties'\n : 'numericProps';\n}\n\nfunction getFeatureValue(\n featureIdIdx: number,\n binaryData: any,\n filter: {type: FilterType; column: string; values: unknown[]}\n) {\n const {column, values} = filter;\n const binaryProp = getBinaryPropertyByFilterValues(values);\n const getFeatureValueFn = GET_VALUE_BY_BINARY_PROP[binaryProp];\n return getFeatureValueFn(featureIdIdx, binaryData, {column});\n}\n\nfunction passesFilterUsingBinary(\n columns: string[],\n filters: Filters,\n featureIdIdx: number,\n binaryData: BinaryFeature\n) {\n return columns.every((column) => {\n const columnFilters = filters[column];\n\n return Object.entries(columnFilters).every(([type, {values}]) => {\n const filterFn = filterFunctions[type as FilterType];\n if (!filterFn) {\n throw new Error(`\"${type}\" filter is not implemented.`);\n }\n\n if (!values) return 0;\n\n const featureValue = getFeatureValue(featureIdIdx, binaryData, {\n type: type as FilterType,\n column,\n values,\n });\n\n if (featureValue === undefined || featureValue === null) return 0;\n\n return filterFn(values, featureValue);\n });\n });\n}\n","import {FilterType} from '../constants.js';\nimport type {FilterInterval, StringSearchOptions} from '../types.js';\nimport {makeIntervalComplete} from '../utils/makeIntervalComplete.js';\n\nexport type FilterFunction = (\n filterValues: unknown[],\n featureValue: unknown,\n params?: Record<string, unknown>\n) => boolean;\n\nexport const filterFunctions: Record<FilterType, FilterFunction> = {\n [FilterType.IN]: filterIn,\n [FilterType.BETWEEN]: filterBetween,\n [FilterType.TIME]: filterTime,\n [FilterType.CLOSED_OPEN]: filterClosedOpen,\n [FilterType.STRING_SEARCH]: filterStringSearch,\n};\n\nfunction filterIn(filterValues: unknown[], featureValue: unknown): boolean {\n return filterValues.includes(featureValue);\n}\n\n// FilterTypes.BETWEEN\nfunction filterBetween(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) <= upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as FilterInterval[]).some(\n checkRange\n );\n}\n\nfunction filterTime(filterValues: unknown[], featureValue: unknown) {\n const featureValueAsTimestamp = new Date(featureValue as number).getTime();\n if (isFinite(featureValueAsTimestamp)) {\n return filterBetween(filterValues, featureValueAsTimestamp);\n } else {\n throw new Error(`Column used to filter by time isn't well formatted.`);\n }\n}\n\n// FilterTypes.CLOSED_OPEN\nfunction filterClosedOpen(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) < upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as [number, number][]).some(\n checkRange\n );\n}\n\n// FilterTypes.STRING_SEARCH\nfunction filterStringSearch(\n filterValues: unknown[],\n featureValue: unknown,\n params: StringSearchOptions = {}\n): boolean {\n const normalizedFeatureValue = normalize(featureValue, params);\n const stringRegExp = params.useRegExp\n ? filterValues\n : filterValues.map((filterValue) => {\n let stringRegExp = escapeRegExp(normalize(filterValue, params));\n\n if (params.mustStart) stringRegExp = `^${stringRegExp}`;\n if (params.mustEnd) stringRegExp = `${stringRegExp}$`;\n\n return stringRegExp;\n });\n\n const regex = new RegExp(\n stringRegExp.join('|'),\n params.caseSensitive ? 'g' : 'gi'\n );\n return !!normalizedFeatureValue.match(regex);\n}\n\n// Aux\nconst specialCharRegExp = /[.*+?^${}()|[\\]\\\\]/g;\nconst normalizeRegExp = /\\p{Diacritic}/gu;\n\nfunction escapeRegExp(value: string) {\n return value.replace(specialCharRegExp, '\\\\$&');\n}\n\nfunction normalize(data: unknown, params: StringSearchOptions) {\n let normalizedData = String(data);\n if (!params.keepSpecialCharacters)\n normalizedData = normalizedData\n .normalize('NFD')\n .replace(normalizeRegExp, '');\n\n return normalizedData;\n}\n","import type {FilterInterval, FilterIntervalComplete} from '../types.js';\n\nexport function makeIntervalComplete(\n intervals: FilterInterval[]\n): FilterIntervalComplete[] {\n return intervals.map((val) => {\n if (val[0] === undefined || val[0] === null) {\n return [Number.MIN_SAFE_INTEGER, val[1]];\n }\n\n if (val[1] === undefined || val[1] === null) {\n return [val[0], Number.MAX_SAFE_INTEGER];\n }\n\n return val;\n }) as FilterIntervalComplete[];\n}\n","import intersects from '@turf/boolean-intersects';\nimport type {FeatureCollection} from 'geojson';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialFilter} from '../types.js';\n\nexport function geojsonFeatures({\n geojson,\n spatialFilter,\n uniqueIdProperty,\n}: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n uniqueIdProperty?: string;\n}): FeatureData[] {\n let uniqueIdx = 0;\n const map = new Map();\n\n if (!spatialFilter) {\n return [];\n }\n\n for (const feature of geojson.features) {\n const uniqueId = uniqueIdProperty\n ? feature.properties![uniqueIdProperty]\n : ++uniqueIdx;\n if (!map.has(uniqueId) && intersects(spatialFilter, feature)) {\n map.set(uniqueId, feature.properties);\n }\n }\n\n return Array.from(map.values());\n}\n","import { orient2d } from 'robust-predicates';\n\nfunction pointInPolygon(p, polygon) {\n var i;\n var ii;\n var k = 0;\n var f;\n var u1;\n var v1;\n var u2;\n var v2;\n var currentP;\n var nextP;\n\n var x = p[0];\n var y = p[1];\n\n var numContours = polygon.length;\n for (i = 0; i < numContours; i++) {\n ii = 0;\n var contour = polygon[i];\n var contourLen = contour.length - 1;\n\n currentP = contour[0];\n if (currentP[0] !== contour[contourLen][0] &&\n currentP[1] !== contour[contourLen][1]) {\n throw new Error('First and last coordinates in a ring must be the same')\n }\n\n u1 = currentP[0] - x;\n v1 = currentP[1] - y;\n\n for (ii; ii < contourLen; ii++) {\n nextP = contour[ii + 1];\n\n u2 = nextP[0] - x;\n v2 = nextP[1] - y;\n\n if (v1 === 0 && v2 === 0) {\n if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }\n } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {\n f = orient2d(u1, u2, v1, v2, 0, 0);\n if (f === 0) { return 0 }\n if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }\n }\n currentP = nextP;\n v1 = v2;\n u1 = u2;\n }\n }\n\n if (k % 2 === 0) { return false }\n return true\n}\n\nexport { pointInPolygon as default };\n","\nexport {orient2d, orient2dfast} from './esm/orient2d.js';\nexport {orient3d, orient3dfast} from './esm/orient3d.js';\nexport {incircle, incirclefast} from './esm/incircle.js';\nexport {insphere, inspherefast} from './esm/insphere.js';\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from oritinal code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(8);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n finlen = sum(finlen, fin, alen, a, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n if (xtail === 0) {\n if (ytail === 0) {\n a[0] = 0;\n b[0] = 0;\n return 1;\n } else {\n negate = -ytail;\n s1 = negate * ax;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n } else {\n if (ytail === 0) {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n negate = -xtail;\n s1 = negate * by;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n } else {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ytail * ax;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n a[3] = u3;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = xtail * by;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n b[3] = u3;\n return 4;\n }\n }\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n s1 = a * b;\n c = splitter * a;\n ahi = c - (c - a);\n alo = a - ahi;\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n c = splitter * k;\n bhi = c - (c - k);\n blo = k - bhi;\n _i = s0 * k;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * k;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n if (z !== 0) {\n c = splitter * z;\n bhi = c - (c - z);\n blo = z - bhi;\n _i = s0 * z;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * z;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n }\n return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail;\n let adytail, bdytail, cdytail;\n let adztail, bdztail, cdztail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n scale(4, bc, adz, _8), _8,\n scale(4, ca, bdz, _8b), _8b, _16), _16,\n scale(4, ab, cdz, _8), _8, fin);\n\n let det = estimate(finlen, fin);\n let errbound = o3derrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n bvirt = az - adz;\n adztail = az - (adz + bvirt) + (bvirt - dz);\n bvirt = bz - bdz;\n bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n bvirt = cz - cdz;\n cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n adytail === 0 && bdytail === 0 && cdytail === 0 &&\n adztail === 0 && bdztail === 0 && cdztail === 0) {\n return det;\n }\n\n errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n det +=\n adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n if (adztail !== 0) {\n finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n }\n if (bdztail !== 0) {\n finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n }\n if (cdztail !== 0) {\n finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n }\n\n if (adxtail !== 0) {\n if (bdytail !== 0) {\n finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n }\n if (cdytail !== 0) {\n finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n }\n }\n if (bdxtail !== 0) {\n if (cdytail !== 0) {\n finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n }\n if (adytail !== 0) {\n finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n }\n }\n if (cdxtail !== 0) {\n if (adytail !== 0) {\n finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n }\n if (bdytail !== 0) {\n finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n\n const det =\n adz * (bdxcdy - cdxbdy) +\n bdz * (cdxady - adxcdy) +\n cdz * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n const errbound = o3derrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n\n return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n return adx * (bdy * cdz - bdz * cdy) +\n bdx * (cdy * adz - cdz * ady) +\n cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n finlen = sum(finlen, fin, a, alen, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n let abtlen, bctlen, catlen;\n let abttlen, bcttlen, cattlen;\n let n1, n0;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n sum(\n scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n sum(\n scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n sum(\n scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n let det = estimate(finlen, fin);\n let errbound = iccerrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n return det;\n }\n\n errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = adx * adx;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = ady * ady;\n c = splitter * ady;\n ahi = c - (c - ady);\n alo = ady - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n aa[3] = u3;\n }\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = bdx * bdx;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = bdy * bdy;\n c = splitter * bdy;\n ahi = c - (c - bdy);\n alo = bdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bb[3] = u3;\n }\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = cdx * cdx;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = cdy * cdy;\n c = splitter * cdy;\n ahi = c - (c - cdy);\n alo = cdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cc[3] = u3;\n }\n\n if (adxtail !== 0) {\n axtbclen = scale(4, bc, adxtail, axtbc);\n finlen = finadd(finlen, sum_three(\n scale(axtbclen, axtbc, 2 * adx, _16), _16,\n scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n }\n if (adytail !== 0) {\n aytbclen = scale(4, bc, adytail, aytbc);\n finlen = finadd(finlen, sum_three(\n scale(aytbclen, aytbc, 2 * ady, _16), _16,\n scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n }\n if (bdxtail !== 0) {\n bxtcalen = scale(4, ca, bdxtail, bxtca);\n finlen = finadd(finlen, sum_three(\n scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n }\n if (bdytail !== 0) {\n bytcalen = scale(4, ca, bdytail, bytca);\n finlen = finadd(finlen, sum_three(\n scale(bytcalen, bytca, 2 * bdy, _16), _16,\n scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n }\n if (cdxtail !== 0) {\n cxtablen = scale(4, ab, cdxtail, cxtab);\n finlen = finadd(finlen, sum_three(\n scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n }\n if (cdytail !== 0) {\n cytablen = scale(4, ab, cdytail, cytab);\n finlen = finadd(finlen, sum_three(\n scale(cytablen, cytab, 2 * cdy, _16), _16,\n scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n }\n\n if (adxtail !== 0 || adytail !== 0) {\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = bdxtail * cdy;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * cdytail;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n s1 = cdxtail * -bdy;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * -bdy;\n bhi = c - (c - -bdy);\n blo = -bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * -bdytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * -bdytail;\n bhi = c - (c - -bdytail);\n blo = -bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n bctlen = sum(4, u, 4, v, bct);\n s1 = bdxtail * cdytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdxtail * bdytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bctt[3] = u3;\n bcttlen = 4;\n } else {\n bct[0] = 0;\n bctlen = 1;\n bctt[0] = 0;\n bcttlen = 1;\n }\n if (adxtail !== 0) {\n const len = scale(bctlen, bct, adxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(axtbclen, axtbc, adxtail, _16), _16,\n scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * adx, _16), _16,\n scale(len2, _8, adxtail, _16b), _16b,\n scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n }\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n }\n }\n if (adytail !== 0) {\n const len = scale(bctlen, bct, adytail, _16c);\n finlen = finadd(finlen, sum(\n scale(aytbclen, aytbc, adytail, _16), _16,\n scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * ady, _16), _16,\n scale(len2, _8, adytail, _16b), _16b,\n scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n }\n }\n if (bdxtail !== 0 || bdytail !== 0) {\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = cdxtail * ady;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * adytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -cdy;\n n0 = -cdytail;\n s1 = adxtail * n1;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * n0;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n catlen = sum(4, u, 4, v, cat);\n s1 = cdxtail * adytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adxtail * cdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n catt[3] = u3;\n cattlen = 4;\n } else {\n cat[0] = 0;\n catlen = 1;\n catt[0] = 0;\n cattlen = 1;\n }\n if (bdxtail !== 0) {\n const len = scale(catlen, cat, bdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(bxtcalen, bxtca, bdxtail, _16), _16,\n scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdx, _16), _16,\n scale(len2, _8, bdxtail, _16b), _16b,\n scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n }\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n }\n }\n if (bdytail !== 0) {\n const len = scale(catlen, cat, bdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(bytcalen, bytca, bdytail, _16), _16,\n scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdy, _16), _16,\n scale(len2, _8, bdytail, _16b), _16b,\n scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);\n }\n }\n if (cdxtail !== 0 || cdytail !== 0) {\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = adxtail * bdy;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * bdytail;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -ady;\n n0 = -adytail;\n s1 = bdxtail * n1;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * n0;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n abtlen = sum(4, u, 4, v, abt);\n s1 = adxtail * bdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdxtail * adytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n abtt[3] = u3;\n abttlen = 4;\n } else {\n abt[0] = 0;\n abtlen = 1;\n abtt[0] = 0;\n abttlen = 1;\n }\n if (cdxtail !== 0) {\n const len = scale(abtlen, abt, cdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(cxtablen, cxtab, cdxtail, _16), _16,\n scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdx, _16), _16,\n scale(len2, _8, cdxtail, _16b), _16b,\n scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n }\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n }\n }\n if (cdytail !== 0) {\n const len = scale(abtlen, abt, cdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(cytablen, cytab, cdytail, _16), _16,\n scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdy, _16), _16,\n scale(len2, _8, cdytail, _16b), _16b,\n scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n const alift = adx * adx + ady * ady;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n const blift = bdx * bdx + bdy * bdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n const clift = cdx * cdx + cdy * cdy;\n\n const det =\n alift * (bdxcdy - cdxbdy) +\n blift * (cdxady - adxcdy) +\n clift * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n const errbound = iccerrboundA * permanent;\n\n if (det > errbound || -det > errbound) {\n return det;\n }\n return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const ady = ay - dy;\n const bdx = bx - dx;\n const bdy = by - dy;\n const cdx = cx - dx;\n const cdy = cy - dy;\n\n const abdet = adx * bdy - bdx * ady;\n const bcdet = bdx * cdy - cdx * bdy;\n const cadet = cdx * ady - adx * cdy;\n const alift = adx * adx + ady * ady;\n const blift = bdx * bdx + bdy * bdy;\n const clift = cdx * cdx + cdy * cdy;\n\n return alift * bcdet + blift * cadet + clift * abdet;\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale, negate} from './util.js';\n\nconst isperrboundA = (16 + 224 * epsilon) * epsilon;\nconst isperrboundB = (5 + 72 * epsilon) * epsilon;\nconst isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;\n\nconst ab = vec(4);\nconst bc = vec(4);\nconst cd = vec(4);\nconst de = vec(4);\nconst ea = vec(4);\nconst ac = vec(4);\nconst bd = vec(4);\nconst ce = vec(4);\nconst da = vec(4);\nconst eb = vec(4);\n\nconst abc = vec(24);\nconst bcd = vec(24);\nconst cde = vec(24);\nconst dea = vec(24);\nconst eab = vec(24);\nconst abd = vec(24);\nconst bce = vec(24);\nconst cda = vec(24);\nconst deb = vec(24);\nconst eac = vec(24);\n\nconst adet = vec(1152);\nconst bdet = vec(1152);\nconst cdet = vec(1152);\nconst ddet = vec(1152);\nconst edet = vec(1152);\nconst abdet = vec(2304);\nconst cddet = vec(2304);\nconst cdedet = vec(3456);\nconst deter = vec(5760);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _8c = vec(8);\nconst _16 = vec(16);\nconst _24 = vec(24);\nconst _48 = vec(48);\nconst _48b = vec(48);\nconst _96 = vec(96);\nconst _192 = vec(192);\nconst _384x = vec(384);\nconst _384y = vec(384);\nconst _384z = vec(384);\nconst _768 = vec(768);\n\nfunction sum_three_scale(a, b, c, az, bz, cz, out) {\n return sum_three(\n scale(4, a, az, _8), _8,\n scale(4, b, bz, _8b), _8b,\n scale(4, c, cz, _8c), _8c, _16, out);\n}\n\nfunction liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {\n const len = sum(\n sum(alen, a, blen, b, _48), _48,\n negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);\n\n return sum_three(\n scale(scale(len, _96, x, _192), _192, x, _384x), _384x,\n scale(scale(len, _96, y, _192), _192, y, _384y), _384y,\n scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);\n}\n\nfunction insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n s1 = ax * by;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ay;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n s1 = bx * cy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * by;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cx * dy;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * cy;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cd[3] = u3;\n s1 = dx * ey;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * dy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n de[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n de[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n de[2] = _j - (u3 - bvirt) + (_i - bvirt);\n de[3] = u3;\n s1 = ex * ay;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * ey;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ea[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ea[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ea[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ea[3] = u3;\n s1 = ax * cy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * ay;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ac[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ac[3] = u3;\n s1 = bx * dy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * by;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bd[3] = u3;\n s1 = cx * ey;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * cy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ce[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ce[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ce[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ce[3] = u3;\n s1 = dx * ay;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * dy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n da[2] = _j - (u3 - bvirt) + (_i - bvirt);\n da[3] = u3;\n s1 = ex * by;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ey;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n eb[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n eb[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n eb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n eb[3] = u3;\n\n const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);\n const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);\n const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);\n const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);\n const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);\n const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);\n const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);\n const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);\n const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);\n const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);\n\n const deterlen = sum_three(\n liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,\n liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,\n sum_three(\n liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,\n liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,\n liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);\n\n return deter[deterlen - 1];\n}\n\nconst xdet = vec(96);\nconst ydet = vec(96);\nconst zdet = vec(96);\nconst fin = vec(1152);\n\nfunction liftadapt(a, b, c, az, bz, cz, x, y, z, out) {\n const len = sum_three_scale(a, b, c, az, bz, cz, _24);\n return sum_three(\n scale(scale(len, _24, x, _48), _48, x, xdet), xdet,\n scale(scale(len, _24, y, _48), _48, y, ydet), ydet,\n scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);\n}\n\nfunction insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {\n let ab3, bc3, cd3, da3, ac3, bd3;\n\n let aextail, bextail, cextail, dextail;\n let aeytail, beytail, ceytail, deytail;\n let aeztail, beztail, ceztail, deztail;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;\n\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n s1 = aex * bey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bex * aey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ab3 = _j + _i;\n bvirt = ab3 - _j;\n ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);\n ab[3] = ab3;\n s1 = bex * cey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * bey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bc3 = _j + _i;\n bvirt = bc3 - _j;\n bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);\n bc[3] = bc3;\n s1 = cex * dey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * cey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n cd3 = _j + _i;\n bvirt = cd3 - _j;\n cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);\n cd[3] = cd3;\n s1 = dex * aey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = aex * dey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n da3 = _j + _i;\n bvirt = da3 - _j;\n da[2] = _j - (da3 - bvirt) + (_i - bvirt);\n da[3] = da3;\n s1 = aex * cey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * aey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ac3 = _j + _i;\n bvirt = ac3 - _j;\n ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);\n ac[3] = ac3;\n s1 = bex * dey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * bey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bd3 = _j + _i;\n bvirt = bd3 - _j;\n bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);\n bd[3] = bd3;\n\n const finlen = sum(\n sum(\n negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,\n liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,\n sum(\n negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,\n liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);\n\n let det = estimate(finlen, fin);\n let errbound = isperrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - aex;\n aextail = ax - (aex + bvirt) + (bvirt - ex);\n bvirt = ay - aey;\n aeytail = ay - (aey + bvirt) + (bvirt - ey);\n bvirt = az - aez;\n aeztail = az - (aez + bvirt) + (bvirt - ez);\n bvirt = bx - bex;\n bextail = bx - (bex + bvirt) + (bvirt - ex);\n bvirt = by - bey;\n beytail = by - (bey + bvirt) + (bvirt - ey);\n bvirt = bz - bez;\n beztail = bz - (bez + bvirt) + (bvirt - ez);\n bvirt = cx - cex;\n cextail = cx - (cex + bvirt) + (bvirt - ex);\n bvirt = cy - cey;\n ceytail = cy - (cey + bvirt) + (bvirt - ey);\n bvirt = cz - cez;\n ceztail = cz - (cez + bvirt) + (bvirt - ez);\n bvirt = dx - dex;\n dextail = dx - (dex + bvirt) + (bvirt - ex);\n bvirt = dy - dey;\n deytail = dy - (dey + bvirt) + (bvirt - ey);\n bvirt = dz - dez;\n deztail = dz - (dez + bvirt) + (bvirt - ez);\n if (aextail === 0 && aeytail === 0 && aeztail === 0 &&\n bextail === 0 && beytail === 0 && beztail === 0 &&\n cextail === 0 && ceytail === 0 && ceztail === 0 &&\n dextail === 0 && deytail === 0 && deztail === 0) {\n return det;\n }\n\n errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);\n\n const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);\n const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);\n const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);\n const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);\n const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);\n const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);\n det +=\n (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +\n (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *\n ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -\n ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +\n (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *\n ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +\n 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +\n (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -\n ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +\n (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);\n}\n\nexport function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const aexbey = aex * bey;\n const bexaey = bex * aey;\n const ab = aexbey - bexaey;\n const bexcey = bex * cey;\n const cexbey = cex * bey;\n const bc = bexcey - cexbey;\n const cexdey = cex * dey;\n const dexcey = dex * cey;\n const cd = cexdey - dexcey;\n const dexaey = dex * aey;\n const aexdey = aex * dey;\n const da = dexaey - aexdey;\n const aexcey = aex * cey;\n const cexaey = cex * aey;\n const ac = aexcey - cexaey;\n const bexdey = bex * dey;\n const dexbey = dex * bey;\n const bd = bexdey - dexbey;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n const det =\n (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +\n (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));\n\n const aezplus = Math.abs(aez);\n const bezplus = Math.abs(bez);\n const cezplus = Math.abs(cez);\n const dezplus = Math.abs(dez);\n const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);\n const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);\n const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);\n const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);\n const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);\n const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);\n const permanent =\n (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +\n (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +\n (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +\n (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;\n\n const errbound = isperrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);\n}\n\nexport function inspherefast(pax, pay, paz, pbx, pby, pbz, pcx, pcy, pcz, pdx, pdy, pdz, pex, pey, pez) {\n const aex = pax - pex;\n const bex = pbx - pex;\n const cex = pcx - pex;\n const dex = pdx - pex;\n const aey = pay - pey;\n const bey = pby - pey;\n const cey = pcy - pey;\n const dey = pdy - pey;\n const aez = paz - pez;\n const bez = pbz - pez;\n const cez = pcz - pez;\n const dez = pdz - pez;\n\n const ab = aex * bey - bex * aey;\n const bc = bex * cey - cex * bey;\n const cd = cex * dey - dex * cey;\n const da = dex * aey - aex * dey;\n const ac = aex * cey - cex * aey;\n const bd = bex * dey - dex * bey;\n\n const abc = aez * bc - bez * ac + cez * ab;\n const bcd = bez * cd - cez * bd + dez * bc;\n const cda = cez * da + dez * ac + aez * cd;\n const dab = dez * ab + aez * bd + bez * da;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);\n}\n","import {\n BBox,\n Feature,\n FeatureCollection,\n Geometry,\n GeometryCollection,\n GeometryObject,\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n Position,\n GeoJsonProperties,\n} from \"geojson\";\n\nimport { Id } from \"./lib/geojson.js\";\nexport * from \"./lib/geojson.js\";\n\n/**\n * @module helpers\n */\n\n// TurfJS Combined Types\nexport type Coord = Feature<Point> | Point | Position;\n\n/**\n * Linear measurement units.\n *\n * ⚠️ Warning. Be aware of the implications of using radian or degree units to\n * measure distance. The distance represented by a degree of longitude *varies*\n * depending on latitude.\n *\n * See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616\n * for an illustration of this behaviour.\n *\n * @typedef\n */\nexport type Units =\n | \"meters\"\n | \"metres\"\n | \"millimeters\"\n | \"millimetres\"\n | \"centimeters\"\n | \"centimetres\"\n | \"kilometers\"\n | \"kilometres\"\n | \"miles\"\n | \"nauticalmiles\"\n | \"inches\"\n | \"yards\"\n | \"feet\"\n | \"radians\"\n | \"degrees\";\n\n/**\n * Area measurement units.\n *\n * @typedef\n */\nexport type AreaUnits =\n | Exclude<Units, \"radians\" | \"degrees\">\n | \"acres\"\n | \"hectares\";\n\n/**\n * Grid types.\n *\n * @typedef\n */\nexport type Grid = \"point\" | \"square\" | \"hex\" | \"triangle\";\n\n/**\n * Shorthand corner identifiers.\n *\n * @typedef\n */\nexport type Corners = \"sw\" | \"se\" | \"nw\" | \"ne\" | \"center\" | \"centroid\";\n\n/**\n * Geometries made up of lines i.e. lines and polygons.\n *\n * @typedef\n */\nexport type Lines = LineString | MultiLineString | Polygon | MultiPolygon;\n\n/**\n * Convenience type for all possible GeoJSON.\n *\n * @typedef\n */\nexport type AllGeoJSON =\n | Feature\n | FeatureCollection\n | Geometry\n | GeometryCollection;\n\n/**\n * The Earth radius in kilometers. Used by Turf modules that model the Earth as a sphere. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius} was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended } by the Haversine formula (used by turf/distance) to reduce error.\n *\n * @constant\n */\nexport const earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors based on earthRadius.\n *\n * Keys are the name of the unit, values are the number of that unit in a single radian\n *\n * @constant\n */\nexport const factors: Record<Units, number> = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n\n/**\n\n * Area of measurement factors based on 1 square meter.\n *\n * @constant\n */\nexport const areaFactors: Record<AreaUnits, number> = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n nauticalmiles: 2.9155334959812285e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @function\n * @param {GeometryObject} geometry input geometry\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryObject, GeoJsonProperties>} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geom: G | null,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<G, P> {\n const feat: any = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @function\n * @param {(\"Point\" | \"LineString\" | \"Polygon\" | \"MultiPoint\" | \"MultiLineString\" | \"MultiPolygon\")} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(\n type:\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"MultiPoint\"\n | \"MultiLineString\"\n | \"MultiPolygon\",\n coordinates: any[],\n _options: Record<string, never> = {}\n) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @function\n * @param {Position} coordinates longitude, latitude position (each in decimal degrees)\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point, GeoJsonProperties>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Point, P> {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n const geom: Point = {\n type: \"Point\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @function\n * @param {Position[]} coordinates an array of Points\n * @param {GeoJsonProperties} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Point, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon, GeoJsonProperties>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Polygon, P> {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom: Polygon = {\n type: \"Polygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygon coordinates\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon, GeoJsonProperties>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Polygon, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString, GeoJsonProperties>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<LineString, P> {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom: LineString = {\n type: \"LineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString, GeoJsonProperties>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<LineString, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @function\n * @param {Array<Feature<GeometryObject, GeoJsonProperties>>} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection<GeometryObject, GeoJsonProperties>} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n features: Array<Feature<G, P>>,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<G, P> {\n const fc: any = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiLineString}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][]} coordinates an array of LineStrings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString, GeoJsonProperties>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiLineString, P> {\n const geom: MultiLineString = {\n type: \"MultiLineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPoint}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint, GeoJsonProperties>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPoint, P> {\n const geom: MultiPoint = {\n type: \"MultiPoint\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPolygon}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygons\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon, GeoJsonProperties>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPolygon, P> {\n const geom: MultiPolygon = {\n type: \"MultiPolygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a Feature<GeometryCollection> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Array<Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon>} geometries an array of GeoJSON Geometries\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection, GeoJsonProperties>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geometries: Array<\n Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon\n >,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<GeometryCollection, P> {\n const geom: GeometryCollection = {\n type: \"GeometryCollection\",\n geometries,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @function\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num: number, precision = 0): number {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} radians in radians across the sphere\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(\n radians: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(\n distance: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance: number, units?: Units): number {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing: number): number {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n\n/**\n * Converts any azimuth angle from the north line direction (positive clockwise)\n * and returns an angle between -180 and +180 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} angle between 0 and 360 degrees\n * @returns {number} bearing between -180 and +180 degrees\n */\nexport function azimuthToBearing(angle: number): number {\n // Ignore full revolutions (multiples of 360)\n angle = angle % 360;\n\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n\n return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @function\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians: number): number {\n // % (2 * Math.PI) radians in case someone passes value > 2π\n const normalisedRadians = radians % (2 * Math.PI);\n return (normalisedRadians * 180) / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @function\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees: number): number {\n // % 360 degrees in case someone passes value > 360\n const normalisedDegrees = degrees % 360;\n return (normalisedDegrees * Math.PI) / 180;\n}\n\n/**\n * Converts a length from one unit to another.\n *\n * @function\n * @param {number} length Length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] Input length unit\n * @param {Units} [finalUnit=\"kilometers\"] Returned length unit\n * @returns {number} The converted length\n */\nexport function convertLength(\n length: number,\n originalUnit: Units = \"kilometers\",\n finalUnit: Units = \"kilometers\"\n): number {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n\n/**\n * Converts an area from one unit to another.\n *\n * @function\n * @param {number} area Area to be converted\n * @param {AreaUnits} [originalUnit=\"meters\"] Input area unit\n * @param {AreaUnits} [finalUnit=\"kilometers\"] Returned area unit\n * @returns {number} The converted length\n */\nexport function convertArea(\n area: number,\n originalUnit: AreaUnits = \"meters\",\n finalUnit: AreaUnits = \"kilometers\"\n): number {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @function\n * @param {any} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num: any): boolean {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @function\n * @param {any} input variable to validate\n * @returns {boolean} true/false, including false for Arrays and Functions\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input: any): boolean {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {any} bbox BBox to validate\n * @returns {void}\n * @throws {Error} if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox: any): void {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {any} id Id to validate\n * @returns {void}\n * @throws {Error} if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id: any): void {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n","import pip from \"point-in-polygon-hao\";\nimport {\n BBox,\n Feature,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getGeom } from \"@turf/invariant\";\n\n// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule\n// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js\n// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n/**\n * Takes a {@link Point} and a {@link Polygon} or {@link MultiPolygon} and determines if the point\n * resides inside the polygon. The polygon can be convex or concave. The function accounts for holes.\n *\n * @function\n * @param {Coord} point input point\n * @param {Feature<Polygon|MultiPolygon>} polygon input polygon or multipolygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreBoundary=false] True if polygon boundary should be ignored when determining if\n * the point is inside the polygon otherwise false.\n * @returns {boolean} `true` if the Point is inside the Polygon; `false` if the Point is not inside the Polygon\n * @example\n * var pt = turf.point([-77, 44]);\n * var poly = turf.polygon([[\n * [-81, 41],\n * [-81, 47],\n * [-72, 47],\n * [-72, 41],\n * [-81, 41]\n * ]]);\n *\n * turf.booleanPointInPolygon(pt, poly);\n * //= true\n */\nfunction booleanPointInPolygon<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n point: Coord,\n polygon: Feature<G, P> | G,\n options: {\n ignoreBoundary?: boolean;\n } = {}\n) {\n // validation\n if (!point) {\n throw new Error(\"point is required\");\n }\n if (!polygon) {\n throw new Error(\"polygon is required\");\n }\n\n const pt = getCoord(point);\n const geom = getGeom(polygon);\n const type = geom.type;\n const bbox = polygon.bbox;\n let polys: any[] = geom.coordinates;\n\n // Quick elimination if point is not inside bbox\n if (bbox && inBBox(pt, bbox) === false) {\n return false;\n }\n\n if (type === \"Polygon\") {\n polys = [polys];\n }\n let result = false;\n for (var i = 0; i < polys.length; ++i) {\n const polyResult = pip(pt, polys[i]);\n if (polyResult === 0) return options.ignoreBoundary ? false : true;\n else if (polyResult) result = true;\n }\n\n return result;\n}\n\n/**\n * inBBox\n *\n * @private\n * @param {Position} pt point [x,y]\n * @param {BBox} bbox BBox [west, south, east, north]\n * @returns {boolean} true/false if point is inside BBox\n */\nfunction inBBox(pt: number[], bbox: BBox) {\n return (\n bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1]\n );\n}\n\nexport { booleanPointInPolygon };\nexport default booleanPointInPolygon;\n","class TinyQueue {\n constructor(data = [], compare = defaultCompare) {\n this.data = data;\n this.length = this.data.length;\n this.compare = compare;\n\n if (this.length > 0) {\n for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n }\n }\n\n push(item) {\n this.data.push(item);\n this.length++;\n this._up(this.length - 1);\n }\n\n pop() {\n if (this.length === 0) return undefined;\n\n const top = this.data[0];\n const bottom = this.data.pop();\n this.length--;\n\n if (this.length > 0) {\n this.data[0] = bottom;\n this._down(0);\n }\n\n return top;\n }\n\n peek() {\n return this.data[0];\n }\n\n _up(pos) {\n const {data, compare} = this;\n const item = data[pos];\n\n while (pos > 0) {\n const parent = (pos - 1) >> 1;\n const current = data[parent];\n if (compare(item, current) >= 0) break;\n data[pos] = current;\n pos = parent;\n }\n\n data[pos] = item;\n }\n\n _down(pos) {\n const {data, compare} = this;\n const halfLength = this.length >> 1;\n const item = data[pos];\n\n while (pos < halfLength) {\n let left = (pos << 1) + 1;\n let best = data[left];\n const right = left + 1;\n\n if (right < this.length && compare(data[right], best) < 0) {\n left = right;\n best = data[right];\n }\n if (compare(best, item) >= 0) break;\n\n data[pos] = best;\n pos = left;\n }\n\n data[pos] = item;\n }\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction checkWhichEventIsLeft (e1, e2) {\n if (e1.p.x > e2.p.x) return 1\n if (e1.p.x < e2.p.x) return -1\n\n if (e1.p.y !== e2.p.y) return e1.p.y > e2.p.y ? 1 : -1\n return 1\n}\n\nfunction checkWhichSegmentHasRightEndpointFirst (seg1, seg2) {\n if (seg1.rightSweepEvent.p.x > seg2.rightSweepEvent.p.x) return 1\n if (seg1.rightSweepEvent.p.x < seg2.rightSweepEvent.p.x) return -1\n\n if (seg1.rightSweepEvent.p.y !== seg2.rightSweepEvent.p.y) return seg1.rightSweepEvent.p.y < seg2.rightSweepEvent.p.y ? 1 : -1\n return 1\n}\n\nclass Event {\n\n constructor (p, featureId, ringId, eventId) {\n this.p = {\n x: p[0],\n y: p[1]\n };\n this.featureId = featureId;\n this.ringId = ringId;\n this.eventId = eventId;\n\n this.otherEvent = null;\n this.isLeftEndpoint = null;\n }\n\n isSamePoint (eventToCheck) {\n return this.p.x === eventToCheck.p.x && this.p.y === eventToCheck.p.y\n }\n}\n\nfunction fillEventQueue (geojson, eventQueue) {\n if (geojson.type === 'FeatureCollection') {\n const features = geojson.features;\n for (let i = 0; i < features.length; i++) {\n processFeature(features[i], eventQueue);\n }\n } else {\n processFeature(geojson, eventQueue);\n }\n}\n\nlet featureId = 0;\nlet ringId = 0;\nlet eventId = 0;\nfunction processFeature (featureOrGeometry, eventQueue) {\n const geom = featureOrGeometry.type === 'Feature' ? featureOrGeometry.geometry : featureOrGeometry;\n let coords = geom.coordinates;\n // standardise the input\n if (geom.type === 'Polygon' || geom.type === 'MultiLineString') coords = [coords];\n if (geom.type === 'LineString') coords = [[coords]];\n\n for (let i = 0; i < coords.length; i++) {\n for (let ii = 0; ii < coords[i].length; ii++) {\n let currentP = coords[i][ii][0];\n let nextP = null;\n ringId = ringId + 1;\n for (let iii = 0; iii < coords[i][ii].length - 1; iii++) {\n nextP = coords[i][ii][iii + 1];\n\n const e1 = new Event(currentP, featureId, ringId, eventId);\n const e2 = new Event(nextP, featureId, ringId, eventId + 1);\n\n e1.otherEvent = e2;\n e2.otherEvent = e1;\n\n if (checkWhichEventIsLeft(e1, e2) > 0) {\n e2.isLeftEndpoint = true;\n e1.isLeftEndpoint = false;\n } else {\n e1.isLeftEndpoint = true;\n e2.isLeftEndpoint = false;\n }\n eventQueue.push(e1);\n eventQueue.push(e2);\n\n currentP = nextP;\n eventId = eventId + 1;\n }\n }\n }\n featureId = featureId + 1;\n}\n\nclass Segment {\n\n constructor (event) {\n this.leftSweepEvent = event;\n this.rightSweepEvent = event.otherEvent;\n }\n}\n\nfunction testSegmentIntersect (seg1, seg2) {\n if (seg1 === null || seg2 === null) return false\n\n if (seg1.leftSweepEvent.ringId === seg2.leftSweepEvent.ringId &&\n (seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.rightSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.rightSweepEvent))) return false\n\n const x1 = seg1.leftSweepEvent.p.x;\n const y1 = seg1.leftSweepEvent.p.y;\n const x2 = seg1.rightSweepEvent.p.x;\n const y2 = seg1.rightSweepEvent.p.y;\n const x3 = seg2.leftSweepEvent.p.x;\n const y3 = seg2.leftSweepEvent.p.y;\n const x4 = seg2.rightSweepEvent.p.x;\n const y4 = seg2.rightSweepEvent.p.y;\n\n const denom = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));\n const numeA = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));\n const numeB = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3));\n\n if (denom === 0) {\n if (numeA === 0 && numeB === 0) return false\n return false\n }\n\n const uA = numeA / denom;\n const uB = numeB / denom;\n\n if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) {\n const x = x1 + (uA * (x2 - x1));\n const y = y1 + (uA * (y2 - y1));\n return [x, y]\n }\n return false\n}\n\n// import {debugEventAndSegments, debugRemovingSegment} from './debug'\n\nfunction runCheck (eventQueue, ignoreSelfIntersections) {\n ignoreSelfIntersections = ignoreSelfIntersections ? ignoreSelfIntersections : false;\n\n const intersectionPoints = [];\n const outQueue = new TinyQueue([], checkWhichSegmentHasRightEndpointFirst);\n\n while (eventQueue.length) {\n const event = eventQueue.pop();\n if (event.isLeftEndpoint) {\n // debugEventAndSegments(event.p, outQueue.data)\n const segment = new Segment(event);\n for (let i = 0; i < outQueue.data.length; i++) {\n const otherSeg = outQueue.data[i];\n if (ignoreSelfIntersections) {\n if (otherSeg.leftSweepEvent.featureId === event.featureId) continue\n }\n const intersection = testSegmentIntersect(segment, otherSeg);\n if (intersection !== false) intersectionPoints.push(intersection);\n }\n outQueue.push(segment);\n } else if (event.isLeftEndpoint === false) {\n outQueue.pop();\n // const seg = outQueue.pop()\n // debugRemovingSegment(event.p, seg)\n }\n }\n return intersectionPoints\n}\n\nfunction sweeplineIntersections (geojson, ignoreSelfIntersections) {\n const eventQueue = new TinyQueue([], checkWhichEventIsLeft);\n fillEventQueue(geojson, eventQueue);\n return runCheck(eventQueue, ignoreSelfIntersections)\n}\n\nexport default sweeplineIntersections;\n","import {\n Feature,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from \"geojson\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport { flattenEach } from \"@turf/meta\";\nimport { polygonToLine } from \"@turf/polygon-to-line\";\n\n/**\n * Boolean-disjoint returns (TRUE) if the intersection of the two geometries is an empty set.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreSelfIntersections=true] ignore self-intersections on input features\n * @returns {boolean} true if the intersection is an empty set, false otherwise\n * @example\n * var point = turf.point([2, 2]);\n * var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);\n *\n * turf.booleanDisjoint(line, point);\n * //=true\n */\nfunction booleanDisjoint(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n {\n ignoreSelfIntersections = true,\n }: {\n ignoreSelfIntersections?: boolean;\n } = { ignoreSelfIntersections: true }\n): boolean {\n let bool = true;\n flattenEach(feature1, (flatten1) => {\n flattenEach(feature2, (flatten2) => {\n if (bool === false) {\n return false;\n }\n bool = disjoint(\n flatten1.geometry,\n flatten2.geometry,\n ignoreSelfIntersections\n );\n });\n });\n return bool;\n}\n\n/**\n * Disjoint operation for simple Geometries (Point/LineString/Polygon)\n *\n * @private\n * @param {Geometry<any>} geom1 GeoJSON Geometry\n * @param {Geometry<any>} geom2 GeoJSON Geometry\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if disjoint, false otherwise\n */\nfunction disjoint(geom1: any, geom2: any, ignoreSelfIntersections: boolean) {\n switch (geom1.type) {\n case \"Point\":\n switch (geom2.type) {\n case \"Point\":\n return !compareCoords(geom1.coordinates, geom2.coordinates);\n case \"LineString\":\n return !isPointOnLine(geom2, geom1);\n case \"Polygon\":\n return !booleanPointInPolygon(geom1, geom2);\n }\n /* istanbul ignore next */\n break;\n case \"LineString\":\n switch (geom2.type) {\n case \"Point\":\n return !isPointOnLine(geom1, geom2);\n case \"LineString\":\n return !isLineOnLine(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isLineInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n /* istanbul ignore next */\n break;\n case \"Polygon\":\n switch (geom2.type) {\n case \"Point\":\n return !booleanPointInPolygon(geom2, geom1);\n case \"LineString\":\n return !isLineInPoly(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isPolyInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n }\n return false;\n}\n\n// http://stackoverflow.com/a/11908158/1979085\nfunction isPointOnLine(lineString: LineString, pt: Point) {\n for (let i = 0; i < lineString.coordinates.length - 1; i++) {\n if (\n isPointOnLineSegment(\n lineString.coordinates[i],\n lineString.coordinates[i + 1],\n pt.coordinates\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLineOnLine(\n lineString1: LineString,\n lineString2: LineString,\n ignoreSelfIntersections: boolean\n) {\n const doLinesIntersect = lineIntersect(lineString1, lineString2, {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isLineInPoly(\n polygon: Polygon,\n lineString: LineString,\n ignoreSelfIntersections: boolean\n) {\n for (const coord of lineString.coordinates) {\n if (booleanPointInPolygon(coord, polygon)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(lineString, polygonToLine(polygon), {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\n/**\n * Is Polygon (geom1) in Polygon (geom2)\n * Only takes into account outer rings\n * See http://stackoverflow.com/a/4833823/1979085\n *\n * @private\n * @param {Geometry|Feature<Polygon>} feature1 Polygon1\n * @param {Geometry|Feature<Polygon>} feature2 Polygon2\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if geom1 is in geom2, false otherwise\n */\nfunction isPolyInPoly(\n feature1: Polygon,\n feature2: Polygon,\n ignoreSelfIntersections: boolean\n) {\n for (const coord1 of feature1.coordinates[0]) {\n if (booleanPointInPolygon(coord1, feature2)) {\n return true;\n }\n }\n for (const coord2 of feature2.coordinates[0]) {\n if (booleanPointInPolygon(coord2, feature1)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(\n polygonToLine(feature1),\n polygonToLine(feature2),\n { ignoreSelfIntersections }\n );\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isPointOnLineSegment(\n lineSegmentStart: Position,\n lineSegmentEnd: Position,\n pt: Position\n) {\n const dxc = pt[0] - lineSegmentStart[0];\n const dyc = pt[1] - lineSegmentStart[1];\n const dxl = lineSegmentEnd[0] - lineSegmentStart[0];\n const dyl = lineSegmentEnd[1] - lineSegmentStart[1];\n const cross = dxc * dyl - dyc * dxl;\n if (cross !== 0) {\n return false;\n }\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n if (dxl > 0) {\n return lineSegmentStart[0] <= pt[0] && pt[0] <= lineSegmentEnd[0];\n } else {\n return lineSegmentEnd[0] <= pt[0] && pt[0] <= lineSegmentStart[0];\n }\n } else if (dyl > 0) {\n return lineSegmentStart[1] <= pt[1] && pt[1] <= lineSegmentEnd[1];\n } else {\n return lineSegmentEnd[1] <= pt[1] && pt[1] <= lineSegmentStart[1];\n }\n}\n\n/**\n * compareCoords\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {boolean} true if coord pairs match, false otherwise\n */\nfunction compareCoords(pair1: Position, pair2: Position) {\n return pair1[0] === pair2[0] && pair1[1] === pair2[1];\n}\n\nexport { booleanDisjoint };\nexport default booleanDisjoint;\n","import type {\n RasterTile,\n SpatialFilter,\n SpatialIndexTile,\n Tile,\n} from '../types.js';\nimport {tileFeaturesGeometries} from './tileFeaturesGeometries.js';\nimport {tileFeaturesSpatialIndex} from './tileFeaturesSpatialIndex.js';\nimport {TileFormat} from '../constants.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {RasterMetadata, SpatialDataType} from '../sources/types.js';\nimport {isRasterTile, tileFeaturesRaster} from './tileFeaturesRaster.js';\nimport {assert} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatures = {\n tiles: Tile[];\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n rasterMetadata?: RasterMetadata;\n storeGeometry?: boolean;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatureExtractOptions = {\n storeGeometry?: boolean;\n spatialDataType?: SpatialDataType;\n spatialDataColumn?: string;\n uniqueIdProperty?: string;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function tileFeatures({\n tiles,\n spatialFilter,\n uniqueIdProperty,\n tileFormat,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialDataType,\n rasterMetadata,\n storeGeometry = false,\n}: TileFeatures): FeatureData[] {\n if (spatialDataType === 'geo') {\n return tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options: {storeGeometry},\n });\n }\n\n if (tiles.some(isRasterTile)) {\n assert(rasterMetadata, 'Missing raster metadata');\n return tileFeaturesRaster({\n tiles: tiles as RasterTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n rasterMetadata,\n });\n }\n\n return tileFeaturesSpatialIndex({\n tiles: tiles as SpatialIndexTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n });\n}\n","import intersects from '@turf/boolean-intersects';\nimport {transformTileCoordsToWGS84} from '../utils/transformTileCoordsToWGS84.js';\nimport {TileFormat} from '../constants.js';\nimport type {\n BBox,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from 'geojson';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n BinaryAttribute,\n BinaryFeature,\n BinaryGeometryType,\n BinaryLineFeature,\n BinaryPointFeature,\n BinaryPolygonFeature,\n TypedArrayConstructor,\n} from '@loaders.gl/schema';\nimport {intersectTileGeometry} from './tileIntersection.js';\n\nexport const FEATURE_GEOM_PROPERTY = '__geomValue';\n\ntype TileMap = Map<unknown, unknown>;\n\ntype TileDataInternal = {\n uniqueId: string | number | undefined;\n properties: any;\n numericProps: Record<string, number>;\n};\n\ntype GeometryExtractOptions = {\n storeGeometry?: boolean;\n};\n\nexport function tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options,\n}: {\n tiles: Tile[];\n tileFormat?: TileFormat;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}): FeatureData[] {\n const map = new Map();\n\n for (const tile of tiles) {\n // Discard if it's not a visible tile (only check false value, not undefined)\n // or tile has not data\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n const tileBbox = [\n tile.bbox.west,\n tile.bbox.south,\n tile.bbox.east,\n tile.bbox.north,\n ] as BBox;\n\n const intersection = intersectTileGeometry(\n tileBbox,\n tileFormat,\n spatialFilter\n );\n\n if (intersection === false) continue;\n\n const transformedSpatialFilter =\n intersection === true ? undefined : intersection;\n\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.points!,\n type: 'Point',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.lines!,\n type: 'LineString',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.polygons!,\n type: 'Polygon',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n return Array.from(map.values());\n}\n\nfunction processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n}: {\n map: TileMap;\n data: BinaryFeature;\n startIndex: number;\n endIndex: number;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n storeGeometry: boolean;\n spatialFilter?: Geometry;\n}) {\n const tileProps = getPropertiesFromTile(data, startIndex);\n const uniquePropertyValue = getUniquePropertyValue(\n tileProps,\n uniqueIdProperty,\n map\n );\n\n if (!uniquePropertyValue || map.has(uniquePropertyValue)) {\n return;\n }\n let geometry: Geometry | null = null;\n\n // Only calculate geometry if necessary\n if (storeGeometry || spatialFilter) {\n const {positions} = data;\n const ringCoordinates = getRingCoordinatesFor(\n startIndex,\n endIndex,\n positions\n );\n geometry = getFeatureByType(ringCoordinates, type);\n }\n\n // If intersection is required, check before proceeding\n if (geometry && spatialFilter && !intersects(geometry, spatialFilter)) {\n return;\n }\n\n const properties = parseProperties(tileProps);\n\n // Only save geometry if necessary\n if (storeGeometry && geometry) {\n properties[FEATURE_GEOM_PROPERTY] =\n tileFormat === TileFormat.MVT\n ? transformTileCoordsToWGS84(geometry, bbox)\n : geometry;\n }\n map.set(uniquePropertyValue, properties);\n}\n\nfunction addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n spatialFilter: Geometry;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n });\n }\n}\n\n// Despite TypeScript, 'data.type' is OPTIONAL. So 'type' must be passed in\n// separately. Observed missing .type for Redshift tilesets, 2025-04-09.\nfunction getIndices(data: BinaryFeature, type: BinaryGeometryType) {\n let indices: BinaryAttribute;\n switch (type) {\n case 'Polygon':\n indices = (data as BinaryPolygonFeature).primitivePolygonIndices;\n break;\n case 'LineString':\n indices = (data as BinaryLineFeature).pathIndices;\n break;\n case 'Point':\n indices = createIndicesForPoints(data as BinaryPointFeature);\n break;\n default:\n throw new Error(\n `Unsupported geometry type: ${type as unknown as string}`\n );\n }\n return indices.value;\n}\n\nfunction getFeatureId(data: BinaryFeature, startIndex: number) {\n return data.featureIds.value[startIndex];\n}\n\nfunction getPropertiesFromTile(data: BinaryFeature, startIndex: number) {\n const featureId = getFeatureId(data, startIndex);\n const {properties, numericProps, fields} = data;\n const result: TileDataInternal = {\n uniqueId: (fields?.[featureId] as {id: string | number})?.id,\n properties: properties[featureId],\n numericProps: {},\n };\n\n for (const key in numericProps) {\n result.numericProps[key] = numericProps[key].value[startIndex];\n }\n\n return result;\n}\n\nfunction parseProperties(tileProps: TileDataInternal) {\n const {properties, numericProps} = tileProps;\n return Object.assign({}, properties, numericProps);\n}\n\nfunction getUniquePropertyValue(\n tileProps: TileDataInternal,\n uniqueIdProperty: string | undefined,\n map: TileMap\n) {\n if (uniqueIdProperty) {\n return getValueFromTileProps(tileProps, uniqueIdProperty);\n }\n\n if (tileProps.uniqueId) {\n return tileProps.uniqueId;\n }\n\n const artificialId = map.size + 1; // a counter, assumed as a valid new id\n return (\n getValueFromTileProps(tileProps, 'cartodb_id') ||\n getValueFromTileProps(tileProps, 'geoid') ||\n artificialId\n );\n}\n\nfunction getValueFromTileProps(\n tileProps: TileDataInternal,\n propertyName: string\n) {\n const {properties, numericProps} = tileProps;\n return numericProps[propertyName] || properties[propertyName];\n}\n\nfunction getFeatureByType(\n coordinates: Position[],\n type: BinaryGeometryType\n): Polygon | LineString | Point {\n switch (type) {\n case 'Polygon':\n return {type: 'Polygon', coordinates: [coordinates]};\n case 'LineString':\n return {type: 'LineString', coordinates};\n case 'Point':\n return {type: 'Point', coordinates: coordinates[0]};\n default:\n throw new Error('Invalid geometry type');\n }\n}\n\nfunction getRingCoordinatesFor(\n startIndex: number,\n endIndex: number,\n positions: BinaryAttribute\n) {\n const ringCoordinates = [];\n\n for (let j = startIndex; j < endIndex; j++) {\n ringCoordinates.push(\n Array.from(\n positions.value.subarray(j * positions.size, (j + 1) * positions.size)\n )\n );\n }\n\n return ringCoordinates;\n}\n\nfunction calculateFeatures({\n map,\n spatialFilter,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n spatialFilter?: SpatialFilter;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n if (!data?.properties.length) {\n return;\n }\n\n if (!spatialFilter) {\n addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n } else {\n addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n}\n\nfunction addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n });\n }\n}\n\n/**\n * BinaryPointFeature does not include indices, so we generate in-memory\n * indices to allow processing points similarly to other topologies.\n */\nfunction createIndicesForPoints(data: BinaryPointFeature): BinaryAttribute {\n const featureIds = data.featureIds.value;\n const lastFeatureId = featureIds[featureIds.length - 1];\n const PointIndicesArray = featureIds.constructor as TypedArrayConstructor;\n\n const pointIndices: BinaryAttribute = {\n value: new PointIndicesArray(featureIds.length + 1),\n size: 1,\n };\n pointIndices.value.set(featureIds);\n pointIndices.value.set([lastFeatureId + 1], featureIds.length);\n return pointIndices;\n}\n","import {lerp} from '@math.gl/core';\nimport {lngLatToWorld, worldToLngLat} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform tile coords to WGS84 coordinates.\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformTileCoordsToWGS84<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = lngLatToWorld([west, north]);\n const se = lngLatToWorld([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = lerp(nw[0], se[0], pointX);\n const y = lerp(nw[1], se[1], pointY);\n\n return worldToLngLat([x, y]);\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(g, bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n","// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// types\nexport type {\n TypedArray,\n TypedArrayConstructor,\n NumericArray,\n NumberArray,\n NumberArray2,\n NumberArray3,\n NumberArray4,\n NumberArray6,\n NumberArray8,\n NumberArray9,\n NumberArray12,\n NumberArray16\n} from '@math.gl/types';\n\nexport type {isTypedArray, isNumberArray, isNumericArray} from '@math.gl/types';\n\n// classes\nexport {Vector2} from './classes/vector2';\nexport {Vector3} from './classes/vector3';\nexport {Vector4} from './classes/vector4';\nexport {Matrix3} from './classes/matrix3';\nexport {Matrix4} from './classes/matrix4';\nexport {Quaternion} from './classes/quaternion';\n\nexport type {Vector2Like} from './classes/vector2';\nexport type {Vector3Like} from './classes/vector3';\nexport type {Vector4Like} from './classes/vector4';\nexport type {Matrix3Like} from './classes/matrix3';\nexport type {Matrix4Like} from './classes/matrix4';\n\n// experimental\nexport {SphericalCoordinates} from './classes/spherical-coordinates';\nexport {Pose} from './classes/pose';\nexport {Euler} from './classes/euler';\n\nexport * as _MathUtils from './lib/math-utils';\n\n// lib\nexport {assert} from './lib/assert';\n\nexport {\n // math.gl global utility methods\n config,\n configure,\n formatValue,\n isArray,\n clone,\n equals,\n exactEquals,\n toRadians,\n toDegrees,\n // math.gl \"GLSL\"-style functions\n radians,\n degrees,\n sin,\n cos,\n tan,\n asin,\n acos,\n atan,\n clamp,\n lerp,\n withEpsilon\n} from './lib/common';\n\n// DEPRECATED\nexport {SphericalCoordinates as _SphericalCoordinates} from './classes/spherical-coordinates';\nexport {Pose as _Pose} from './classes/pose';\nexport {Euler as _Euler} from './classes/euler';\n\n/** @deprecated Use Matrix3 */\nexport * as mat3 from './gl-matrix/mat3';\n/** @deprecated Use Matrix4 */\nexport * as mat4 from './gl-matrix/mat4';\n/** @deprecated Use Quaterinion */\nexport * as quat from './gl-matrix/quat';\n/** @deprecated UseVector */\nexport * as vec2 from './gl-matrix/vec2';\n/** @deprecated Use Vector3 */\nexport * as vec3 from './gl-matrix/vec3';\n/** @deprecated Use Vector4 */\nexport * as vec4 from './gl-matrix/vec4';\n","// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-shadow */ // radians and degrees are common variable names\n\nimport type {NumericArray} from '@math.gl/types';\n\nimport type {MathArray} from '../classes/base/math-array';\n\nconst RADIANS_TO_DEGREES = (1 / Math.PI) * 180;\nconst DEGREES_TO_RADIANS = (1 / 180) * Math.PI;\n\nexport type ConfigurationOptions = {\n EPSILON: number;\n debug?: boolean;\n precision: number;\n printTypes?: boolean;\n printDegrees?: boolean;\n printRowMajor?: boolean;\n _cartographicRadians?: boolean;\n};\n\nconst DEFAULT_CONFIG: Required<ConfigurationOptions> = {\n EPSILON: 1e-12,\n debug: false,\n precision: 4,\n printTypes: false,\n printDegrees: false,\n printRowMajor: true,\n _cartographicRadians: false\n};\n\n// We use a global field to store the config\ndeclare global {\n // eslint-disable-next-line no-var\n var mathgl: {\n config: Required<ConfigurationOptions>;\n };\n}\n\n// Configuration is truly global as of v3.6 to ensure single config even if multiple copies of math.gl\n// Multiple copies of config can be quite tricky to debug...\nglobalThis.mathgl = globalThis.mathgl || {config: {...DEFAULT_CONFIG}};\n\nexport const config = globalThis.mathgl.config;\n\nexport function configure(options: Partial<ConfigurationOptions>): ConfigurationOptions {\n // Only copy existing keys\n Object.assign(config, options);\n return config;\n}\n\n/**\n * Formats a value into a string\n * @param value\n * @param param1\n * @returns\n */\nexport function formatValue(\n value: number,\n {precision = config.precision}: {precision?: number} = {}\n): string {\n value = round(value);\n // get rid of trailing zeros\n return `${parseFloat(value.toPrecision(precision))}`;\n}\n\n/**\n * Check if value is an \"array\"\n * Returns `true` if value is either an array or a typed array\n * Note: returns `false` for `ArrayBuffer` and `DataView` instances\n * @note isTypedArray and isNumericArray are often more useful in TypeScript\n */\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value) || (ArrayBuffer.isView(value) && !(value instanceof DataView));\n}\n\nexport function clone(array: NumericArray | MathArray): NumericArray {\n return 'clone' in array ? array.clone() : array.slice();\n}\n\nexport function toRadians(degrees: number): number;\nexport function toRadians(degrees: NumericArray): NumericArray;\n\nexport function toRadians(degrees: number | NumericArray): number | NumericArray {\n return radians(degrees as NumericArray);\n}\n\nexport function toDegrees(degrees: number): number;\nexport function toDegrees(degrees: NumericArray): NumericArray;\n\nexport function toDegrees(radians: number | NumericArray): number | NumericArray {\n return degrees(radians as NumericArray);\n}\n\n// GLSL math function equivalents - Works on both single values and vectors\n\n/**\n * \"GLSL equivalent\" radians: Works on single values and vectors\n */\nexport function radians(degrees: number): number;\nexport function radians(degrees: NumericArray, result?: NumericArray): NumericArray;\n\nexport function radians(\n degrees: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(degrees, (degrees) => degrees * DEGREES_TO_RADIANS, result);\n}\n\n/**\n * \"GLSL equivalent\" degrees: Works on single values and vectors\n */\nexport function degrees(radians: number): number;\nexport function degrees(radians: NumericArray, result?: NumericArray): NumericArray;\n\nexport function degrees(\n radians: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(radians, (radians) => radians * RADIANS_TO_DEGREES, result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.sin`: Works on single values and vectors\n * @deprecated\n */\nexport function sin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.sin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.cos`: Works on single values and vectors\n * @deprecated\n */\nexport function cos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.cos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.tan`: Works on single values and vectors\n * @deprecated\n */\nexport function tan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.tan(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.asin`: Works on single values and vectors\n * @deprecated\n */\nexport function asin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.asin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.acos`: Works on single values and vectors\n * @deprecated\n */\nexport function acos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.acos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.atan`: Works on single values and vectors\n * @deprecated\n */\nexport function atan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.atan(angle), result);\n}\n\n/**\n * GLSL style value clamping: Works on single values and vectors\n */\nexport function clamp(value: number, min: number, max: number): number;\nexport function clamp(value: NumericArray, min: number, max: number): NumericArray;\n\nexport function clamp(\n value: number | NumericArray,\n min: number,\n max: number\n): number | NumericArray {\n return map(value, (value) => Math.max(min, Math.min(max, value)));\n}\n\n/**\n * Interpolate between two numbers or two arrays\n */\nexport function lerp(a: number, b: number, t: number): number;\nexport function lerp(a: NumericArray, b: NumericArray, t: number): NumericArray;\n\nexport function lerp(\n a: number | NumericArray,\n b: number | NumericArray,\n t: number\n): number | NumericArray {\n if (isArray(a)) {\n return (a as NumericArray).map((ai: number, i: number) => lerp(ai, (b as NumericArray)[i], t));\n }\n return t * (b as number) + (1 - t) * (a as number);\n}\n\n/* eslint-disable */\n\n/**\n * Compares any two math objects, using `equals` method if available.\n * @param a\n * @param b\n * @param epsilon\n * @returns\n */\nexport function equals(a: any, b: any, epsilon?: number): boolean {\n const oldEpsilon = config.EPSILON;\n if (epsilon) {\n config.EPSILON = epsilon;\n }\n try {\n if (a === b) {\n return true;\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n // eslint-disable-next-line max-depth\n if (!equals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n if (a && a.equals) {\n return a.equals(b);\n }\n if (b && b.equals) {\n return b.equals(a);\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.abs(a - b) <= config.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));\n }\n return false;\n } finally {\n config.EPSILON = oldEpsilon;\n }\n}\n\nexport function exactEquals(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n if (a && typeof a === 'object' && b && typeof b === 'object') {\n if (a.constructor !== b.constructor) {\n return false;\n }\n if (a.exactEquals) {\n return a.exactEquals(b);\n }\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (!exactEquals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\n/* eslint-enable */\n\nexport function withEpsilon<T>(epsilon: number, func: () => T): T {\n const oldPrecision = config.EPSILON;\n config.EPSILON = epsilon;\n let value: T;\n try {\n value = func();\n } finally {\n config.EPSILON = oldPrecision;\n }\n return value;\n}\n\n// HELPERS\n\nfunction round(value: number): number {\n return Math.round(value / config.EPSILON) * config.EPSILON;\n}\n\n// If the array has a clone function, calls it, otherwise returns a copy\nfunction duplicateArray(array: NumericArray): NumericArray {\n // @ts-expect-error We check for math.gl class methods\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return array.clone ? (array.clone() as NumericArray) : (new Array(array.length) as number[]);\n}\n\n// If the argument value is an array, applies the func element wise,\n// otherwise applies func to the argument value\nfunction map(\n value: number | NumericArray,\n func: (x: number, index?: number, resultArray?: NumericArray) => number,\n result?: NumericArray\n): number | NumericArray {\n if (isArray(value)) {\n const array = value as NumericArray;\n result = result || duplicateArray(array);\n for (let i = 0; i < result.length && i < array.length; ++i) {\n const val = typeof value === 'number' ? value : value[i];\n result[i] = func(val, i, result);\n }\n return result;\n }\n return func(value as number);\n}\n","// Classic web-mercator-project\nexport {WebMercatorViewport} from './web-mercator-viewport';\n\nexport {getBounds} from './get-bounds';\nexport {fitBounds} from './fit-bounds';\nexport {normalizeViewportProps} from './normalize-viewport-props';\nexport {flyToViewport, getFlyToDuration} from './fly-to-viewport';\n\nexport {\n MAX_LATITUDE,\n lngLatToWorld,\n worldToLngLat,\n worldToPixels,\n pixelsToWorld,\n zoomToScale,\n scaleToZoom,\n altitudeToFovy,\n fovyToAltitude,\n getMeterZoom,\n unitsPerMeter,\n getDistanceScales,\n addMetersToLngLat,\n getViewMatrix,\n getProjectionMatrix,\n getProjectionParameters\n} from './web-mercator-utils';\n\n/** Types */\nexport type {FitBoundsOptions} from './fit-bounds';\nexport type {DistanceScales} from './web-mercator-utils';\n\n/** @deprecated default export */\nexport {WebMercatorViewport as default} from './web-mercator-viewport';\n","// View and Projection Matrix calculations for mapbox-js style map view properties\nimport {createMat4} from './math-utils';\n\nimport {\n zoomToScale,\n pixelsToWorld,\n lngLatToWorld,\n worldToLngLat,\n worldToPixels,\n altitudeToFovy,\n fovyToAltitude,\n DEFAULT_ALTITUDE,\n getProjectionMatrix,\n getDistanceScales,\n getViewMatrix,\n DistanceScales\n} from './web-mercator-utils';\nimport {fitBounds} from './fit-bounds';\nimport {getBounds} from './get-bounds';\nimport type {FitBoundsOptions} from './fit-bounds';\n\nimport {mat4, vec2, vec3} from '@math.gl/core';\n\n/**\n * @param width=1 - Width of \"viewport\" or window\n * @param height=1 - Height of \"viewport\" or window\n * @param scale=1 - Either use scale or zoom\n * @param pitch=0 - Camera angle in degrees (0 is straight down)\n * @param bearing=0 - Map rotation in degrees (0 means north is up)\n * @param fovy= - Field of view of camera in degrees\n * @param altitude= - Altitude of camera in screen units \n *\n * Web mercator projection short-hand parameters\n * @param latitude - Center of viewport on map\n * @param longitude - Center of viewport on map\n * @param zoom - Scale = Math.pow(2,zoom) on map\n\n * Notes:\n * - Only one of center or [latitude, longitude] can be specified\n * - [latitude, longitude] can only be specified when \"mercator\" is true\n * - Altitude has a default value that matches assumptions in mapbox-gl\n * - Field of view is independent from altitude, provide `altitudeToFovy(1.5)` (default value) to match assumptions in mapbox-gl\n * - width and height are forced to 1 if supplied as 0, to avoid\n * division by zero. This is intended to reduce the burden of apps to\n * to check values before instantiating a Viewport.\n */\nexport type WebMercatorViewportProps = {\n // Map state\n width: number;\n height: number;\n latitude?: number;\n longitude?: number;\n position?: number[];\n zoom?: number;\n pitch?: number;\n bearing?: number;\n altitude?: number;\n fovy?: number;\n nearZMultiplier?: number;\n farZMultiplier?: number;\n};\n\n/**\n * The WebMercatorViewport class creates\n * - view/projection matrices\n * - \"uniform values\" (for shaders) from mercator params\n *\n * Note: Instances are immutable in the sense that they only have accessors.\n * A new viewport instance should be created if any parameters have changed.\n */\nexport class WebMercatorViewport {\n readonly latitude: number;\n readonly longitude: number;\n readonly zoom: number;\n readonly pitch: number;\n readonly bearing: number;\n readonly altitude: number;\n readonly fovy: number;\n\n readonly meterOffset: number[];\n readonly center: number[];\n\n readonly width: number;\n readonly height: number;\n readonly scale: number;\n readonly distanceScales: DistanceScales;\n\n readonly viewMatrix: number[];\n readonly projectionMatrix: number[];\n\n viewProjectionMatrix: number[];\n pixelProjectionMatrix: number[];\n pixelUnprojectionMatrix: number[];\n\n /**\n * @classdesc\n * Creates view/projection matrices from mercator params\n * Note: The Viewport is immutable in the sense that it only has accessors.\n * A new viewport instance should be created if any parameters have changed.\n */\n // eslint-disable-next-line max-statements\n constructor(props: WebMercatorViewportProps = {width: 1, height: 1}) {\n let {\n // Map state\n width,\n height,\n altitude = null,\n fovy = null\n } = props;\n const {\n latitude = 0,\n longitude = 0,\n zoom = 0,\n pitch = 0,\n bearing = 0,\n position = null,\n nearZMultiplier = 0.02,\n farZMultiplier = 1.01\n } = props;\n\n // Silently allow apps to send in 0,0 to facilitate isomorphic render etc\n width = width || 1;\n height = height || 1;\n\n // `fovy` & `altitude` are independent parameters, one for the\n // projection and the latter for the view matrix. In the past,\n // the `fovy` was always derived from the `altitude`\n if (fovy === null && altitude === null) {\n altitude = DEFAULT_ALTITUDE;\n fovy = altitudeToFovy(altitude);\n } else if (fovy === null) {\n fovy = altitudeToFovy(altitude);\n } else if (altitude === null) {\n altitude = fovyToAltitude(fovy);\n }\n\n const scale = zoomToScale(zoom);\n // Altitude - prevent division by 0\n // TODO - just throw an Error instead?\n altitude = Math.max(0.75, altitude);\n\n const distanceScales = getDistanceScales({longitude, latitude});\n\n const center: number[] = lngLatToWorld([longitude, latitude]);\n center.push(0);\n\n if (position) {\n vec3.add(center, center, vec3.mul([], position, distanceScales.unitsPerMeter));\n }\n\n this.projectionMatrix = getProjectionMatrix({\n width,\n height,\n scale,\n center,\n pitch,\n fovy,\n nearZMultiplier,\n farZMultiplier\n });\n\n this.viewMatrix = getViewMatrix({\n height,\n scale,\n center,\n pitch,\n bearing,\n altitude\n });\n\n // Save parameters\n this.width = width;\n this.height = height;\n this.scale = scale;\n\n this.latitude = latitude;\n this.longitude = longitude;\n this.zoom = zoom;\n this.pitch = pitch;\n this.bearing = bearing;\n this.altitude = altitude;\n this.fovy = fovy;\n this.center = center;\n this.meterOffset = position || [0, 0, 0];\n\n this.distanceScales = distanceScales;\n\n this._initMatrices();\n\n Object.freeze(this);\n }\n\n _initMatrices(): void {\n const {width, height, projectionMatrix, viewMatrix} = this;\n\n // Note: As usual, matrix operations should be applied in \"reverse\" order\n // since vectors will be multiplied in from the right during transformation\n const vpm = createMat4();\n mat4.multiply(vpm, vpm, projectionMatrix);\n mat4.multiply(vpm, vpm, viewMatrix);\n this.viewProjectionMatrix = vpm;\n\n // Calculate matrices and scales needed for projection\n /**\n * Builds matrices that converts preprojected lngLats to screen pixels\n * and vice versa.\n * Note: Currently returns bottom-left coordinates!\n * Note: Starts with the GL projection matrix and adds steps to the\n * scale and translate that matrix onto the window.\n * Note: WebGL controls clip space to screen projection with gl.viewport\n * and does not need this step.\n */\n const m = createMat4();\n\n // matrix for conversion from location to screen coordinates\n mat4.scale(m, m, [width / 2, -height / 2, 1]);\n mat4.translate(m, m, [1, -1, 0]);\n mat4.multiply(m, m, vpm);\n\n const mInverse = mat4.invert(createMat4(), m);\n if (!mInverse) {\n throw new Error('Pixel project matrix not invertible');\n }\n\n this.pixelProjectionMatrix = m;\n this.pixelUnprojectionMatrix = mInverse;\n }\n\n /** Two viewports are equal if width and height are identical, and if\n * their view and projection matrices are (approximately) equal.\n */\n equals = (viewport: WebMercatorViewport | null): boolean => {\n if (!(viewport instanceof WebMercatorViewport)) {\n return false;\n }\n\n return (\n viewport.width === this.width &&\n viewport.height === this.height &&\n mat4.equals(viewport.projectionMatrix, this.projectionMatrix) &&\n mat4.equals(viewport.viewMatrix, this.viewMatrix)\n );\n };\n\n /**\n * Projects xyz (possibly latitude and longitude) to pixel coordinates in window\n * using viewport projection parameters\n * - [longitude, latitude] to [x, y]\n * - [longitude, latitude, Z] => [x, y, z]\n * Note: By default, returns top-left coordinates for canvas/SVG type render\n *\n * @param lngLatZ - [lng, lat] or [lng, lat, Z]\n * @param options - options\n * @param options.topLeft=true - Whether projected coords are top left\n * @return - screen coordinates [x, y] or [x, y, z], z as pixel depth\n */\n project = (lngLatZ: number[], options: {topLeft?: boolean} = {}): number[] => {\n const {topLeft = true} = options;\n const worldPosition = this.projectPosition(lngLatZ);\n const coord = worldToPixels(worldPosition, this.pixelProjectionMatrix);\n\n const [x, y] = coord;\n const y2 = topLeft ? y : this.height - y;\n return lngLatZ.length === 2 ? [x, y2] : [x, y2, coord[2]];\n };\n\n /**\n * Unproject pixel coordinates on screen onto world coordinates, possibly `[lon, lat]` on map.\n *\n * - [x, y] => [lng, lat]\n * - [x, y, z] => [lng, lat, Z]\n *\n * @param xyz - screen coordinates, z as pixel depth\n * @param options - options\n * @param options.topLeft=true - Whether projected coords are top left\n * @param options.targetZ=0 - If pixel depth is unknown, targetZ is used as\n * the elevation plane to unproject onto\n * @return - [lng, lat, Z] or [X, Y, Z]\n */\n unproject = (xyz: number[], options: {topLeft?: boolean; targetZ?: number} = {}): number[] => {\n const {topLeft = true, targetZ = undefined} = options;\n const [x, y, z] = xyz;\n\n const y2 = topLeft ? y : this.height - y;\n const targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n const coord = pixelsToWorld([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n const [X, Y, Z] = this.unprojectPosition(coord);\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n return Number.isFinite(targetZ) ? [X, Y, targetZ] : [X, Y];\n };\n\n // NON_LINEAR PROJECTION HOOKS\n // Used for web meractor projection\n\n projectPosition = (xyz: number[]): [number, number, number] => {\n const [X, Y] = lngLatToWorld(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n return [X, Y, Z];\n };\n\n unprojectPosition = (xyz: number[]): [number, number, number] => {\n const [X, Y] = worldToLngLat(xyz);\n const Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n return [X, Y, Z];\n };\n\n /**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n *\n * @param lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return [x,y] coordinates.\n */\n projectFlat(lngLat: number[]): number[] {\n return lngLatToWorld(lngLat);\n }\n\n /**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n *\n * @param xy - array with [x,y] members\n * representing point on projected map plane\n * @return - array with [lat,lon] of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\n unprojectFlat(xy: number[]): number[] {\n return worldToLngLat(xy);\n }\n\n /**\n * Get the map center that place a given [lng, lat] coordinate at screen point [x, y]\n * @param opt\n * @param opt.lngLat - [lng,lat] coordinates\n * Specifies a point on the sphere.\n * @param opt.pos - [x,y] coordinates\n * Specifies a point on the screen.\n * @return [lng,lat] new map center.\n */\n getMapCenterByLngLatPosition({lngLat, pos}: {lngLat: number[]; pos: number[]}): number[] {\n const fromLocation = pixelsToWorld(pos, this.pixelUnprojectionMatrix);\n const toLocation = lngLatToWorld(lngLat);\n const translate = vec2.add([], toLocation, vec2.negate([], fromLocation));\n const newCenter = vec2.add([], this.center, translate);\n return worldToLngLat(newCenter);\n }\n\n /**\n * Returns a new viewport that fit around the given rectangle.\n * Only supports non-perspective mode.\n * @param bounds - [[lon, lat], [lon, lat]]\n * @param [options]\n * @param [options.padding] - The amount of padding in pixels to add to the given bounds.\n * @param [options.offset] - The center of the given bounds relative to the map's center,\n * [x, y] measured in pixels.\n * @returns {WebMercatorViewport}\n */\n fitBounds(\n bounds: [[number, number], [number, number]],\n options: Omit<FitBoundsOptions, 'width' | 'height' | 'bounds'> = {}\n ): WebMercatorViewport {\n const {width, height} = this;\n const {longitude, latitude, zoom} = fitBounds(Object.assign({width, height, bounds}, options));\n return new WebMercatorViewport({width, height, longitude, latitude, zoom});\n }\n\n /**\n * Returns the bounding box of the viewport.\n * @param [options]\n * @param [options.z] - The altitude at which the bounds should be calculated.\n * @returns {Array} bounds - [[lon, lat], [lon, lat]]\n */\n getBounds(options?: {z?: number}): number[][] {\n const corners = this.getBoundingRegion(options);\n\n const west = Math.min(...corners.map((p) => p[0]));\n const east = Math.max(...corners.map((p) => p[0]));\n const south = Math.min(...corners.map((p) => p[1]));\n const north = Math.max(...corners.map((p) => p[1]));\n return [\n [west, south],\n [east, north]\n ];\n }\n\n /**\n * Returns the bounding box of the viewport.\n * @param [options]\n * @param [options.z] - The altitude at which the bounds should be calculated.\n * @returns {Array} an array of 4 points that define the visible region\n */\n getBoundingRegion(options: {z?: number} = {}): number[][] {\n return getBounds(this, options.z || 0);\n }\n\n // DEPRECATED\n\n /** @deprecated Legacy method name */\n getLocationAtPoint({lngLat, pos}: {lngLat: number[]; pos: number[]}): number[] {\n return this.getMapCenterByLngLatPosition({lngLat, pos});\n }\n}\n","import {vec4} from '@math.gl/core';\n\n// Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()\nexport function createMat4(): number[] {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\n// Transforms a vec4 with a projection matrix\nexport function transformVector(matrix: number[], vector: number[]): number[] {\n const result = vec4.transformMat4([] as number[], vector, matrix);\n vec4.scale(result, result, 1 / result[3]);\n return result;\n}\n\nexport function mod(value: number, divisor: number): number {\n const modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\n\nexport function lerp(start: number, end: number, step: number): number {\n return step * end + (1 - step) * start;\n}\n\nexport function clamp(x: number, min: number, max: number): number {\n return x < min ? min : x > max ? max : x;\n}\n\nfunction ieLog2(x: number): number {\n return Math.log(x) * Math.LOG2E;\n}\n// Handle missing log2 in IE 11\nexport const log2 = Math.log2 || ieLog2;\n","// TODO - THE UTILITIES IN THIS FILE SHOULD BE IMPORTED FROM WEB-MERCATOR-VIEWPORT MODULE\n\nimport {createMat4, transformVector, clamp, log2} from './math-utils';\n\nimport {mat4, vec2, vec3} from '@math.gl/core';\nimport {assert} from './assert';\n\n// CONSTANTS\nconst PI = Math.PI;\nconst PI_4 = PI / 4;\nconst DEGREES_TO_RADIANS = PI / 180;\nconst RADIANS_TO_DEGREES = 180 / PI;\nconst TILE_SIZE = 512;\n// Average circumference (40075 km equatorial, 40007 km meridional)\nconst EARTH_CIRCUMFERENCE = 40.03e6;\n// Latitude that makes a square world, 2 * atan(E ** PI) - PI / 2\nexport const MAX_LATITUDE = 85.051129;\n\n// Mapbox default altitude\nexport const DEFAULT_ALTITUDE = 1.5;\n\nexport type DistanceScales = {\n unitsPerMeter: number[];\n metersPerUnit: number[];\n unitsPerMeter2?: number[];\n unitsPerDegree: number[];\n degreesPerUnit: number[];\n unitsPerDegree2?: number[];\n};\n\n/**\n * PROJECTION MATRIX PARAMETERS\n *\n * TODO how to document mebers\n * @param fov in radians. fov is variable, depends on pitch and altitude\n * @param aspect width/height\n * @param focalDistance distance at which visual scale factor is 1\n * @param near near clipping plane\n * @param far far clipping plane\n */\ntype ProjectionParameters = {\n fov: number;\n aspect: number;\n focalDistance: number;\n near: number;\n far: number;\n};\n\n/** Logarithimic zoom to linear scale **/\nexport function zoomToScale(zoom: number): number {\n return Math.pow(2, zoom);\n}\n\n/** Linear scale to logarithimic zoom **/\nexport function scaleToZoom(scale: number): number {\n return log2(scale);\n}\n\n/**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n *\n * @param lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return [x,y] coordinates.\n */\nexport function lngLatToWorld(lngLat: number[]): [number, number] {\n const [lng, lat] = lngLat;\n assert(Number.isFinite(lng));\n assert(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n\n const lambda2 = lng * DEGREES_TO_RADIANS;\n const phi2 = lat * DEGREES_TO_RADIANS;\n const x = (TILE_SIZE * (lambda2 + PI)) / (2 * PI);\n const y = (TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5)))) / (2 * PI);\n return [x, y];\n}\n\n/**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n *\n * @param xy - array with [x,y] members\n * representing point on projected map plane\n * @return - array with [x,y] of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\nexport function worldToLngLat(xy: number[]): [number, number] {\n const [x, y] = xy;\n const lambda2 = (x / TILE_SIZE) * (2 * PI) - PI;\n const phi2 = 2 * (Math.atan(Math.exp((y / TILE_SIZE) * (2 * PI) - PI)) - PI_4);\n return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\n\n/**\n * Returns the zoom level that gives a 1 meter pixel at a certain latitude\n * 1 = C*cos(y)/2^z/TILE_SIZE = C*cos(y)/2^(z+9)\n */\nexport function getMeterZoom(options: {latitude: number}): number {\n const {latitude} = options;\n assert(Number.isFinite(latitude));\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\n\n/**\n * Calculate the conversion from meter to common units at a given latitude\n * This is a cheaper version of `getDistanceScales`\n * @param latitude center latitude in degrees\n * @returns common units per meter\n */\nexport function unitsPerMeter(latitude: number): number {\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return TILE_SIZE / EARTH_CIRCUMFERENCE / latCosine;\n}\n\n/**\n * Calculate distance scales in meters around current lat/lon, both for\n * degrees and pixels.\n * In mercator projection mode, the distance scales vary significantly\n * with latitude.\n */\nexport function getDistanceScales(options: {\n latitude: number;\n longitude: number;\n highPrecision?: boolean;\n}): DistanceScales {\n const {latitude, longitude, highPrecision = false} = options;\n assert(Number.isFinite(latitude) && Number.isFinite(longitude));\n\n const worldSize = TILE_SIZE;\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n\n /**\n * Number of pixels occupied by one degree longitude around current lat/lon:\n unitsPerDegreeX = d(lngLatToWorld([lng, lat])[0])/d(lng)\n = scale * TILE_SIZE * DEGREES_TO_RADIANS / (2 * PI)\n unitsPerDegreeY = d(lngLatToWorld([lng, lat])[1])/d(lat)\n = -scale * TILE_SIZE * DEGREES_TO_RADIANS / cos(lat * DEGREES_TO_RADIANS) / (2 * PI)\n */\n const unitsPerDegreeX = worldSize / 360;\n const unitsPerDegreeY = unitsPerDegreeX / latCosine;\n\n /**\n * Number of pixels occupied by one meter around current lat/lon:\n */\n const altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n\n /**\n * LngLat: longitude -> east and latitude -> north (bottom left)\n * UTM meter offset: x -> east and y -> north (bottom left)\n * World space: x -> east and y -> south (top left)\n *\n * Y needs to be flipped when converting delta degree/meter to delta pixels\n */\n const result: DistanceScales = {\n unitsPerMeter: [altUnitsPerMeter, altUnitsPerMeter, altUnitsPerMeter],\n metersPerUnit: [1 / altUnitsPerMeter, 1 / altUnitsPerMeter, 1 / altUnitsPerMeter],\n\n unitsPerDegree: [unitsPerDegreeX, unitsPerDegreeY, altUnitsPerMeter],\n degreesPerUnit: [1 / unitsPerDegreeX, 1 / unitsPerDegreeY, 1 / altUnitsPerMeter]\n };\n\n /**\n * Taylor series 2nd order for 1/latCosine\n f'(a) * (x - a)\n = d(1/cos(lat * DEGREES_TO_RADIANS))/d(lat) * dLat\n = DEGREES_TO_RADIANS * tan(lat * DEGREES_TO_RADIANS) / cos(lat * DEGREES_TO_RADIANS) * dLat\n */\n if (highPrecision) {\n const latCosine2 = (DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS)) / latCosine;\n const unitsPerDegreeY2 = (unitsPerDegreeX * latCosine2) / 2;\n const altUnitsPerDegree2 = (worldSize / EARTH_CIRCUMFERENCE) * latCosine2;\n const altUnitsPerMeter2 = (altUnitsPerDegree2 / unitsPerDegreeY) * altUnitsPerMeter;\n\n result.unitsPerDegree2 = [0, unitsPerDegreeY2, altUnitsPerDegree2];\n result.unitsPerMeter2 = [altUnitsPerMeter2, 0, altUnitsPerMeter2];\n }\n\n // Main results, used for converting meters to latlng deltas and scaling offsets\n return result;\n}\n\n/**\n * Offset a lng/lat position by meterOffset (northing, easting)\n */\nexport function addMetersToLngLat(lngLatZ: number[], xyz: number[]): number[] {\n const [longitude, latitude, z0] = lngLatZ;\n const [x, y, z] = xyz;\n\n // eslint-disable-next-line no-shadow\n const {unitsPerMeter, unitsPerMeter2} = getDistanceScales({\n longitude,\n latitude,\n highPrecision: true\n });\n\n const worldspace = lngLatToWorld(lngLatZ);\n worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n\n const newLngLat = worldToLngLat(worldspace);\n const newZ = (z0 || 0) + (z || 0);\n\n return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\n\n/**\n *\n * view and projection matrix creation is intentionally kept compatible with\n * mapbox-gl's implementation to ensure that seamless interoperation\n * with mapbox and react-map-gl. See: https://github.com/mapbox/mapbox-gl-js\n */\nexport function getViewMatrix(options: {\n // Viewport props\n height: number;\n pitch: number;\n bearing: number;\n altitude: number;\n // Pre-calculated parameters\n scale: number;\n center?: number[];\n}): number[] {\n const {\n // Viewport props\n height,\n pitch,\n bearing,\n altitude,\n // Pre-calculated parameters\n scale,\n center\n } = options;\n // VIEW MATRIX: PROJECTS MERCATOR WORLD COORDINATES\n // Note that mercator world coordinates typically need to be flipped\n //\n // Note: As usual, matrix operation orders should be read in reverse\n // since vectors will be multiplied from the right during transformation\n const vm = createMat4();\n\n // Move camera to altitude (along the pitch & bearing direction)\n mat4.translate(vm, vm, [0, 0, -altitude]);\n\n // Rotate by bearing, and then by pitch (which tilts the view)\n mat4.rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n mat4.rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n\n const relativeScale = scale / height;\n mat4.scale(vm, vm, [relativeScale, relativeScale, relativeScale]);\n\n if (center) {\n mat4.translate(vm, vm, vec3.negate([], center));\n }\n\n return vm;\n}\n\n/**\n * Calculates mapbox compatible projection matrix from parameters\n *\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns project parameters object\n */\nexport function getProjectionParameters(options: {\n width: number;\n height: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n pitch?: number;\n nearZMultiplier?: number;\n farZMultiplier?: number;\n}): ProjectionParameters {\n const {\n width,\n height,\n altitude,\n pitch = 0,\n offset,\n center,\n scale,\n nearZMultiplier = 1,\n farZMultiplier = 1\n } = options;\n let {fovy = altitudeToFovy(DEFAULT_ALTITUDE)} = options;\n\n // For back-compatibility allow field of view to be\n // derived from altitude\n if (altitude !== undefined) {\n fovy = altitudeToFovy(altitude);\n }\n\n const fovRadians = fovy * DEGREES_TO_RADIANS;\n const pitchRadians = pitch * DEGREES_TO_RADIANS;\n\n // Distance from camera to the target\n const focalDistance = fovyToAltitude(fovy);\n\n let cameraToSeaLevelDistance = focalDistance;\n\n if (center) {\n cameraToSeaLevelDistance += (center[2] * scale) / Math.cos(pitchRadians) / height;\n }\n\n const fovAboveCenter = fovRadians * (0.5 + (offset ? offset[1] : 0) / height);\n\n // Find the distance from the center point to the center top\n // in focal distance units using law of sines.\n const topHalfSurfaceDistance =\n (Math.sin(fovAboveCenter) * cameraToSeaLevelDistance) /\n Math.sin(clamp(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));\n\n // Calculate z distance of the farthest fragment that should be rendered.\n const furthestDistance =\n Math.sin(pitchRadians) * topHalfSurfaceDistance + cameraToSeaLevelDistance;\n // Matches mapbox limit\n const horizonDistance = cameraToSeaLevelDistance * 10;\n\n // Calculate z value of the farthest fragment that should be rendered.\n const farZ = Math.min(furthestDistance * farZMultiplier, horizonDistance);\n\n return {\n fov: fovRadians,\n aspect: width / height,\n focalDistance,\n near: nearZMultiplier,\n far: farZ\n };\n}\n\n/**\n * CALCULATE PROJECTION MATRIX: PROJECTS FROM CAMERA (VIEW) SPACE TO CLIPSPACE\n *\n * To match mapbox's z buffer:\n * - \\<= 0.28: nearZMultiplier: 0.1, farZmultiplier: 1\n * - \\>= 0.29: nearZMultiplier: 1 / height, farZMultiplier: 1.01\n *\n * @param options Viewport options\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns 4x4 projection matrix\n */\nexport function getProjectionMatrix(options: {\n width: number;\n height: number;\n pitch: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n nearZMultiplier: number;\n farZMultiplier: number;\n}): number[] {\n const {fov, aspect, near, far} = getProjectionParameters(options);\n\n const projectionMatrix = mat4.perspective(\n [] as number[],\n fov, // fov in radians\n aspect, // aspect ratio\n near, // near plane\n far // far plane\n );\n\n return projectionMatrix;\n}\n\n/**\n *\n * Convert an altitude to field of view such that the\n * focal distance is equal to the altitude\n *\n * @param altitude - altitude of camera in screen units\n * @return fovy field of view in degrees\n */\nexport function altitudeToFovy(altitude: number): number {\n return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\n\n/**\n *\n * Convert an field of view such that the\n * focal distance is equal to the altitude\n *\n * @param fovy - field of view in degrees\n * @return altitude altitude of camera in screen units\n */\nexport function fovyToAltitude(fovy: number): number {\n return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\n\n/**\n * Project flat coordinates to pixels on screen.\n *\n * @param xyz - flat coordinate on 512*512 Mercator Zoom 0 tile\n * @param pixelProjectionMatrix - projection matrix 4x4\n * @return [x, y, depth] pixel coordinate on screen.\n */\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[];\n\n// Project flat coordinates to pixels on screen.\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[] {\n const [x, y, z = 0] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n\n return transformVector(pixelProjectionMatrix, [x, y, z, 1]);\n}\n\n/**\n * Unproject pixels on screen to flat coordinates.\n *\n * @param xyz - pixel coordinate on screen.\n * @param pixelUnprojectionMatrix - unprojection matrix 4x4\n * @param targetZ - if pixel coordinate does not have a 3rd component (depth),\n * targetZ is used as the elevation plane to unproject onto\n * @return [x, y, Z] flat coordinates on 512*512 Mercator Zoom 0 tile.\n */\nexport function pixelsToWorld(\n xyz: number[],\n pixelUnprojectionMatrix: number[],\n targetZ: number = 0\n): number[] {\n const [x, y, z] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n if (Number.isFinite(z)) {\n // Has depth component\n const coord = transformVector(pixelUnprojectionMatrix, [x, y, z, 1]);\n return coord;\n }\n\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that line with z=0\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, y, 0, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, y, 1, 1]);\n\n const z0 = coord0[2];\n const z1 = coord1[2];\n\n const t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n return vec2.lerp([] as number[], coord0, coord1, t);\n}\n","// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\nexport function assert(condition: unknown, message?: string): void {\n if (!condition) {\n throw new Error(message || '@math.gl/web-mercator: assertion failed.');\n }\n}\n","import {assert} from './assert';\nimport {log2, clamp} from './math-utils';\nimport {MAX_LATITUDE, lngLatToWorld, worldToLngLat} from './web-mercator-utils';\n\n/**\n * Options for fitBounds\n */\nexport type FitBoundsOptions = {\n /** viewport width */\n width: number;\n /** viewport height */\n height: number;\n /** [[lon, lat], [lon, lat]] */\n bounds: [[number, number], [number, number]];\n /** The width/height of the bounded area will never be smaller than this. 0.01 would be about 1000 meters (degree is ~110KM) */\n minExtent?: number;\n /** The maximum zoom level to fit the bounds within. */\n maxZoom?: number; // ~x4,000,000 => About 10 meter extents\n /**\n * padding - The amount of padding in pixels to add to the given bounds.\n * Can also be an object with top, bottom, left and right properties defining the padding.\n */\n padding?: number | Padding;\n /** The center of the given bounds relative to the map's center, */\n offset?: number[];\n};\n\n/**\n * An object describing the padding to add to the bounds.\n */\nexport type Padding = {\n /** Padding from top in pixels to add to the given bounds */\n top: number;\n /** Padding from bottom in pixels to add to the given bounds */\n bottom: number;\n /** Padding from left in pixels to add to the given bounds */\n left: number;\n /** Padding from right in pixels to add to the given bounds */\n right: number;\n};\n\ntype ViewportProps = {\n longitude: number;\n latitude: number;\n zoom: number;\n};\n\n/**\n * Returns map settings {latitude, longitude, zoom}\n * that will contain the provided corners within the provided width.\n *\n * > _Note: Only supports non-perspective mode._\n *\n * @param options fit bounds parameters\n * @returns - latitude, longitude and zoom\n */\nexport function fitBounds(options: FitBoundsOptions): ViewportProps {\n const {\n width,\n height,\n bounds,\n minExtent = 0, // 0.01 would be about 1000 meters (degree is ~110KM)\n maxZoom = 24, // ~x4,000,000 => About 10 meter extents\n offset = [0, 0]\n } = options;\n\n const [[west, south], [east, north]] = bounds;\n const padding = getPaddingObject(options.padding);\n\n const nw = lngLatToWorld([west, clamp(north, -MAX_LATITUDE, MAX_LATITUDE)]);\n const se = lngLatToWorld([east, clamp(south, -MAX_LATITUDE, MAX_LATITUDE)]);\n\n // width/height on the Web Mercator plane\n const size = [\n Math.max(Math.abs(se[0] - nw[0]), minExtent),\n Math.max(Math.abs(se[1] - nw[1]), minExtent)\n ];\n\n const targetSize = [\n width - padding.left - padding.right - Math.abs(offset[0]) * 2,\n height - padding.top - padding.bottom - Math.abs(offset[1]) * 2\n ];\n\n assert(targetSize[0] > 0 && targetSize[1] > 0);\n\n // scale = screen pixels per unit on the Web Mercator plane\n const scaleX = targetSize[0] / size[0];\n const scaleY = targetSize[1] / size[1];\n\n // Find how much we need to shift the center\n const offsetX = (padding.right - padding.left) / 2 / scaleX;\n const offsetY = (padding.top - padding.bottom) / 2 / scaleY;\n\n const center = [(se[0] + nw[0]) / 2 + offsetX, (se[1] + nw[1]) / 2 + offsetY];\n\n const centerLngLat = worldToLngLat(center);\n const zoom = Math.min(maxZoom, log2(Math.abs(Math.min(scaleX, scaleY))));\n\n assert(Number.isFinite(zoom));\n\n return {\n longitude: centerLngLat[0],\n latitude: centerLngLat[1],\n zoom\n };\n}\n\n// Helpers\nfunction getPaddingObject(padding: number | Padding = 0): Padding {\n if (typeof padding === 'number') {\n return {\n top: padding,\n bottom: padding,\n left: padding,\n right: padding\n };\n }\n\n // Make sure all the required properties are set\n assert(\n Number.isFinite(padding.top) &&\n Number.isFinite(padding.bottom) &&\n Number.isFinite(padding.left) &&\n Number.isFinite(padding.right)\n );\n\n return padding;\n}\n","/* eslint-disable camelcase */\nimport {vec2} from '@math.gl/core';\nimport type {WebMercatorViewport} from './web-mercator-viewport';\nimport {worldToLngLat} from './web-mercator-utils';\nimport {transformVector} from './math-utils';\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\n/*\n * Returns the quad at the intersection of the frustum and the given z plane\n * @param {WebMercatorViewport} viewport\n * @param {Number} z - elevation in meters\n */\nexport function getBounds(viewport: WebMercatorViewport, z: number = 0): number[][] {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {width, height, unproject} = viewport;\n const unprojectOps = {targetZ: z};\n const bottomLeft = unproject([0, height], unprojectOps);\n const bottomRight = unproject([width, height], unprojectOps);\n let topLeft: number[];\n let topRight: number[];\n\n const halfFov = viewport.fovy\n ? 0.5 * viewport.fovy * DEGREES_TO_RADIANS\n : Math.atan(0.5 / viewport.altitude);\n const angleToGround = (90 - viewport.pitch) * DEGREES_TO_RADIANS;\n // The top plane is parallel to the ground if halfFov == angleToGround\n if (halfFov > angleToGround - 0.01) {\n // intersect with the far plane\n topLeft = unprojectOnFarPlane(viewport, 0, z);\n topRight = unprojectOnFarPlane(viewport, width, z);\n } else {\n // intersect with the top plane\n topLeft = unproject([0, 0], unprojectOps);\n topRight = unproject([width, 0], unprojectOps);\n }\n\n return [bottomLeft, bottomRight, topRight, topLeft];\n}\n\n/*\n * Find a point on the far clipping plane of the viewport\n * @param {WebMercatorViewport} viewport\n * @param {Number} x - projected x in screen space\n * @param {Number} targetZ - the elevation of the point in meters\n */\nfunction unprojectOnFarPlane(viewport: WebMercatorViewport, x: number, targetZ: number): number[] {\n const {pixelUnprojectionMatrix} = viewport;\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, 0, 1, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, viewport.height, 1, 1]);\n\n const z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n const t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n const coord = vec2.lerp([], coord0, coord1, t);\n\n const result = worldToLngLat(coord);\n result.push(targetZ);\n return result;\n}\n","import {worldToLngLat} from './web-mercator-utils';\nimport {mod, log2} from './math-utils';\n\n// defined by mapbox-gl\nconst TILE_SIZE = 512;\n\n/** Description of viewport */\nexport type ViewportProps = {\n width: number;\n height: number;\n longitude: number;\n latitude: number;\n zoom: number;\n pitch?: number;\n bearing?: number;\n};\n\n/**\n * Apply mathematical constraints to viewport props\n * @param props\n */\n// eslint-disable-next-line complexity\nexport function normalizeViewportProps(props: ViewportProps): ViewportProps {\n const {width, height, pitch = 0} = props;\n let {longitude, latitude, zoom, bearing = 0} = props;\n\n // Normalize degrees\n if (longitude < -180 || longitude > 180) {\n longitude = mod(longitude + 180, 360) - 180;\n }\n if (bearing < -180 || bearing > 180) {\n bearing = mod(bearing + 180, 360) - 180;\n }\n\n // Constrain zoom and shift center at low zoom levels\n const minZoom = log2(height / TILE_SIZE);\n if (zoom <= minZoom) {\n zoom = minZoom;\n latitude = 0;\n } else {\n // Eliminate white space above and below the map\n const halfHeightPixels = height / 2 / Math.pow(2, zoom);\n const minLatitude = worldToLngLat([0, halfHeightPixels])[1];\n if (latitude < minLatitude) {\n latitude = minLatitude;\n } else {\n const maxLatitude = worldToLngLat([0, TILE_SIZE - halfHeightPixels])[1];\n if (latitude > maxLatitude) {\n latitude = maxLatitude;\n }\n }\n }\n\n return {width, height, longitude, latitude, zoom, pitch, bearing};\n}\n","import {lerp} from './math-utils';\nimport {scaleToZoom, zoomToScale, lngLatToWorld, worldToLngLat} from './web-mercator-utils';\nimport {vec2} from '@math.gl/core';\n\nimport type {ViewportProps} from './normalize-viewport-props';\n\nconst EPSILON = 0.01;\nconst VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom'] as const;\nconst DEFAULT_OPTS = {\n curve: 1.414,\n speed: 1.2\n // screenSpeed and maxDuration are used only if specified\n};\n\nexport type FlytoTransitionOptions = {\n curve?: number;\n speed?: number;\n screenSpeed?: number;\n maxDuration?: number;\n};\n\n/**\n * mapbox-gl-js flyTo : https://www.mapbox.com/mapbox-gl-js/api/#map#flyto.\n * It implements “Smooth and efficient zooming and panning.” algorithm by\n * \"Jarke J. van Wijk and Wim A.A. Nuij\"\n */\nexport function flyToViewport(\n startProps: ViewportProps,\n endProps: ViewportProps,\n t: number,\n options?: FlytoTransitionOptions\n): {\n longitude: number;\n latitude: number;\n zoom: number;\n} {\n // Equations from above paper are referred where needed.\n\n const {startZoom, startCenterXY, uDelta, w0, u1, S, rho, rho2, r0} = getFlyToTransitionParams(\n startProps,\n endProps,\n options\n );\n\n // If change in center is too small, do linear interpolaiton.\n if (u1 < EPSILON) {\n const viewport = {};\n for (const key of VIEWPORT_TRANSITION_PROPS) {\n const startValue = startProps[key];\n const endValue = endProps[key];\n // @ts-ignore-error properties are populated dynamically\n viewport[key] = lerp(startValue, endValue, t);\n }\n // @ts-expect-error properties are populated dynamically\n return viewport;\n }\n\n const s = t * S;\n\n const w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n const u = (w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2)) / u1;\n\n const scaleIncrement = 1 / w; // Using w method for scaling.\n const newZoom = startZoom + scaleToZoom(scaleIncrement);\n\n const newCenterWorld = vec2.scale([], uDelta, u);\n vec2.add(newCenterWorld, newCenterWorld, startCenterXY);\n\n const newCenter = worldToLngLat(newCenterWorld);\n return {\n longitude: newCenter[0],\n latitude: newCenter[1],\n zoom: newZoom\n };\n}\n\n// returns transition duration in milliseconds\nexport function getFlyToDuration(\n startProps: ViewportProps,\n endProps: ViewportProps,\n options?: FlytoTransitionOptions\n): number {\n const opts = {...DEFAULT_OPTS, ...options};\n const {screenSpeed, speed, maxDuration} = opts;\n const {S, rho} = getFlyToTransitionParams(startProps, endProps, opts);\n const length = 1000 * S;\n let duration: number;\n if (Number.isFinite(screenSpeed)) {\n duration = length / (screenSpeed / rho);\n } else {\n duration = length / speed;\n }\n\n return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\n\n// Private Methods\n\n// Calculate all parameters that are static for given startProps and endProps\nfunction getFlyToTransitionParams(\n startProps: ViewportProps,\n endProps: ViewportProps,\n opts: FlytoTransitionOptions\n): {\n startZoom: number;\n startCenterXY: number[];\n uDelta: number[];\n w0: number;\n u1: number;\n S: number;\n rho: number;\n rho2: number;\n r0: number;\n r1: number;\n} {\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n const rho = opts.curve;\n const startZoom = startProps.zoom;\n const startCenter = [startProps.longitude, startProps.latitude];\n const startScale = zoomToScale(startZoom);\n const endZoom = endProps.zoom;\n const endCenter = [endProps.longitude, endProps.latitude];\n const scale = zoomToScale(endZoom - startZoom);\n\n const startCenterXY = lngLatToWorld(startCenter);\n const endCenterXY = lngLatToWorld(endCenter);\n const uDelta = vec2.sub([] as number[], endCenterXY, startCenterXY);\n\n const w0 = Math.max(startProps.width, startProps.height);\n const w1 = w0 / scale;\n const u1 = vec2.length(uDelta) * startScale;\n // u0 is treated as '0' in Eq (9).\n\n // If u1 is too small, will generate invalid number\n const _u1 = Math.max(u1, EPSILON);\n\n // Implement Equation (9) from above algorithm.\n const rho2 = rho * rho;\n const b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * _u1 * _u1) / (2 * w0 * rho2 * _u1);\n const b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * _u1 * _u1) / (2 * w1 * rho2 * _u1);\n const r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n const r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n const S = (r1 - r0) / rho;\n\n return {startZoom, startCenterXY, uDelta, w0, u1, S, rho, rho2, r0, r1};\n}\n","import type {BBox} from 'geojson';\nimport type {SpatialFilter} from '../types.js';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport booleanWithin from '@turf/boolean-within';\nimport intersect from '@turf/intersect';\nimport {feature, featureCollection} from '@turf/helpers';\nimport {TileFormat} from '../constants.js';\nimport {transformToTileCoords} from '../utils/transformToTileCoords.js';\nimport {\n cellToBoundary as quadbinCellToBoundary,\n geometryToCells as quadbinGeometryToCells,\n} from 'quadbin';\nimport {polygonToCells as h3PolygonToCells} from 'h3-js';\nimport bboxClip from '@turf/bbox-clip';\n\n// Computes intersections between spatial filters and tiles in various formats,\n// for pre-filtering each tile's features before performing widget calculations.\n//\n// Return types:\n// - true: All features in tile are within spatial filter.\n// - false: No features in tile are within spatial filter; skip tile.\n// - SpatialFilter/Set: Requires a more detailed per-feature check for each\n// feature in the tile. Provides a clipped spatial filter local to the tile\n// or, for spatial indexes, a set of indices (\"covering set\").\n//\n// Computing a covering set for spatial indexes may be very expensive for large\n// spatial filters and small cell resolutions. For example, a viewport at z=3\n// would contain ~18,000,000 raster cells at resolution=14. To avoid ever\n// creating a covering set of this size, compute per-tile (not global) coverings\n// when possible. For tiles fully inside or outside the spatial filter, creating\n// a covering set can be skipped.\n//\n// H3 is currently a special case where coverage must be computed for the entire\n// spatial filter; per-tile coverage would return a different result, because\n// H3 child cells are not fully contained within their parents.\n\n///////////////////////////////////////////////////////////////////////////////\n// GEOMETRY\n\n/** @internal */\nexport function intersectTileGeometry(\n tileBbox: BBox,\n tileFormat?: TileFormat,\n spatialFilter?: SpatialFilter\n): boolean | SpatialFilter {\n const tilePolygon = bboxPolygon(tileBbox);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([tilePolygon, feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n // Transform into local coordinates [0..1]. We assume MVT tiles use local\n // coordinates but geojson or binary features are already WGS84.\n return tileFormat === TileFormat.MVT\n ? transformToTileCoords(clippedSpatialFilter.geometry, tileBbox)\n : clippedSpatialFilter.geometry;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// RASTER\n\n/** @internal */\nexport function intersectTileRaster(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n) {\n return intersectTileQuadbin(parent, cellResolution, spatialFilter);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// QUADBIN\n\n/** @internal */\nexport function intersectTileQuadbin(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n): boolean | Set<bigint> {\n const tilePolygon = quadbinCellToBoundary(parent);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([feature(tilePolygon), feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n const cells = quadbinGeometryToCells(\n clippedSpatialFilter.geometry,\n cellResolution\n );\n\n return new Set(cells);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// H3\n\nconst BBOX_WEST: BBox = [-180, -90, 0, 90];\nconst BBOX_EAST: BBox = [0, -90, 180, 90];\n\n/** @internal */\nexport function intersectTileH3(\n cellResolution: number,\n spatialFilter?: SpatialFilter\n): true | Set<string> {\n if (!spatialFilter) {\n return true;\n }\n\n // Unlike quadbin and raster tiles, H3 children do not align to the parent's\n // boundaries. Per-tile coverage with `h3PolygonToCells` would return only\n // cells with _centers_ inside the clipped polygon — fewer cells. So for H3\n // we compute the coverage set for the entire spatial filter (more expensive).\n // In the future this could be replaced with `polygonToCellsExperimental`,\n // which can compute child cells in different modes.\n\n const spatialFilterFeature = feature(spatialFilter);\n\n // The current H3 polyfill algorithm can't deal with polygon segments of greater than 180 degrees longitude\n // so we clip the geometry to be sure that none of them is greater than 180 degrees\n // https://github.com/uber/h3-js/issues/24#issuecomment-431893796\n\n const cellsWest = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_WEST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n const cellsEast = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_EAST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n return new Set(cellsWest.concat(cellsEast));\n}\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(\n geojson: AllGeoJSON,\n options: {\n recompute?: boolean;\n } = {}\n): BBox {\n if (geojson.bbox != null && true !== options.recompute) {\n return geojson.bbox;\n }\n const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, (coord) => {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nexport { bbox };\nexport default bbox;\n","/*\r\n * bignumber.js v9.1.2\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2022 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n }\r\n\r\n // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // THe index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL; rem[remL++] = 0);\r\n yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne;\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[LOG_BASE - i];\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[0] += k;\r\n for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\r\n };\r\n\r\n\r\n /*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\r\n };\r\n\r\n\r\n /*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\r\n /*\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(x));\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","import BigNumber from \"bignumber.js\";\nimport { Bbox } from \"./bbox.js\";\nimport { precision } from \"./precision.js\";\nimport Segment from \"./segment.js\";\nimport { Point } from \"./sweep-event.js\";\n\nexport type Ring = [number, number][]\nexport type Poly = Ring[]\nexport type MultiPoly = Poly[]\nexport type Geom = Poly | MultiPoly\n\nexport class RingIn {\n poly: PolyIn\n isExterior: boolean\n segments: Segment[]\n bbox: Bbox\n\n constructor(geomRing: Ring, poly: PolyIn, isExterior: boolean) {\n if (!Array.isArray(geomRing) || geomRing.length === 0) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n this.poly = poly\n this.isExterior = isExterior\n this.segments = []\n\n if (\n typeof geomRing[0][0] !== \"number\" ||\n typeof geomRing[0][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n const firstPoint = precision.snap({ x: new BigNumber(geomRing[0][0]), y: new BigNumber(geomRing[0][1]) }) as Point\n this.bbox = {\n ll: { x: firstPoint.x, y: firstPoint.y },\n ur: { x: firstPoint.x, y: firstPoint.y },\n }\n\n let prevPoint = firstPoint\n for (let i = 1, iMax = geomRing.length; i < iMax; i++) {\n if (\n typeof geomRing[i][0] !== \"number\" ||\n typeof geomRing[i][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n const point = precision.snap({ x: new BigNumber(geomRing[i][0]), y: new BigNumber(geomRing[i][1]) }) as Point\n // skip repeated points\n if (point.x.eq(prevPoint.x) && point.y.eq(prevPoint.y)) continue\n this.segments.push(Segment.fromRing(prevPoint, point, this))\n if (point.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = point.x\n if (point.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = point.y\n if (point.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = point.x\n if (point.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = point.y\n prevPoint = point\n }\n // add segment from last to first if last is not the same as first\n if (!firstPoint.x.eq(prevPoint.x) || !firstPoint.y.eq(prevPoint.y)) {\n this.segments.push(Segment.fromRing(prevPoint, firstPoint, this))\n }\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.segments.length; i < iMax; i++) {\n const segment = this.segments[i]\n sweepEvents.push(segment.leftSE)\n sweepEvents.push(segment.rightSE)\n }\n return sweepEvents\n }\n}\n\nexport class PolyIn {\n multiPoly: MultiPolyIn\n exteriorRing: RingIn\n interiorRings: RingIn[]\n bbox: Bbox\n\n constructor(geomPoly: Poly, multiPoly: MultiPolyIn) {\n if (!Array.isArray(geomPoly)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n this.exteriorRing = new RingIn(geomPoly[0], this, true)\n // copy by value\n this.bbox = {\n ll: { x: this.exteriorRing.bbox.ll.x, y: this.exteriorRing.bbox.ll.y },\n ur: { x: this.exteriorRing.bbox.ur.x, y: this.exteriorRing.bbox.ur.y },\n }\n this.interiorRings = []\n for (let i = 1, iMax = geomPoly.length; i < iMax; i++) {\n const ring = new RingIn(geomPoly[i], this, false)\n if (ring.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = ring.bbox.ll.x\n if (ring.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = ring.bbox.ll.y\n if (ring.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = ring.bbox.ur.x\n if (ring.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = ring.bbox.ur.y\n this.interiorRings.push(ring)\n }\n this.multiPoly = multiPoly\n }\n\n getSweepEvents() {\n const sweepEvents = this.exteriorRing.getSweepEvents()\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringSweepEvents = this.interiorRings[i].getSweepEvents()\n for (let j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n\nexport class MultiPolyIn {\n isSubject: boolean\n polys: PolyIn[]\n bbox: Bbox\n\n constructor(geom: Geom, isSubject: boolean) {\n if (!Array.isArray(geom)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n try {\n // if the input looks like a polygon, convert it to a multipolygon\n if (typeof geom[0][0][0] === \"number\") geom = [geom as Poly]\n } catch (ex) {\n // The input is either malformed or has empty arrays.\n // In either case, it will be handled later on.\n }\n\n this.polys = []\n this.bbox = {\n ll: { x: new BigNumber(Number.POSITIVE_INFINITY), y: new BigNumber(Number.POSITIVE_INFINITY) },\n ur: { x: new BigNumber(Number.NEGATIVE_INFINITY), y: new BigNumber(Number.NEGATIVE_INFINITY) },\n }\n for (let i = 0, iMax = geom.length; i < iMax; i++) {\n const poly = new PolyIn(geom[i] as Poly, this)\n if (poly.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = poly.bbox.ll.x\n if (poly.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = poly.bbox.ll.y\n if (poly.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = poly.bbox.ur.x\n if (poly.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = poly.bbox.ur.y\n this.polys.push(poly)\n }\n this.isSubject = isSubject\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polySweepEvents = this.polys[i].getSweepEvents()\n for (let j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n","export default <T>(x: T) => {\n return () => {\n return x\n }\n}","import BigNumber from \"bignumber.js\"\nimport constant from \"./constant.js\"\n\nexport default (eps?: number) => {\n const almostEqual = eps ? (a: BigNumber, b: BigNumber) =>\n b.minus(a).abs().isLessThanOrEqualTo(eps)\n : constant(false)\n\n return (a: BigNumber, b: BigNumber) => {\n if (almostEqual(a, b)) return 0\n\n return a.comparedTo(b)\n }\n}","import BigNumber from \"bignumber.js\";\nimport constant from \"./constant.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default function (eps?: number) {\n const almostCollinear = eps ? (area2: BigNumber, ax: BigNumber, ay: BigNumber, cx: BigNumber, cy: BigNumber) =>\n area2.exponentiatedBy(2).isLessThanOrEqualTo(\n cx.minus(ax).exponentiatedBy(2).plus(cy.minus(ay).exponentiatedBy(2))\n .times(eps))\n : constant(false)\n\n return (a: Vector, b: Vector, c: Vector) => {\n const ax = a.x, ay = a.y, cx = c.x, cy = c.y\n\n const area2 = ay.minus(cy).times(b.x.minus(cx)).minus(ax.minus(cx).times(b.y.minus(cy)))\n\n if (almostCollinear(area2, ax, ay, cx, cy)) return 0\n\n return area2.comparedTo(0)\n }\n}","import BigNumber from \"bignumber.js\";\nimport { SplayTreeSet } from \"splaytree-ts\"\nimport compare from \"./compare.js\";\nimport identity from \"./identity.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default (eps?: number) => {\n if (eps) {\n\n const xTree = new SplayTreeSet(compare(eps))\n const yTree = new SplayTreeSet(compare(eps))\n\n const snapCoord = (coord: BigNumber, tree: SplayTreeSet<BigNumber>) => {\n return tree.addAndReturn(coord)\n }\n\n const snap = (v: Vector) => {\n return {\n x: snapCoord(v.x, xTree),\n y: snapCoord(v.y, yTree),\n } as Vector\n }\n\n snap({ x: new BigNumber(0), y: new BigNumber(0)})\n\n return snap\n }\n\n return identity<Vector>\n}","export default <T>(x: T) => {\n return x;\n}","import compare from \"./compare.js\";\nimport orient from \"./orient.js\";\nimport snap from \"./snap.js\";\n\nconst set = (eps?: number) => {\n return {\n set: (eps?: number) => { precision = set(eps) },\n reset: () => set(eps),\n compare: compare(eps),\n snap: snap(eps),\n orient: orient(eps)\n }\n}\n\nexport let precision: ReturnType<typeof set> = set()","import { Vector } from \"./vector.js\";\n\nexport interface Bbox {\n ll: Vector;\n ur: Vector;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\n\nexport const isInBbox = (bbox: Bbox, point: Vector) => {\n return (\n bbox.ll.x.isLessThanOrEqualTo(point.x) &&\n point.x.isLessThanOrEqualTo(bbox.ur.x) &&\n bbox.ll.y.isLessThanOrEqualTo(point.y) &&\n point.y.isLessThanOrEqualTo(bbox.ur.y) \n )\n}\n\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\nexport const getBboxOverlap = (b1: Bbox, b2: Bbox) => {\n // check if the bboxes overlap at all\n if (\n b2.ur.x.isLessThan(b1.ll.x) ||\n b1.ur.x.isLessThan(b2.ll.x) ||\n b2.ur.y.isLessThan(b1.ll.y) ||\n b1.ur.y.isLessThan(b2.ll.y) \n )\n return null\n\n // find the middle two X values\n const lowerX = b1.ll.x.isLessThan(b2.ll.x) ? b2.ll.x : b1.ll.x\n const upperX = b1.ur.x.isLessThan(b2.ur.x) ? b1.ur.x : b2.ur.x\n\n // find the middle two Y values\n const lowerY = b1.ll.y.isLessThan(b2.ll.y) ? b2.ll.y : b1.ll.y\n const upperY = b1.ur.y.isLessThan(b2.ur.y) ? b1.ur.y : b2.ur.y\n\n // put those middle values together to get the overlap\n return { ll: { x: lowerX, y: lowerY }, ur: { x: upperX, y: upperY } } as Bbox\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport { getBboxOverlap } from \"./bbox.js\"\nimport * as geomIn from \"./geom-in.js\"\nimport { Geom } from \"./geom-in.js\"\nimport * as geomOut from \"./geom-out.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent from \"./sweep-event.js\"\nimport SweepLine from \"./sweep-line.js\"\n\nexport class Operation {\n type!: string\n numMultiPolys!: number\n\n run(type: string, geom: Geom, moreGeoms: Geom[]) {\n operation.type = type\n\n /* Convert inputs to MultiPoly objects */\n const multipolys = [new geomIn.MultiPolyIn(geom, true)]\n for (let i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n multipolys.push(new geomIn.MultiPolyIn(moreGeoms[i], false))\n }\n operation.numMultiPolys = multipolys.length\n\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n if (operation.type === \"difference\") {\n // in place removal\n const subject = multipolys[0]\n let i = 1\n while (i < multipolys.length) {\n if (getBboxOverlap(multipolys[i].bbox, subject.bbox) !== null) i++\n else multipolys.splice(i, 1)\n }\n }\n\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n if (operation.type === \"intersection\") {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const mpA = multipolys[i]\n for (let j = i + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return []\n }\n }\n }\n\n /* Put segment endpoints in a priority queue */\n const queue = new SplayTreeSet(SweepEvent.compare)\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const sweepEvents = multipolys[i].getSweepEvents()\n for (let j = 0, jMax = sweepEvents.length; j < jMax; j++) {\n queue.add(sweepEvents[j])\n }\n }\n\n /* Pass the sweep line over those endpoints */\n const sweepLine = new SweepLine(queue)\n let evt = null\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n }\n while (evt) {\n const newEvents = sweepLine.process(evt)\n for (let i = 0, iMax = newEvents.length; i < iMax; i++) {\n const evt = newEvents[i]\n if (evt.consumedBy === undefined) queue.add(evt)\n }\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n } else {\n evt = null;\n }\n }\n\n // free some memory we don't need anymore\n precision.reset()\n\n /* Collect and compile segments we're keeping into a multipolygon */\n const ringsOut = geomOut.RingOut.factory(sweepLine.segments)\n const result = new geomOut.MultiPolyOut(ringsOut)\n return result.getGeom()\n }\n}\n\n// singleton available by import\nconst operation = new Operation()\n\nexport default operation\n","import * as bn from \"bignumber.js\";\n\nexport interface Vector {\n x: bn.BigNumber;\n y: bn.BigNumber;\n}\n\n/* Cross Product of two vectors with first point at origin */\nexport const crossProduct = (a: Vector, b: Vector) => a.x.times(b.y).minus(a.y.times(b.x))\n\n/* Dot Product of two vectors with first point at origin */\nexport const dotProduct = (a: Vector, b: Vector) => a.x.times(b.x).plus(a.y.times(b.y))\n\nexport const length = (v: Vector) => dotProduct(v, v).sqrt()\n\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const sineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return crossProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const cosineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return dotProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const horizontalIntersection = (pt: Vector, v: Vector, y: bn.BigNumber) => {\n if (v.y.isZero()) return null\n return { x: pt.x.plus((v.x.div(v.y)).times(y.minus(pt.y))), y: y }\n}\n\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const verticalIntersection = (pt: Vector, v: Vector, x: bn.BigNumber) => {\n if (v.x.isZero()) return null\n return { x: x, y: pt.y.plus((v.y.div(v.x)).times(x.minus(pt.x))) }\n}\n\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const intersection = (pt1: Vector, v1: Vector, pt2: Vector, v2: Vector) => {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x.isZero()) return verticalIntersection(pt2, v2, pt1.x)\n if (v2.x.isZero()) return verticalIntersection(pt1, v1, pt2.x)\n if (v1.y.isZero()) return horizontalIntersection(pt2, v2, pt1.y)\n if (v2.y.isZero()) return horizontalIntersection(pt1, v1, pt2.y)\n\n // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n const kross = crossProduct(v1, v2)\n if (kross.isZero()) return null\n\n const ve = { x: pt2.x.minus(pt1.x), y: pt2.y.minus(pt1.y) }\n const d1 = crossProduct(ve, v1).div(kross)\n const d2 = crossProduct(ve, v2).div(kross)\n\n // take the average of the two calculations to minimize rounding error\n const x1 = pt1.x.plus(d2.times(v1.x)),\n x2 = pt2.x.plus(d1.times(v2.x))\n const y1 = pt1.y.plus(d2.times(v1.y)),\n y2 = pt2.y.plus(d1.times(v2.y))\n const x = x1.plus(x2).div(2)\n const y = y1.plus(y2).div(2)\n return { x: x, y: y } as Vector\n}\n\n/* Given a vector, return one that is perpendicular */\nexport const perpendicular = (v: Vector) => {\n return { x: v.y.negated(), y: v.x }\n}","import BigNumber from \"bignumber.js\";\nimport Segment from \"./segment.js\"\nimport { cosineOfAngle, sineOfAngle, Vector } from \"./vector.js\"\n\nexport interface Point extends Vector {\n events: SweepEvent[];\n}\n\nexport default class SweepEvent {\n point: Point;\n isLeft: boolean;\n segment!: Segment;\n otherSE!: SweepEvent;\n consumedBy: SweepEvent | undefined;\n\n // for ordering sweep events in the sweep event queue\n static compare(a: SweepEvent, b: SweepEvent) {\n // favor event with a point that the sweep line hits first\n const ptCmp = SweepEvent.comparePoints(a.point, b.point)\n if (ptCmp !== 0) return ptCmp\n\n // the points are the same, so link them if needed\n if (a.point !== b.point) a.link(b)\n\n // favor right events over left\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1\n\n // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n return Segment.compare(a.segment, b.segment)\n }\n\n // for ordering points in sweep line order\n static comparePoints(aPt: Point, bPt: Point) {\n if (aPt.x.isLessThan(bPt.x)) return -1\n if (aPt.x.isGreaterThan(bPt.x)) return 1\n\n if (aPt.y.isLessThan(bPt.y)) return -1\n if (aPt.y.isGreaterThan(bPt.y)) return 1\n\n return 0\n }\n\n // Warning: 'point' input will be modified and re-used (for performance)\n constructor(point: Point, isLeft: boolean) {\n if (point.events === undefined) point.events = [this]\n else point.events.push(this)\n this.point = point\n this.isLeft = isLeft\n // this.segment, this.otherSE set by factory\n }\n\n link(other: SweepEvent) {\n if (other.point === this.point) {\n throw new Error(\"Tried to link already linked events\")\n }\n const otherEvents = other.point.events\n for (let i = 0, iMax = otherEvents.length; i < iMax; i++) {\n const evt = otherEvents[i]\n this.point.events.push(evt)\n evt.point = this.point\n }\n this.checkForConsuming()\n }\n\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n\n // Compare each pair of events to see if other events also match\n const numEvents = this.point.events.length\n for (let i = 0; i < numEvents; i++) {\n const evt1 = this.point.events[i]\n if (evt1.segment.consumedBy !== undefined) continue\n for (let j = i + 1; j < numEvents; j++) {\n const evt2 = this.point.events[j]\n if (evt2.consumedBy !== undefined) continue\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue\n evt1.segment.consume(evt2.segment)\n }\n }\n }\n\n getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n const events = []\n for (let i = 0, iMax = this.point.events.length; i < iMax; i++) {\n const evt = this.point.events[i]\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt)\n }\n }\n return events\n }\n\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n getLeftmostComparator(baseEvent: SweepEvent) {\n const cache = new Map<SweepEvent, { sine: BigNumber, cosine: BigNumber }>()\n\n const fillCache = (linkedEvent: SweepEvent) => {\n const nextEvent = linkedEvent.otherSE\n cache.set(linkedEvent, {\n sine: sineOfAngle(this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(this.point, baseEvent.point, nextEvent.point),\n })\n }\n\n return (a: SweepEvent, b: SweepEvent) => {\n if (!cache.has(a)) fillCache(a)\n if (!cache.has(b)) fillCache(b)\n\n const { sine: asine, cosine: acosine } = cache.get(a)!\n const { sine: bsine, cosine: bcosine } = cache.get(b)!\n\n // both on or above x-axis\n if (asine.isGreaterThanOrEqualTo(0) && bsine.isGreaterThanOrEqualTo(0)) {\n if (acosine.isLessThan(bcosine)) return 1\n if (acosine.isGreaterThan(bcosine)) return -1\n return 0\n }\n\n // both below x-axis\n if (asine.isLessThan(0) && bsine.isLessThan(0)) {\n if (acosine.isLessThan(bcosine)) return -1\n if (acosine.isGreaterThan(bcosine)) return 1\n return 0\n }\n\n // one above x-axis, one below\n if (bsine.isLessThan(asine)) return -1\n if (bsine.isGreaterThan(asine)) return 1\n return 0\n }\n }\n}\n","import { MultiPoly, Poly, Ring } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport Segment from \"./segment.js\"\nimport SweepEvent from \"./sweep-event.js\"\n\nexport class RingOut {\n events: SweepEvent[]\n poly: PolyOut | null\n _isExteriorRing: boolean | undefined\n _enclosingRing: RingOut | null | undefined\n \n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n static factory(allSegments: Segment[]) {\n const ringsOut = []\n\n for (let i = 0, iMax = allSegments.length; i < iMax; i++) {\n const segment = allSegments[i]\n if (!segment.isInResult() || segment.ringOut) continue\n\n let prevEvent = null\n let event = segment.leftSE\n let nextEvent = segment.rightSE\n const events = [event]\n\n const startingPoint = event.point\n const intersectionLEs = []\n\n /* Walk the chain of linked events to form a closed ring */\n while (true) {\n prevEvent = event\n event = nextEvent\n events.push(event)\n\n /* Is the ring complete? */\n if (event.point === startingPoint) break\n\n while (true) {\n const availableLEs = event.getAvailableLinkedEvents()\n\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n if (availableLEs.length === 0) {\n const firstPt = events[0].point\n const lastPt = events[events.length - 1].point\n throw new Error(\n `Unable to complete output ring starting at [${firstPt.x},` +\n ` ${firstPt.y}]. Last matching segment found ends at` +\n ` [${lastPt.x}, ${lastPt.y}].`,\n )\n }\n\n /* Only one way to go, so cotinue on the path */\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE\n break\n }\n\n /* We must have an intersection. Check for a completed loop */\n let indexLE = null\n for (let j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j\n break\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n if (indexLE !== null) {\n const intersectionLE = intersectionLEs.splice(indexLE)[0]\n const ringEvents = events.splice(intersectionLE.index)\n ringEvents.unshift(ringEvents[0].otherSE)\n ringsOut.push(new RingOut(ringEvents.reverse()))\n continue\n }\n /* register the intersection */\n intersectionLEs.push({\n index: events.length,\n point: event.point,\n })\n /* Choose the left-most option to continue the walk */\n const comparator = event.getLeftmostComparator(prevEvent)\n nextEvent = availableLEs.sort(comparator)[0].otherSE\n break\n }\n }\n\n ringsOut.push(new RingOut(events))\n }\n return ringsOut\n }\n\n constructor(events: SweepEvent[]) {\n this.events = events\n for (let i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this\n }\n this.poly = null\n }\n\n getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n let prevPt = this.events[0].point\n const points = [prevPt]\n for (let i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n const pt = this.events[i].point\n const nextPt = this.events[i + 1].point\n if (precision.orient(pt, prevPt, nextPt) === 0) continue\n points.push(pt)\n prevPt = pt\n }\n\n // ring was all (within rounding error of angle calc) colinear points\n if (points.length === 1) return null\n\n // check if the starting point is necessary\n const pt = points[0]\n const nextPt = points[1]\n if (precision.orient(pt, prevPt, nextPt) === 0) points.shift()\n\n points.push(points[0])\n const step = this.isExteriorRing() ? 1 : -1\n const iStart = this.isExteriorRing() ? 0 : points.length - 1\n const iEnd = this.isExteriorRing() ? points.length : -1\n const orderedPoints: Ring = []\n for (let i = iStart; i != iEnd; i += step)\n orderedPoints.push([points[i].x.toNumber(), points[i].y.toNumber()])\n return orderedPoints\n }\n\n isExteriorRing(): boolean {\n if (this._isExteriorRing === undefined) {\n const enclosing = this.enclosingRing()\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true\n }\n return this._isExteriorRing\n }\n\n enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing()\n }\n return this._enclosingRing\n }\n\n /* Returns the ring that encloses this one, if any */\n _calcEnclosingRing(): RingOut | null | undefined {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n let leftMostEvt = this.events[0]\n for (let i = 1, iMax = this.events.length; i < iMax; i++) {\n const evt = this.events[i]\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt\n }\n\n let prevSeg: Segment | null | undefined = leftMostEvt.segment.prevInResult()\n let prevPrevSeg: Segment | null | undefined = prevSeg ? prevSeg.prevInResult() : null\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null\n\n // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n if (!prevPrevSeg) return prevSeg.ringOut\n\n // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut?.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut\n } else return prevSeg.ringOut?.enclosingRing()\n }\n\n // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n prevSeg = prevPrevSeg.prevInResult()\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null\n }\n }\n}\n\nexport class PolyOut {\n exteriorRing: RingOut;\n interiorRings: RingOut[];\n\n constructor(exteriorRing: RingOut) {\n this.exteriorRing = exteriorRing\n exteriorRing.poly = this\n this.interiorRings = []\n }\n\n addInterior(ring: RingOut) {\n this.interiorRings.push(ring)\n ring.poly = this\n }\n\n getGeom() {\n const geom0 = this.exteriorRing.getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (geom0 === null) return null\n const geom: Poly = [geom0];\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringGeom = this.interiorRings[i].getGeom()\n // interior ring was all (within rounding error of angle calc) colinear points\n if (ringGeom === null) continue\n geom.push(ringGeom)\n }\n return geom\n }\n}\n\nexport class MultiPolyOut {\n rings: RingOut[];\n polys: PolyOut[];\n\n constructor(rings: RingOut[]) {\n this.rings = rings\n this.polys = this._composePolys(rings)\n }\n\n getGeom() {\n const geom: MultiPoly = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polyGeom = this.polys[i].getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (polyGeom === null) continue\n geom.push(polyGeom)\n }\n return geom\n }\n\n _composePolys(rings: RingOut[]) {\n const polys = []\n for (let i = 0, iMax = rings.length; i < iMax; i++) {\n const ring = rings[i]\n if (ring.poly) continue\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring))\n else {\n const enclosingRing = ring.enclosingRing()\n if (!enclosingRing?.poly) polys.push(new PolyOut(enclosingRing!))\n enclosingRing?.poly?.addInterior(ring)\n }\n }\n return polys\n }\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport Segment from \"./segment.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nexport default class SweepLine {\n private queue: SplayTreeSet<SweepEvent>\n private tree: SplayTreeSet<Segment>\n segments: Segment[]\n\n constructor(queue: SplayTreeSet<SweepEvent>, comparator = Segment.compare) {\n this.queue = queue\n this.tree = new SplayTreeSet(comparator)\n this.segments = []\n }\n\n process(event: SweepEvent) {\n const segment = event.segment\n const newEvents: SweepEvent[] = []\n\n // if we've already been consumed by another segment,\n // clean up our body parts and get out\n if (event.consumedBy) {\n if (event.isLeft) this.queue.delete(event.otherSE)\n else this.tree.delete(segment)\n return newEvents\n }\n\n if (event.isLeft) this.tree.add(segment);\n\n let prevSeg: Segment | null = segment\n let nextSeg: Segment | null = segment\n\n // skip consumed segments still in tree\n do {\n prevSeg = this.tree.lastBefore(prevSeg)\n } while (prevSeg != null && prevSeg.consumedBy != undefined)\n\n // skip consumed segments still in tree\n do {\n nextSeg = this.tree.firstAfter(nextSeg)\n } while (nextSeg != null && nextSeg.consumedBy != undefined)\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n let prevMySplitter = null\n if (prevSeg) {\n const prevInter = prevSeg.getIntersection(segment)\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter\n if (!prevSeg.isAnEndpoint(prevInter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, prevInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // Check for intersections against the next segment in the sweep line\n let nextMySplitter = null\n if (nextSeg) {\n const nextInter = nextSeg.getIntersection(segment)\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter\n if (!nextSeg.isAnEndpoint(nextInter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, nextInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n if (prevMySplitter !== null || nextMySplitter !== null) {\n let mySplitter = null\n if (prevMySplitter === null) mySplitter = nextMySplitter\n else if (nextMySplitter === null) mySplitter = prevMySplitter\n else {\n const cmpSplitters = SweepEvent.comparePoints(\n prevMySplitter,\n nextMySplitter,\n )\n mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter\n }\n\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n this.queue.delete(segment.rightSE)\n newEvents.push(segment.rightSE)\n\n const newEventsFromSplit = segment.split(mySplitter!)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.delete(segment)\n newEvents.push(event)\n } else {\n // done with left event\n this.segments.push(segment)\n segment.prev = prevSeg\n }\n } else {\n // event.isRight\n\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n const inter = prevSeg.getIntersection(nextSeg)\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n if (!nextSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n this.tree.delete(segment)\n }\n\n return newEvents\n }\n\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n _splitSafely(seg: Segment, pt: Point) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.delete(seg)\n const rightSE = seg.rightSE\n this.queue.delete(rightSE)\n const newEvents = seg.split(pt)\n newEvents.push(rightSE)\n // splitting can trigger consumption\n if (seg.consumedBy === undefined) this.tree.add(seg)\n return newEvents\n }\n}\n","import { getBboxOverlap, isInBbox } from \"./bbox.js\"\nimport { MultiPolyIn, RingIn } from \"./geom-in.js\"\nimport { RingOut } from \"./geom-out.js\"\nimport operation from \"./operation.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\nimport { intersection } from \"./vector.js\"\n\ninterface State {\n rings: RingIn[],\n windings: number[],\n multiPolys: MultiPolyIn[]\n}\n\n// Give segments unique ID's to get consistent sorting of\n// segments and sweep events when all else is identical\nlet segmentId = 0\n\nexport default class Segment {\n id: number\n leftSE: SweepEvent\n rightSE: SweepEvent\n rings: RingIn[] | null\n windings: number[] | null\n ringOut: RingOut | undefined\n consumedBy: Segment | undefined\n prev: Segment | null | undefined\n _prevInResult: Segment | null | undefined\n _beforeState: State | undefined\n _afterState: State | undefined\n _isInResult: boolean | undefined\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n static compare(a: Segment, b: Segment) {\n const alx = a.leftSE.point.x\n const blx = b.leftSE.point.x\n const arx = a.rightSE.point.x\n const brx = b.rightSE.point.x\n\n // check if they're even in the same vertical plane\n if (brx.isLessThan(alx)) return 1\n if (arx.isLessThan(blx)) return -1\n\n const aly = a.leftSE.point.y\n const bly = b.leftSE.point.y\n const ary = a.rightSE.point.y\n const bry = b.rightSE.point.y\n\n // is left endpoint of segment B the right-more?\n if (alx.isLessThan(blx)) {\n // are the two segments in the same horizontal plane?\n if (bly.isLessThan(aly) && bly.isLessThan(ary)) return 1\n if (bly.isGreaterThan(aly) && bly.isGreaterThan(ary)) return -1\n\n // is the B left endpoint colinear to segment A?\n const aCmpBLeft = a.comparePoint(b.leftSE.point)\n if (aCmpBLeft < 0) return 1\n if (aCmpBLeft > 0) return -1\n\n // is the A right endpoint colinear to segment B ?\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return -1\n }\n\n // is left endpoint of segment A the right-more?\n if (alx.isGreaterThan(blx)) {\n if (aly.isLessThan(bly) && aly.isLessThan(bry)) return -1\n if (aly.isGreaterThan(bly) && aly.isGreaterThan(bry)) return 1\n\n // is the A left endpoint colinear to segment B?\n const bCmpALeft = b.comparePoint(a.leftSE.point)\n if (bCmpALeft !== 0) return bCmpALeft\n\n // is the B right endpoint colinear to segment A?\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return 1\n }\n\n // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n\n // consider the lower left-endpoint to come first\n if (aly.isLessThan(bly)) return -1\n if (aly.isGreaterThan(bly)) return 1\n\n // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n\n // is the A right endpoint more left-more?\n if (arx.isLessThan(brx)) {\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n }\n\n // is the B right endpoint more left-more?\n if (arx.isGreaterThan(brx)) {\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n }\n\n if (!arx.eq(brx)) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n const ay = ary.minus(aly)\n const ax = arx.minus(alx)\n const by = bry.minus(bly)\n const bx = brx.minus(blx)\n if (ay.isGreaterThan(ax) && by.isLessThan(bx)) return 1\n if (ay.isLessThan(ax) && by.isGreaterThan(bx)) return -1\n }\n\n // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n if (arx.isGreaterThan(brx)) return 1\n if (arx.isLessThan(brx)) return -1\n\n // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n\n // consider the lower right-endpoint to come first\n if (ary.isLessThan(bry)) return -1\n if (ary.isGreaterThan(bry)) return 1\n\n // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n if (a.id < b.id) return -1\n if (a.id > b.id) return 1\n\n // identical segment, ie a === b\n return 0\n }\n\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n constructor(leftSE: SweepEvent, rightSE: SweepEvent, rings: RingIn[], windings: number[]) {\n this.id = ++segmentId\n this.leftSE = leftSE\n leftSE.segment = this\n leftSE.otherSE = rightSE\n this.rightSE = rightSE\n rightSE.segment = this\n rightSE.otherSE = leftSE\n this.rings = rings\n this.windings = windings\n // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n static fromRing(pt1: Point, pt2: Point, ring: RingIn) {\n let leftPt: Point, rightPt: Point, winding: number\n\n // ordering the two points according to sweep line ordering\n const cmpPts = SweepEvent.comparePoints(pt1, pt2)\n if (cmpPts < 0) {\n leftPt = pt1\n rightPt = pt2\n winding = 1\n } else if (cmpPts > 0) {\n leftPt = pt2\n rightPt = pt1\n winding = -1\n } else\n throw new Error(\n `Tried to create degenerate segment at [${pt1.x}, ${pt1.y}]`,\n )\n\n const leftSE = new SweepEvent(leftPt, true)\n const rightSE = new SweepEvent(rightPt, false)\n return new Segment(leftSE, rightSE, [ring], [winding])\n }\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n replaceRightSE(newRightSE: SweepEvent) {\n this.rightSE = newRightSE\n this.rightSE.segment = this\n this.rightSE.otherSE = this.leftSE\n this.leftSE.otherSE = this.rightSE\n }\n\n bbox() {\n const y1 = this.leftSE.point.y\n const y2 = this.rightSE.point.y\n return {\n ll: { x: this.leftSE.point.x, y: y1.isLessThan(y2) ? y1 : y2 },\n ur: { x: this.rightSE.point.x, y: y1.isGreaterThan(y2) ? y1 : y2 },\n }\n }\n\n /* A vector from the left point to the right */\n vector() {\n return {\n x: this.rightSE.point.x.minus(this.leftSE.point.x),\n y: this.rightSE.point.y.minus(this.leftSE.point.y),\n }\n }\n\n isAnEndpoint(pt: Point) {\n return (\n (pt.x.eq(this.leftSE.point.x) && pt.y.eq(this.leftSE.point.y)) ||\n (pt.x.eq(this.rightSE.point.x) && pt.y.eq(this.rightSE.point.y))\n )\n }\n\n /* Compare this segment with a point.\n *\n * A point P is considered to be colinear to a segment if there\n * exists a distance D such that if we travel along the segment\n * from one * endpoint towards the other a distance D, we find\n * ourselves at point P.\n *\n * Return value indicates:\n *\n * 1: point lies above the segment (to the left of vertical)\n * 0: point is colinear to segment\n * -1: point lies below the segment (to the right of vertical)\n */\n comparePoint(point: Point) {\n return precision.orient(this.leftSE.point, point, this.rightSE.point)\n }\n\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n getIntersection(other: Segment) {\n // If bboxes don't overlap, there can't be any intersections\n const tBbox = this.bbox()\n const oBbox = other.bbox()\n const bboxOverlap = getBboxOverlap(tBbox, oBbox)\n if (bboxOverlap === null) return null\n\n // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n const tlp = this.leftSE.point\n const trp = this.rightSE.point\n const olp = other.leftSE.point\n const orp = other.rightSE.point\n\n // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n const touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0\n const touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0\n const touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0\n const touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0\n\n // do left endpoints match?\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp\n if (!touchesThisRSE && touchesOtherRSE) return orp\n // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n return null\n }\n\n // does this left endpoint matches (other doesn't)\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x.eq(orp.x) && tlp.y.eq(orp.y)) return null\n }\n // t-intersection on left endpoint\n return tlp\n }\n\n // does other left endpoint matches (this doesn't)\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x.eq(olp.x) && trp.y.eq(olp.y)) return null\n }\n // t-intersection on left endpoint\n return olp\n }\n\n // trivial intersection on right endpoints\n if (touchesThisRSE && touchesOtherRSE) return null\n\n // t-intersections on just one right endpoint\n if (touchesThisRSE) return trp\n if (touchesOtherRSE) return orp\n\n // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n const pt = intersection(tlp, this.vector(), olp, other.vector())\n\n // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n if (pt === null) return null\n\n // is the intersection found between the lines not on the segments?\n if (!isInBbox(bboxOverlap, pt)) return null\n\n // round the the computed point if needed\n return precision.snap(pt) as Point\n }\n\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n split(point: Point) {\n const newEvents = []\n const alreadyLinked = point.events !== undefined\n\n const newLeftSE = new SweepEvent(point, true)\n const newRightSE = new SweepEvent(point, false)\n const oldRightSE = this.rightSE\n this.replaceRightSE(newRightSE)\n newEvents.push(newRightSE)\n newEvents.push(newLeftSE)\n const newSeg = new Segment(\n newLeftSE,\n oldRightSE,\n this.rings!.slice(),\n this.windings!.slice(),\n )\n\n // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n if (\n SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0\n ) {\n newSeg.swapEvents()\n }\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents()\n }\n\n // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n if (alreadyLinked) {\n newLeftSE.checkForConsuming()\n newRightSE.checkForConsuming()\n }\n\n return newEvents\n }\n\n /* Swap which event is left and right */\n swapEvents() {\n const tmpEvt = this.rightSE\n this.rightSE = this.leftSE\n this.leftSE = tmpEvt\n this.leftSE.isLeft = true\n this.rightSE.isLeft = false\n for (let i = 0, iMax = this.windings!.length; i < iMax; i++) {\n this.windings![i] *= -1\n }\n }\n\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n consume(other: Segment) {\n let consumer = this as Segment\n let consumee = other\n while (consumer.consumedBy) consumer = consumer.consumedBy\n while (consumee.consumedBy) consumee = consumee.consumedBy\n\n const cmp = Segment.compare(consumer, consumee)\n if (cmp === 0) return // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n if (cmp > 0) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n // make sure a segment doesn't consume it's prev\n if (consumer.prev === consumee) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n for (let i = 0, iMax = consumee.rings!.length; i < iMax; i++) {\n const ring = consumee.rings![i]\n const winding = consumee.windings![i]\n const index = consumer.rings!.indexOf(ring)\n if (index === -1) {\n consumer.rings!.push(ring)\n consumer.windings!.push(winding)\n } else consumer.windings![index] += winding\n }\n consumee.rings = null\n consumee.windings = null\n consumee.consumedBy = consumer\n\n // mark sweep events consumed as to maintain ordering in sweep event queue\n consumee.leftSE.consumedBy = consumer.leftSE\n consumee.rightSE.consumedBy = consumer.rightSE\n }\n\n /* The first segment previous segment chain that is in the result */\n prevInResult(): Segment | null | undefined {\n if (this._prevInResult !== undefined) return this._prevInResult\n if (!this.prev) this._prevInResult = null\n else if (this.prev.isInResult()) this._prevInResult = this.prev\n else this._prevInResult = this.prev.prevInResult()\n return this._prevInResult\n }\n\n beforeState(): State {\n if (this._beforeState !== undefined) return this._beforeState\n if (!this.prev)\n this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: [],\n }\n else {\n const seg = this.prev.consumedBy || this.prev\n this._beforeState = seg.afterState()\n }\n return this._beforeState\n }\n\n afterState() {\n if (this._afterState !== undefined) return this._afterState\n\n const beforeState = this.beforeState()\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: [],\n }\n const ringsAfter = this._afterState.rings\n const windingsAfter = this._afterState.windings\n const mpsAfter = this._afterState.multiPolys\n\n // calculate ringsAfter, windingsAfter\n for (let i = 0, iMax = this.rings!.length; i < iMax; i++) {\n const ring = this.rings![i]\n const winding = this.windings![i]\n const index = ringsAfter.indexOf(ring)\n if (index === -1) {\n ringsAfter.push(ring)\n windingsAfter.push(winding)\n } else windingsAfter[index] += winding\n }\n\n // calcualte polysAfter\n const polysAfter = []\n const polysExclude = []\n for (let i = 0, iMax = ringsAfter.length; i < iMax; i++) {\n if (windingsAfter[i] === 0) continue // non-zero rule\n const ring = ringsAfter[i]\n const poly = ring.poly\n if (polysExclude.indexOf(poly) !== -1) continue\n if (ring.isExterior) polysAfter.push(poly)\n else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly)\n const index = polysAfter.indexOf(ring.poly)\n if (index !== -1) polysAfter.splice(index, 1)\n }\n }\n\n // calculate multiPolysAfter\n for (let i = 0, iMax = polysAfter.length; i < iMax; i++) {\n const mp = polysAfter[i].multiPoly\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp)\n }\n\n return this._afterState\n }\n\n /* Is this segment part of the final result? */\n isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false\n\n if (this._isInResult !== undefined) return this._isInResult\n\n const mpsBefore = this.beforeState().multiPolys\n const mpsAfter = this.afterState().multiPolys\n\n switch (operation.type) {\n case \"union\": {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n const noBefores = mpsBefore.length === 0\n const noAfters = mpsAfter.length === 0\n this._isInResult = noBefores !== noAfters\n break\n }\n\n case \"intersection\": {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n let least\n let most\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length\n most = mpsAfter.length\n } else {\n least = mpsAfter.length\n most = mpsBefore.length\n }\n this._isInResult = most === operation.numMultiPolys && least < most\n break\n }\n\n case \"xor\": {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n const diff = Math.abs(mpsBefore.length - mpsAfter.length)\n this._isInResult = diff % 2 === 1\n break\n }\n\n case \"difference\": {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n const isJustSubject = (mps: MultiPolyIn[]) => mps.length === 1 && mps[0].isSubject\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter)\n break\n }\n }\n\n return this._isInResult\n }\n}\n","import { Geom } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport operation from \"./operation.js\"\n\nexport { Geom }\n\nexport const union = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"union\", geom, moreGeoms)\n\nexport const intersection = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"intersection\", geom, moreGeoms)\n\nexport const xor = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"xor\", geom, moreGeoms)\n\nexport const difference = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"difference\", geom, moreGeoms)\n\nexport const setPrecision = precision.set","import {lngLatToWorld} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform WGS84 coordinates to tile coords.\n * It's the inverse of deck.gl coordinate-transform (https://github.com/visgl/deck.gl/blob/master/modules/geo-layers/src/mvt-layer/coordinate-transform.js)\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformToTileCoords<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = projectFlat([west, north]);\n const se = projectFlat([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = inverseLerp(nw[0], se[0], pointX);\n const y = inverseLerp(nw[1], se[1], pointY);\n\n return [x, y];\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(projectFlat(g), bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n\nfunction projectFlat(xyz: Position): Position {\n return lngLatToWorld(xyz);\n}\n\nfunction inverseLerp(a: number, b: number, x: number): number {\n return (x - a) / (b - a);\n}\n","import {SpatialIndex} from '../constants.js';\nimport {getResolution as quadbinGetResolution} from 'quadbin';\nimport type {SpatialFilter, SpatialIndexTile} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {getResolution as h3GetResolution} from 'h3-js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialDataType} from '../sources/types.js';\nimport {intersectTileH3, intersectTileQuadbin} from './tileIntersection.js';\n\nexport type TileFeaturesSpatialIndexOptions = {\n tiles: SpatialIndexTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n};\n\nexport function tileFeaturesSpatialIndex({\n tiles,\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n}: TileFeaturesSpatialIndexOptions): FeatureData[] {\n const map = new Map();\n const spatialIndex = getSpatialIndex(spatialDataType);\n const cellResolution = getResolution(tiles, spatialIndex);\n const spatialIndexIDName = spatialDataColumn\n ? spatialDataColumn\n : spatialIndex;\n\n if (!cellResolution) {\n return [];\n }\n\n let intersection: undefined | boolean | Set<bigint | string>;\n\n // Compute H3 intersection globally, Quadbin intersection per-tile. See tileIntersection.ts.\n if (spatialIndex === SpatialIndex.H3) {\n intersection = intersectTileH3(cellResolution as number, spatialFilter);\n }\n\n for (const tile of tiles) {\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n const parent = getTileIndex(tile, spatialIndex);\n intersection = intersectTileQuadbin(\n parent as bigint,\n cellResolution as bigint,\n spatialFilter\n );\n }\n\n if (!intersection) continue;\n\n tile.data.forEach((d: Feature) => {\n // @ts-expect-error Mixed types for cell indices.\n if (intersection === true || intersection.has(d.id as bigint | string)) {\n map.set(d.id, {...d.properties, [spatialIndexIDName]: d.id});\n }\n });\n }\n return Array.from(map.values());\n}\n\nfunction getTileIndex(\n tile: SpatialIndexTile,\n spatialIndex: SpatialIndex\n): bigint | string {\n if (spatialIndex === SpatialIndex.QUADBIN) {\n // @ts-expect-error Missing types for quadbin tile indices.\n return tile.index.q;\n }\n return tile.id;\n}\n\nfunction getResolution(\n tiles: SpatialIndexTile[],\n spatialIndex: SpatialIndex\n): bigint | number | undefined {\n const data = tiles.find((tile) => tile.data?.length)?.data;\n\n if (!data) {\n return;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n return Number(quadbinGetResolution(data[0].id));\n }\n\n if (spatialIndex === SpatialIndex.H3) {\n return h3GetResolution(data[0].id);\n }\n}\n\nfunction getSpatialIndex(spatialDataType: SpatialDataType): SpatialIndex {\n switch (spatialDataType) {\n case 'h3':\n return SpatialIndex.H3;\n case 'quadbin':\n return SpatialIndex.QUADBIN;\n default:\n throw new Error('Unexpected spatial data type');\n }\n}\n","/** @internal */\nexport const V3_MINOR_VERSION = '3.4';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_GEO_COLUMN = 'geom';\n\n/**\n * Fastly default limit is 8192; leave some padding.\n * @privateRemarks Source: @deck.gl/carto\n */\nexport const DEFAULT_MAX_LENGTH_URL = 7000;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport const DEFAULT_TILE_RESOLUTION = 0.5;\n\n/**\n * @todo TODO(v0.5): Update DEFAULT_TILE_RESOLUTION and remove this constant.\n * @internal\n */\nexport const REDUCED_QUERIES_TILE_RESOLUTION = 1;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_H3 = 4;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN = 6;\n\n/** @internal */\nexport const DEFAULT_AGGREGATION_EXP_ALIAS = '__aggregationValue';\nexport const DEFAULT_AGGREGATION_EXP = `1 AS ${DEFAULT_AGGREGATION_EXP_ALIAS}`;\n","import {cellToTile, getResolution, tileToCell} from 'quadbin';\nimport type {RasterTile, SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n RasterMetadata,\n RasterMetadataBand,\n SpatialDataType,\n} from '../sources/types.js';\nimport {intersectTileRaster} from './tileIntersection.js';\n\nexport type TileFeaturesRasterOptions = {\n tiles: RasterTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n rasterMetadata: RasterMetadata;\n};\n\nexport function tileFeaturesRaster({\n tiles,\n ...options\n}: TileFeaturesRasterOptions): FeatureData[] {\n // Cache band metadata for faster lookup while iterating over pixels.\n const metadataByBand: Record<string, RasterMetadataBand & {nodata: number}> =\n {};\n for (const band of options.rasterMetadata.bands) {\n // TODO(cleanup): Remove copy and cast after API is updated to return 'nodata' as a number.\n metadataByBand[band.name] = {...band, nodata: Number(band.nodata)};\n }\n\n // Omit empty and invisible tiles for simpler processing and types.\n tiles = tiles.filter(isRasterTileVisible);\n if (tiles.length === 0) return [];\n\n // Raster tiles, and all pixels, are quadbin cells. Resolution of a pixel is\n // the resolution of the tile, plus the number of subdivisions. Block size\n // must be square, N x N, where N is a power of two.\n const tileResolution = getResolution(tiles[0].index.q);\n const tileBlockSize = tiles[0].data!.blockSize;\n const cellResolution = tileResolution + BigInt(Math.log2(tileBlockSize));\n\n const data = new Map<bigint, FeatureData>();\n\n for (const tile of tiles as Required<RasterTile>[]) {\n const parent = tile.index.q;\n\n const intersection = intersectTileRaster(\n parent,\n cellResolution,\n options.spatialFilter\n );\n\n if (intersection === false) continue;\n\n const tileSortedCells = cellToChildrenRaster(parent, cellResolution);\n\n // For each pixel/cell within the spatial filter, create a FeatureData.\n // Order is row-major, starting from NW and ending at SE.\n for (let i = 0; i < tileSortedCells.length; i++) {\n if (intersection !== true && !intersection.has(tileSortedCells[i])) {\n continue;\n }\n\n const cellData: FeatureData = {};\n let cellDataExists = false;\n\n for (const band in tile.data.cells.numericProps) {\n const value = tile.data.cells.numericProps[band].value[i];\n const bandMetadata = metadataByBand[band];\n\n if (isValidBandValue(value, bandMetadata.nodata)) {\n cellData[band] = tile.data.cells.numericProps[band].value[i];\n cellDataExists = true;\n }\n }\n\n if (cellDataExists) {\n data.set(tileSortedCells[i], cellData);\n }\n }\n }\n\n return Array.from(data.values());\n}\n\n/**\n * Detects whether a given {@link Tile} is a {@link RasterTile}.\n * @privateRemarks Method of detection is arbitrary, and may be changed.\n */\nexport function isRasterTile(tile: Tile): tile is RasterTile {\n return !!(tile.data as Record<string, unknown>)?.cells;\n}\n\nfunction isRasterTileVisible(tile: RasterTile): tile is Required<RasterTile> {\n return !!(tile.isVisible && tile.data?.cells?.numericProps);\n}\n\n/**\n * Alternative to `quadbin` module's `cellToChildren()` function, modified to\n * return cells in row-major order, NW to SE, as stored in CARTO raster tiles.\n * Sorting after computing cells is too slow.\n */\nfunction cellToChildrenRaster(parent: bigint, resolution: bigint): bigint[] {\n const parentTile = cellToTile(parent);\n\n // 1. Calculate x/y/z of upper left pixel in raster tile.\n const childZ = Number(resolution);\n const blockSize = 2 ** (childZ - parentTile.z);\n const childBaseX = parentTile.x * blockSize;\n const childBaseY = parentTile.y * blockSize;\n\n // 2. Iterate pixels in raster tile order; compute cell ID from base x/y.\n const cells: bigint[] = [];\n for (let i = 0, il = blockSize ** 2; i < il; i++) {\n const x = childBaseX + (i % blockSize);\n const y = childBaseY + Math.floor(i / blockSize);\n cells.push(tileToCell({x, y, z: childZ}));\n }\n\n return cells;\n}\n\n/**\n * Returns true if the given value is valid (not NaN, not 'nodata')\n * for the given raster band.\n */\nfunction isValidBandValue(value: unknown, nodata: number): value is number {\n return Number.isNaN(value) ? false : nodata !== value;\n}\n","import {SchemaFieldType, type Filter, type SchemaField} from './types.js';\nimport {FilterType} from './constants.js';\nimport type {SpatialDataType} from './sources/types.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\n/**\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n\ntype Row<T> = Record<string, T> | Record<string, T>[] | T[] | T;\n\n/**\n * Due to each data warehouse having its own behavior with columns,\n * we need to normalize them and transform every key to lowercase.\n *\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function normalizeObjectKeys<T, R extends Row<T>>(el: R): R {\n if (Array.isArray(el)) {\n return el.map((value) => normalizeObjectKeys(value)) as R;\n } else if (typeof el !== 'object') {\n return el;\n }\n\n return Object.entries(el as Record<string, T>).reduce(\n (acc, [key, value]) => {\n acc[key.toLowerCase()] =\n typeof value === 'object' && value ? normalizeObjectKeys(value) : value;\n return acc;\n },\n {} as Record<string, T>\n ) as R;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * @privateRemarks Source: @carto/react-core\n * @internal\n */\nexport class InvalidColumnError extends Error {\n protected static readonly NAME = 'InvalidColumnError';\n\n constructor(message: string) {\n super(`${InvalidColumnError.NAME}: ${message}`);\n this.name = InvalidColumnError.NAME;\n }\n\n static is(error: unknown) {\n return (\n error instanceof InvalidColumnError ||\n (error as Error).message?.includes(InvalidColumnError.NAME)\n );\n }\n}\n\nexport function isEmptyObject(object: object): boolean {\n for (const _ in object) {\n return false;\n }\n return true;\n}\n\n/** @internal */\nexport const isObject: (x: unknown) => boolean = (x) =>\n x !== null && typeof x === 'object';\n\n/** @internal */\nexport const isPureObject: (x: any) => boolean = (x) =>\n isObject(x) && x.constructor === {}.constructor;\n\n/**\n * Merges one or more source objects into a target object. Unlike `Object.assign`, does not\n * assign properties with undefined values. Null values will overwrite existing properties.\n */\nexport function assignOptional<T extends object, U, V>(\n target: T,\n source1: U,\n source2: V\n): T & U & V;\nexport function assignOptional<T extends object, U>(\n target: T,\n source: U\n): T & U;\nexport function assignOptional<T extends object, U>(\n target: T,\n ...sources: any[]\n): any {\n for (const source of sources) {\n for (const key in source) {\n if (source[key] !== undefined) {\n (target as Record<string, unknown>)[key] = source[key];\n }\n }\n }\n return target as T & U;\n}\n\n/**\n * Returns the spatialDataType expected for widget operations, given layer source props. The\n * spatialDataType used in widget operations may be different from that of the layer. For\n * dynamically aggregated point datasets, widgets use type 'geo', not the aggregation type.\n */\nexport function getWidgetSpatialDataType(\n spatialDataType: SpatialDataType,\n spatialDataColumn: string,\n schema: SchemaField[]\n): SpatialDataType {\n const field = schema.find((field) => field.name === spatialDataColumn);\n if (field && field.type === SchemaFieldType.Geometry) {\n return 'geo';\n }\n\n return spatialDataType;\n}\n","import type {FilterType} from './constants.js';\nimport type {Polygon, MultiPolygon, Feature} from 'geojson';\nimport type {BinaryFeature, BinaryFeatureCollection} from '@loaders.gl/schema';\n\n/******************************************************************************\n * MAP INSTANTIATION\n */\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport enum SchemaFieldType {\n Number = 'number',\n Bigint = 'bigint',\n String = 'string',\n Geometry = 'geometry',\n Timestamp = 'timestamp',\n Object = 'object',\n Boolean = 'boolean',\n Variant = 'variant',\n Unknown = 'unknown',\n}\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport interface SchemaField {\n name: string;\n type: SchemaFieldType; // Field type in the CARTO stack, common for all providers\n}\n\n/******************************************************************************\n * MAPS AND TILES\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Format = 'json' | 'geojson' | 'tilejson';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport type MapType = 'boundary' | 'query' | 'table' | 'tileset' | 'raster';\n\n/** @privateRemarks Source: cloud-native */\nexport type ProviderType =\n | 'bigquery'\n | 'postgres'\n | 'snowflake'\n | 'redshift'\n | 'databricks'\n | 'carto'\n | 'carto_dw';\n\n/**\n * Alias for GeoJSON 'BBox' type, semantically representing a viewport.\n * Order of values is \"west\", \"south\", \"east\", \"north\".\n */\nexport type Viewport = [number, number, number, number];\n\n/**\n * Subset of deck.gl's Tile2DHeader type, containing only the properties\n * required for local widget calculations. Deeper dependencies on deck.gl\n * APIs should be minimized within this library: @deck.gl/carto depends\n * on the API client, not the other way around.\n * @privateRemarks Source: @deck.gl/geo-layers\n */\nexport type Tile = {\n index: {x: number; y: number; z: number};\n id: string;\n bbox: {west: number; east: number; north: number; south: number};\n isVisible: boolean;\n data?: BinaryFeatureCollection;\n};\n\n/** Subset of deck.gl's Tile2DHeader type, for spatial indexes. */\nexport type SpatialIndexTile = Tile & {\n data?: (Feature & {id: bigint})[];\n};\n\nexport type RasterTile = Tile & {\n id: string;\n index: {q: bigint; i: string};\n data?: Raster;\n};\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Raster = {\n blockSize: number;\n cells: {\n numericProps: BinaryFeature['numericProps'];\n properties: BinaryFeature['properties'];\n };\n};\n\n/******************************************************************************\n * AGGREGATION\n */\n\n/**\n * Enum type for the different types of aggregations available for widgets.\n *\n * @privateRemarks Source: @carto/constants\n * @privateRemarks Converted from enum to type union, for improved declarative API.\n */\nexport type AggregationType =\n | 'count'\n | 'avg'\n | 'min'\n | 'max'\n | 'sum'\n | 'custom';\n\n/******************************************************************************\n * FILTERS\n */\n\n/** @privateRemarks Source: @carto/react-api */\nexport type SpatialFilter = Polygon | MultiPolygon;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport interface Filters {\n [column: string]: Filter;\n}\n\n/** @privateRemarks Source: @carto/react-api, @deck.gl/carto */\nexport interface Filter {\n [FilterType.IN]?: {owner?: string; values: number[] | string[]};\n /** [a, b] both are included. */\n [FilterType.BETWEEN]?: {owner?: string; values: number[][]};\n /** [a, b) a is included, b is not. */\n [FilterType.CLOSED_OPEN]?: {owner?: string; values: number[][]};\n [FilterType.TIME]?: {owner?: string; values: number[][]};\n [FilterType.STRING_SEARCH]?: {\n owner?: string;\n values: string[];\n params?: StringSearchOptions;\n };\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport type FilterLogicalOperator = 'and' | 'or';\n\n/**\n * Type for minimum or maximum value of an interval. Values 'null' and\n * 'undefined' are intentionally allowed, and represent an unbounded value.\n */\nexport type FilterIntervalExtremum = number | null | undefined;\nexport type FilterInterval = [FilterIntervalExtremum, FilterIntervalExtremum];\nexport type FilterIntervalComplete = [number, number];\n\nexport type StringSearchOptions = {\n useRegExp?: boolean;\n mustStart?: boolean;\n mustEnd?: boolean;\n caseSensitive?: boolean;\n keepSpecialCharacters?: boolean;\n};\n\n/******************************************************************************\n * GROUPING\n */\n\n/**\n * Defines a step size increment for use with {@link TimeSeriesRequestOptions}.\n *\n * @privateRemarks Source: @carto/react-core\n */\nexport type GroupDateType =\n | 'year'\n | 'month'\n | 'week'\n | 'day'\n | 'hour'\n | 'minute'\n | 'second';\n\n/******************************************************************************\n * SORTING\n */\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortColumnType = 'number' | 'string' | 'date';\n\n/******************************************************************************\n * SQL QUERY PARAMETERS\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameterValue =\n | string\n | number\n | boolean\n | Array<QueryParameterValue>\n | object;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type NamedQueryParameter = Record<string, QueryParameterValue>;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type PositionalQueryParameter = QueryParameterValue[];\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameters = NamedQueryParameter | PositionalQueryParameter;\n","export {default as BASEMAP} from './basemap-styles.js';\nexport {fetchMap} from './fetch-map.js';\nexport type {FetchMapOptions, FetchMapResult} from './fetch-map.js';\nexport type {\n Basemap,\n MapLibreBasemap,\n GoogleBasemap,\n KeplerMapConfig,\n} from './types.js';\n\nexport * from './basemap.js';\nexport * from './layer-map.js';\nexport * from './parse-map.js';\n","import {CartoAPIError, type APIErrorContext} from '../api/index.js';\nimport type {GoogleBasemapProps} from './types.js';\n\nconst cartoStyleUrlTemplate =\n 'https://basemaps.cartocdn.com/gl/{basemap}-gl-style/style.json';\n\nexport const CARTO_MAP_STYLES = ['positron', 'dark-matter', 'voyager'];\n\nexport const GOOGLE_BASEMAPS: Record<string, GoogleBasemapProps> = {\n roadmap: {\n mapTypeId: 'roadmap',\n mapId: '3754c817b510f791',\n },\n 'google-positron': {\n mapTypeId: 'roadmap',\n mapId: 'ea84ae4203ef21cd',\n },\n 'google-dark-matter': {\n mapTypeId: 'roadmap',\n mapId: '2fccc3b36c22a0e2',\n },\n 'google-voyager': {\n mapTypeId: 'roadmap',\n mapId: '885caf1e15bb9ef2',\n },\n satellite: {\n mapTypeId: 'satellite',\n },\n hybrid: {\n mapTypeId: 'hybrid',\n },\n terrain: {\n mapTypeId: 'terrain',\n },\n};\n\ntype StyleLayerGroupSlug =\n | 'label'\n | 'road'\n | 'border'\n | 'building'\n | 'water'\n | 'land';\ntype StyleLayerGroup = {\n slug: StyleLayerGroupSlug;\n filter: (layer: any) => boolean;\n defaultVisibility: boolean;\n};\n\nexport const STYLE_LAYER_GROUPS: StyleLayerGroup[] = [\n {\n slug: 'label',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(\n /(?=(label|_label|place-|place_|poi-|poi_|watername_|roadname_|housenumber))/\n )\n ),\n defaultVisibility: true,\n },\n {\n slug: 'road',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(road|railway|tunnel|street|bridge))(?!.*label)/)),\n defaultVisibility: true,\n },\n {\n slug: 'border',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/border|boundaries|boundary_/)),\n defaultVisibility: false,\n },\n {\n slug: 'building',\n filter: ({id}: {id: string}) => Boolean(id.match(/building/)),\n defaultVisibility: true,\n },\n {\n slug: 'water',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(water|stream|ferry))/)),\n defaultVisibility: true,\n },\n {\n slug: 'land',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(/(?=(parks|landcover|industrial|sand|hillshade|park_))/)\n ),\n defaultVisibility: true,\n },\n];\n\nexport function applyLayerGroupFilters(\n style: any,\n visibleLayerGroups: Record<StyleLayerGroupSlug, boolean>\n) {\n if (!Array.isArray(style?.layers)) {\n return style;\n }\n\n const removedLayerFilters = STYLE_LAYER_GROUPS.filter(\n (lg) => !visibleLayerGroups[lg.slug]\n ).map((lg) => lg.filter);\n\n const visibleLayers = style.layers.filter((layer: any) =>\n removedLayerFilters.every((match) => !match(layer))\n );\n\n return {\n ...style,\n layers: visibleLayers,\n };\n}\n\nexport function someLayerGroupsDisabled(\n visibleLayerGroups?: Record<StyleLayerGroupSlug, boolean>\n) {\n return (\n visibleLayerGroups &&\n Object.values(visibleLayerGroups).every(Boolean) === false\n );\n}\n\nexport function getStyleUrl(styleType: string) {\n return cartoStyleUrlTemplate.replace('{basemap}', styleType);\n}\n\nexport async function fetchStyle({\n styleUrl,\n errorContext,\n}: {\n styleUrl: string;\n errorContext?: APIErrorContext;\n}) {\n /* global fetch */\n let response: Response | undefined;\n return await fetch(styleUrl, {mode: 'cors'})\n .then((res) => {\n response = res;\n return res.json();\n })\n .catch((error) => {\n throw new CartoAPIError(\n error,\n {...errorContext, requestType: 'Basemap style'},\n response\n );\n });\n}\n\nexport default {\n VOYAGER: getStyleUrl('voyager'),\n POSITRON: getStyleUrl('positron'),\n DARK_MATTER: getStyleUrl('dark-matter'),\n VOYAGER_NOLABELS: getStyleUrl('voyager-nolabels'),\n POSITRON_NOLABELS: getStyleUrl('positron-nolabels'),\n DARK_MATTER_NOLABELS: getStyleUrl('dark-matter-nolabels'),\n} as const;\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {\n CartoAPIError,\n type APIErrorContext,\n type APIRequestType,\n} from './carto-api-error.js';\n// Internal, but required for fetchMap().\nexport {buildPublicMapUrl, buildStatsUrl} from './endpoints.js';\nexport {query} from './query.js';\nexport type {QueryOptions} from './query.js';\nexport {\n requestWithParameters,\n clearDefaultRequestCache,\n} from './request-with-parameters.js';\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type APIRequestType =\n | 'Map data'\n | 'Map instantiation'\n | 'Public map'\n | 'Tile stats'\n | 'SQL'\n | 'Basemap style';\n\nexport type APIErrorContext = {\n requestType: APIRequestType;\n mapId?: string;\n connection?: string;\n source?: string;\n type?: MapType;\n};\n\n/**\n *\n * Custom error for reported errors in CARTO Maps API.\n * Provides useful debugging information in console and context for applications.\n *\n */\nexport class CartoAPIError extends Error {\n /** Source error from server */\n error: Error;\n\n /** Context (API call & parameters) in which error occured */\n errorContext: APIErrorContext;\n\n /** Response from server */\n response?: Response;\n\n /** JSON Response from server */\n responseJson?: any;\n\n constructor(\n error: Error,\n errorContext: APIErrorContext,\n response?: Response,\n responseJson?: any\n ) {\n let responseString = 'Failed to connect';\n if (response) {\n responseString = 'Server returned: ';\n if (response.status === 400) {\n responseString += 'Bad request';\n } else if (response.status === 401 || response.status === 403) {\n responseString += 'Unauthorized access';\n } else if (response.status === 404) {\n responseString += 'Not found';\n } else {\n responseString += 'Error';\n }\n\n responseString += ` (${response.status}):`;\n }\n responseString += ` ${error.message || error}`;\n\n let message = `${errorContext.requestType} API request failed`;\n message += `\\n${responseString}`;\n for (const key of Object.keys(errorContext)) {\n if (key === 'requestType') continue;\n message += `\\n${formatErrorKey(key)}: ${(errorContext as any)[key]}`;\n }\n message += '\\n';\n\n super(message);\n\n this.name = 'CartoAPIError';\n this.response = response;\n this.responseJson = responseJson;\n this.error = error;\n this.errorContext = errorContext;\n }\n}\n\n/**\n * Converts camelCase to Camel Case\n */\nfunction formatErrorKey(key: string) {\n return key.replace(/([A-Z])/g, ' $1').replace(/^./, (s) => s.toUpperCase());\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type V3Endpoint = 'maps' | 'stats' | 'sql';\n\nfunction joinPath(...args: string[]): string {\n return args\n .map((part) => (part.endsWith('/') ? part.slice(0, -1) : part))\n .join('/');\n}\n\nfunction buildV3Path(\n apiBaseUrl: string,\n version: 'v3',\n endpoint: V3Endpoint,\n ...rest: string[]\n): string {\n return joinPath(apiBaseUrl, version, endpoint, ...rest);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildPublicMapUrl({\n apiBaseUrl,\n cartoMapId,\n}: {\n apiBaseUrl: string;\n cartoMapId: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', 'public', cartoMapId);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildStatsUrl({\n attribute,\n apiBaseUrl,\n connectionName,\n source,\n type,\n}: {\n attribute: string;\n apiBaseUrl: string;\n connectionName: string;\n source: string;\n type: MapType;\n}): string {\n if (type === 'query') {\n return buildV3Path(apiBaseUrl, 'v3', 'stats', connectionName, attribute);\n }\n\n // type === 'table'\n return buildV3Path(\n apiBaseUrl,\n 'v3',\n 'stats',\n connectionName,\n source,\n attribute\n );\n}\n\nexport function buildSourceUrl({\n apiBaseUrl,\n connectionName,\n endpoint,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n endpoint: MapType;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', connectionName, endpoint);\n}\n\nexport function buildQueryUrl({\n apiBaseUrl,\n connectionName,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'sql', connectionName, 'query');\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {SOURCE_DEFAULTS} from '../sources/index.js';\nimport type {\n SourceOptions,\n QuerySourceOptions,\n QueryResult,\n} from '../sources/types.js';\nimport {buildQueryUrl} from './endpoints.js';\nimport {requestWithParameters} from './request-with-parameters.js';\nimport type {APIErrorContext} from './carto-api-error.js';\nimport {getClient} from '../client.js';\n\nexport type QueryOptions = SourceOptions & QuerySourceOptions;\ntype UrlParameters = {q: string; queryParameters?: string};\n\nexport const query = async function (\n options: QueryOptions\n): Promise<QueryResult> {\n const {\n apiBaseUrl = SOURCE_DEFAULTS.apiBaseUrl,\n maxLengthURL = SOURCE_DEFAULTS.maxLengthURL,\n clientId = getClient(),\n localCache,\n connectionName,\n sqlQuery,\n queryParameters,\n } = options;\n const urlParameters: UrlParameters = {q: sqlQuery};\n\n if (queryParameters) {\n urlParameters.queryParameters = JSON.stringify(queryParameters);\n }\n\n const baseUrl = buildQueryUrl({apiBaseUrl, connectionName});\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {client: clientId, ...urlParameters};\n\n const errorContext: APIErrorContext = {\n requestType: 'SQL',\n connection: options.connectionName,\n type: 'query',\n source: JSON.stringify(parameters, undefined, 2),\n };\n return await requestWithParameters<QueryResult>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {SOURCE_DEFAULTS} from './base-source.js';\nexport type {\n SourceOptions,\n SourceRequiredOptions,\n SourceOptionalOptions,\n TilejsonResult,\n QueryResult,\n FilterOptions,\n QuerySourceOptions,\n TableSourceOptions,\n TilesetSourceOptions,\n ColumnsOption,\n SpatialDataType,\n SpatialFilterPolyfillMode,\n TileResolution,\n Tilejson,\n Tilestats,\n Layer,\n Attribute,\n VectorLayer,\n RasterMetadata,\n RasterMetadataBand,\n RasterMetadataBandStats,\n RasterBandType,\n RasterBandColorinterp,\n} from './types.js';\n\nexport {boundaryQuerySource} from './boundary-query-source.js';\nexport type {\n BoundaryQuerySourceOptions,\n BoundaryQuerySourceResponse,\n} from './boundary-query-source.js';\n\nexport {boundaryTableSource} from './boundary-table-source.js';\nexport type {\n BoundaryTableSourceOptions,\n BoundaryTableSourceResponse,\n} from './boundary-table-source.js';\n\nexport {h3QuerySource} from './h3-query-source.js';\nexport type {\n H3QuerySourceOptions,\n H3QuerySourceResponse,\n} from './h3-query-source.js';\n\nexport {h3TableSource} from './h3-table-source.js';\nexport type {\n H3TableSourceOptions,\n H3TableSourceResponse,\n} from './h3-table-source.js';\n\nexport {h3TilesetSource} from './h3-tileset-source.js';\nexport type {\n H3TilesetSourceOptions,\n H3TilesetSourceResponse,\n} from './h3-tileset-source.js';\n\nexport {rasterSource} from './raster-source.js';\nexport type {RasterSourceOptions} from './raster-source.js';\n\nexport {quadbinQuerySource} from './quadbin-query-source.js';\nexport type {\n QuadbinQuerySourceOptions,\n QuadbinQuerySourceResponse,\n} from './quadbin-query-source.js';\n\nexport {quadbinTableSource} from './quadbin-table-source.js';\nexport type {\n QuadbinTableSourceOptions,\n QuadbinTableSourceResponse,\n} from './quadbin-table-source.js';\n\nexport {quadbinTilesetSource} from './quadbin-tileset-source.js';\nexport type {\n QuadbinTilesetSourceOptions,\n QuadbinTilesetSourceResponse,\n} from './quadbin-tileset-source.js';\n\nexport {vectorQuerySource} from './vector-query-source.js';\nexport type {\n VectorQuerySourceOptions,\n VectorQuerySourceResponse,\n} from './vector-query-source.js';\n\nexport {vectorTableSource} from './vector-table-source.js';\nexport type {\n VectorTableSourceOptions,\n VectorTableSourceResponse,\n} from './vector-table-source.js';\n\nexport {vectorTilesetSource} from './vector-tileset-source.js';\nexport type {\n VectorTilesetSourceOptions,\n VectorTilesetSourceResponse,\n} from './vector-tileset-source.js';\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_API_BASE_URL} from '../constants.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {buildSourceUrl} from '../api/endpoints.js';\nimport {requestWithParameters} from '../api/request-with-parameters.js';\nimport type {\n SourceOptionalOptions,\n SourceRequiredOptions,\n TilejsonMapInstantiation,\n TilejsonResult,\n} from './types.js';\nimport type {MapType} from '../types.js';\nimport type {APIErrorContext} from '../api/index.js';\nimport {getClient} from '../client.js';\n\nexport const SOURCE_DEFAULTS: Omit<SourceOptionalOptions, 'clientId'> = {\n apiBaseUrl: DEFAULT_API_BASE_URL,\n headers: {},\n maxLengthURL: DEFAULT_MAX_LENGTH_URL,\n};\n\nexport async function baseSource<UrlParameters extends Record<string, unknown>>(\n endpoint: MapType,\n options: Partial<SourceOptionalOptions> & SourceRequiredOptions,\n urlParameters: UrlParameters\n): Promise<TilejsonResult> {\n const {accessToken, connectionName, cache, ...optionalOptions} = options;\n const mergedOptions = {\n ...SOURCE_DEFAULTS,\n clientId: getClient(),\n accessToken,\n connectionName,\n endpoint,\n };\n for (const key in optionalOptions) {\n if (optionalOptions[key as keyof typeof optionalOptions]) {\n (mergedOptions as any)[key] =\n optionalOptions[key as keyof typeof optionalOptions];\n }\n }\n const baseUrl = buildSourceUrl(mergedOptions);\n const {clientId, maxLengthURL, localCache} = mergedOptions;\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {client: clientId, ...urlParameters};\n\n const errorContext: APIErrorContext = {\n requestType: 'Map instantiation',\n connection: options.connectionName,\n type: endpoint,\n source: JSON.stringify(parameters, undefined, 2),\n };\n const {tilejson, schema} =\n await requestWithParameters<TilejsonMapInstantiation>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n\n const dataUrl = tilejson.url[0];\n if (cache) {\n cache.value = parseInt(\n new URL(dataUrl).searchParams.get('cache') || '',\n 10\n );\n }\n errorContext.requestType = 'Map data';\n\n const json = await requestWithParameters<TilejsonResult>({\n baseUrl: dataUrl,\n parameters: {client: clientId},\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n if (accessToken) {\n json.accessToken = accessToken;\n }\n if (schema) {\n json.schema = schema;\n }\n return json;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isPureObject} from '../utils.js';\nimport {CartoAPIError, type APIErrorContext} from './carto-api-error.js';\nimport {V3_MINOR_VERSION} from '../constants-internal.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {getClient} from '../client.js';\nimport type {LocalCacheOptions} from '../sources/types.js';\n\nconst DEFAULT_HEADERS = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n};\n\nconst DEFAULT_REQUEST_CACHE = new Map<string, Promise<unknown>>();\n\nexport async function requestWithParameters<T = any>({\n baseUrl,\n parameters = {},\n headers: customHeaders = {},\n errorContext,\n maxLengthURL = DEFAULT_MAX_LENGTH_URL,\n localCache,\n}: {\n baseUrl: string;\n parameters?: Record<string, unknown>;\n headers?: Record<string, string>;\n errorContext: APIErrorContext;\n maxLengthURL?: number;\n localCache?: LocalCacheOptions;\n}): Promise<T> {\n // Parameters added to all requests issued with `requestWithParameters()`.\n // These parameters override parameters already in the base URL, but not\n // user-provided parameters.\n parameters = {\n v: V3_MINOR_VERSION,\n client: getClient(),\n ...(typeof deck !== 'undefined' &&\n deck.VERSION && {deckglVersion: deck.VERSION}),\n ...parameters,\n };\n\n baseUrl = excludeURLParameters(baseUrl, Object.keys(parameters));\n const key = createCacheKey(baseUrl, parameters, customHeaders);\n\n const {\n cache: REQUEST_CACHE,\n canReadCache,\n canStoreInCache,\n } = getCacheSettings(localCache);\n\n if (canReadCache && REQUEST_CACHE.has(key)) {\n return REQUEST_CACHE.get(key) as Promise<T>;\n }\n\n const url = createURLWithParameters(baseUrl, parameters);\n const headers = {...DEFAULT_HEADERS, ...customHeaders};\n\n /* global fetch */\n const fetchPromise =\n url.length > maxLengthURL\n ? fetch(baseUrl, {\n method: 'POST',\n body: JSON.stringify(parameters),\n headers,\n })\n : fetch(url, {headers});\n\n let response: Response | undefined;\n let responseJson: unknown;\n const jsonPromise: Promise<T> = fetchPromise\n .then((_response: Response) => {\n response = _response;\n return response.json();\n })\n .then((json: any) => {\n responseJson = json;\n if (!response || !response.ok) {\n throw new Error(json.error);\n }\n return json;\n })\n .catch((error: Error) => {\n if (canStoreInCache) {\n REQUEST_CACHE.delete(key);\n }\n throw new CartoAPIError(error, errorContext, response, responseJson);\n });\n\n if (canStoreInCache) {\n REQUEST_CACHE.set(key, jsonPromise);\n }\n return jsonPromise;\n}\n\nfunction getCacheSettings(localCache: LocalCacheOptions | undefined) {\n const canReadCache = localCache?.cacheControl?.includes('no-cache')\n ? false\n : true;\n const canStoreInCache = localCache?.cacheControl?.includes('no-store')\n ? false\n : true;\n const cache = localCache?.cache || DEFAULT_REQUEST_CACHE;\n\n return {\n cache,\n canReadCache,\n canStoreInCache,\n };\n}\n\nfunction createCacheKey(\n baseUrl: string,\n parameters: Record<string, unknown>,\n headers: Record<string, string>\n): string {\n const parameterEntries = Object.entries(parameters).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n const headerEntries = Object.entries(headers).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n return JSON.stringify({\n baseUrl,\n parameters: parameterEntries,\n headers: headerEntries,\n });\n}\n\n/**\n * Appends query string parameters to a URL. Existing URL parameters are kept,\n * unless there is a conflict, in which case the new parameters override\n * those already in the URL.\n */\nfunction createURLWithParameters(\n baseUrlString: string,\n parameters: Record<string, unknown>\n): string {\n const baseUrl = new URL(baseUrlString);\n for (const [key, value] of Object.entries(parameters)) {\n if (isPureObject(value) || Array.isArray(value)) {\n baseUrl.searchParams.set(key, JSON.stringify(value));\n } else {\n baseUrl.searchParams.set(\n key,\n (value as string | boolean | number).toString()\n );\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Deletes query string parameters from a URL.\n */\nfunction excludeURLParameters(baseUrlString: string, parameters: string[]) {\n const baseUrl = new URL(baseUrlString);\n for (const param of parameters) {\n if (baseUrl.searchParams.has(param)) {\n baseUrl.searchParams.delete(param);\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Clears the HTTP response cache for all requests using the default cache.\n * @internal\n */\nexport function clearDefaultRequestCache() {\n DEFAULT_REQUEST_CACHE.clear();\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {QueryParameters} from '../types.js';\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryQuerySourceOptions = SourceOptions &\n FilterOptions & {\n columns?: string[];\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: QueryParameters;\n };\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: Record<string, unknown> | unknown[];\n};\n\nexport type BoundaryQuerySourceResponse = TilejsonResult;\n\nexport const boundaryQuerySource = async function (\n options: BoundaryQuerySourceOptions\n): Promise<BoundaryQuerySourceResponse> {\n const {\n columns,\n filters,\n tilesetTableName,\n propertiesSqlQuery,\n queryParameters,\n } = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesSqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryTableSourceOptions = SourceOptions &\n FilterOptions & {\n tilesetTableName: string;\n columns?: string[];\n propertiesTableName: string;\n };\ntype UrlParameters = {\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n columns?: string;\n propertiesTableName: string;\n};\n\nexport type BoundaryTableSourceResponse = TilejsonResult;\n\nexport const boundaryTableSource = async function (\n options: BoundaryTableSourceOptions\n): Promise<BoundaryTableSourceResponse> {\n const {filters, tilesetTableName, columns, propertiesTableName} = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesTableName,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type H3QuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type H3QuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;\n\nexport const h3QuerySource = async function (\n options: H3QuerySourceOptions\n): Promise<H3QuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n sqlQuery,\n spatialDataColumn = 'h3',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n spatialDataColumn,\n spatialDataType,\n q: sqlQuery,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","import type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {FilterLogicalOperator, Filter} from '../types.js';\nimport {getClient} from '../client.js';\nimport type {SourceOptions} from '../sources/index.js';\nimport {ApiVersion, DEFAULT_API_BASE_URL} from '../constants.js';\n\nexport interface WidgetSourceProps extends Omit<SourceOptions, 'filters'> {\n apiVersion?: ApiVersion;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n}\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetSource<\n Props extends WidgetSourceProps = WidgetSourceProps,\n> {\n readonly props: Props;\n\n static defaultProps: Partial<WidgetSourceProps> = {\n apiVersion: ApiVersion.V3,\n apiBaseUrl: DEFAULT_API_BASE_URL,\n clientId: getClient(),\n filters: {},\n filtersLogicalOperator: 'and',\n };\n\n constructor(props: Props) {\n this.props = {\n ...WidgetSource.defaultProps,\n clientId: getClient(), // Refresh clientId, default may have changed.\n ...props,\n };\n }\n\n /**\n * Destroys the widget source and releases allocated resources.\n *\n * For remote sources (tables, queries) this has no effect, but for local\n * sources (tilesets, rasters) these resources will affect performance\n * and stability if many (10+) sources are created and not released.\n */\n destroy() {\n // no-op in most cases, but required for worker sources.\n }\n\n /**\n * Returns a list of labeled datapoints for categorical data. Suitable for\n * charts including grouped bar charts, pie charts, and tree charts.\n */\n abstract getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse>;\n\n /**\n * Given a list of feature IDs (as found in `_carto_feature_id`) returns all\n * matching features. In datasets containing features with duplicate geometries,\n * feature IDs may be duplicated (IDs are a hash of geometry) and so more\n * results may be returned than IDs in the request.\n * @internal\n * @experimental\n */\n abstract getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse>;\n\n /**\n * Returns a scalar numerical statistic over all matching data. Suitable\n * for 'headline' or 'scorecard' figures such as counts and sums.\n */\n abstract getFormula(options: FormulaRequestOptions): Promise<FormulaResponse>;\n\n /**\n * Returns a list of labeled datapoints for 'bins' of data defined as ticks\n * over a numerical range. Suitable for histogram charts.\n */\n abstract getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse>;\n\n /**\n * Returns a range (min and max) for a numerical column of matching rows.\n * Suitable for displaying certain 'headline' or 'scorecard' statistics,\n * or rendering a range slider UI for filtering.\n */\n abstract getRange(options: RangeRequestOptions): Promise<RangeResponse>;\n\n /**\n * Returns a list of bivariate datapoints defined as numerical 'x' and 'y'\n * values. Suitable for rendering scatter plots.\n */\n abstract getScatter(options: ScatterRequestOptions): Promise<ScatterResponse>;\n\n /**\n * Returns a list of arbitrary data rows, with support for pagination and\n * sorting. Suitable for displaying tables and lists.\n */\n abstract getTable(options: TableRequestOptions): Promise<TableResponse>;\n\n /**\n * Returns a series of labeled numerical values, grouped into equally-sized\n * time intervals. Suitable for rendering time series charts.\n */\n abstract getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse>;\n}\n","import type {\n H3QuerySourceOptions,\n QuadbinQuerySourceOptions,\n VectorQuerySourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerQuerySourceOptions =\n | Omit<VectorQuerySourceOptions, 'filters'>\n | Omit<H3QuerySourceOptions, 'filters'>\n | Omit<QuadbinQuerySourceOptions, 'filters'>;\n\nexport type WidgetQuerySourceResult = {widgetSource: WidgetQuerySource};\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorQuerySource}, {@link h3QuerySource}, or {@link quadbinQuerySource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorQuerySource } from '@carto/api-client';\n *\n * const data = vectorQuerySource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * sqlQuery: 'SELECT * FROM carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetQuerySource extends WidgetRemoteSource<\n LayerQuerySourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'query',\n data: this.props.sqlQuery,\n queryParameters: this.props.queryParameters,\n };\n }\n}\n","import {executeModel, type ModelSource} from '../models/index.js';\nimport type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {assert, normalizeObjectKeys} from '../utils.js';\nimport {DEFAULT_TILE_RESOLUTION} from '../constants-internal.js';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport type {Filters} from '../types.js';\nimport {AggregationTypes, ApiVersion} from '../constants.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\n\nexport type WidgetRemoteSourceProps = WidgetSourceProps;\n\n/**\n * Source for Widget API requests.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetRemoteSource<\n Props extends WidgetRemoteSourceProps,\n> extends WidgetSource<Props> {\n /**\n * Subclasses of {@link WidgetRemoteSource} must implement this method, calling\n * {@link WidgetRemoteSource.prototype._getModelSource} for common source\n * properties, and adding additional required properties including 'type' and\n * 'data'.\n */\n protected abstract getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource;\n\n protected _getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): Omit<ModelSource, 'type' | 'data'> {\n const props = this.props;\n return {\n apiVersion: props.apiVersion as ApiVersion,\n apiBaseUrl: props.apiBaseUrl as string,\n clientId: props.clientId as string,\n accessToken: props.accessToken,\n connectionName: props.connectionName,\n filters: getApplicableFilters(filterOwner, filters || props.filters),\n filtersLogicalOperator: props.filtersLogicalOperator,\n spatialDataType: props.spatialDataType,\n spatialDataColumn: props.spatialDataColumn,\n };\n }\n\n async getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n rawResult,\n ...params\n } = options;\n const {\n column,\n operation,\n operationColumn,\n operationExp,\n othersThreshold,\n orderBy,\n } = params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n const result = await executeModel({\n model: 'category',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n operation,\n operationExp,\n operationColumn: operationColumn || column,\n othersThreshold,\n orderBy,\n },\n opts: {signal, headers: this.props.headers},\n });\n\n const normalizedRows = normalizeObjectKeys(result.rows || []);\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return normalizedRows;\n }\n\n return [\n ...normalizedRows,\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n async getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, dataType, featureIds, z, limit, tileResolution} = params;\n\n type FeaturesModelResponse = {rows: Record<string, unknown>[]};\n\n return executeModel({\n model: 'pick',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n columns,\n dataType,\n featureIds,\n z,\n limit: limit || 1000,\n tileResolution: tileResolution || DEFAULT_TILE_RESOLUTION,\n },\n opts: {signal, headers: this.props.headers},\n // Avoid `normalizeObjectKeys()`, which changes column names.\n }).then(({rows}: FeaturesModelResponse) => ({rows}));\n }\n\n async getFormula(options: FormulaRequestOptions): Promise<FormulaResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n operationExp,\n ...params\n } = options;\n const {column, operation} = params;\n\n type FormulaModelResponse = {rows: {value: number}[]};\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n return executeModel({\n model: 'formula',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: column ?? '*',\n operation: operation ?? AggregationTypes.Count,\n operationExp,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: FormulaModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column, operation, ticks} = params;\n\n type HistogramModelResponse = {rows: {tick: number; value: number}[]};\n\n const data = await executeModel({\n model: 'histogram',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column, operation, ticks},\n opts: {signal, headers: this.props.headers},\n }).then((res: HistogramModelResponse) => normalizeObjectKeys(res.rows));\n\n if (data.length) {\n // Given N ticks the API returns up to N+1 bins, omitting any empty bins. Bins\n // include 1 bin below the lowest tick, N-1 between ticks, and 1 bin above the highest tick.\n const result = Array(ticks.length + 1).fill(0);\n data.forEach(\n ({tick, value}: {tick: number; value: number}) => (result[tick] = value)\n );\n return result;\n }\n\n return [];\n }\n\n async getRange(options: RangeRequestOptions): Promise<RangeResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column} = params;\n\n type RangeModelResponse = {rows: {min: number; max: number}[]};\n\n return executeModel({\n model: 'range',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column},\n opts: {signal, headers: this.props.headers},\n }).then((res: RangeModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getScatter(options: ScatterRequestOptions): Promise<ScatterResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {xAxisColumn, xAxisJoinOperation, yAxisColumn, yAxisJoinOperation} =\n params;\n\n // Make sure this is sync with the same constant in cloud-native/maps-api\n const HARD_LIMIT = 500;\n\n type ScatterModelResponse = {rows: {x: number; y: number}[]};\n\n return executeModel({\n model: 'scatterplot',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n xAxisColumn,\n xAxisJoinOperation,\n yAxisColumn,\n yAxisJoinOperation,\n limit: HARD_LIMIT,\n },\n opts: {signal, headers: this.props.headers},\n })\n .then((res: ScatterModelResponse) => normalizeObjectKeys(res.rows))\n .then((res) => res.map(({x, y}: {x: number; y: number}) => [x, y]));\n }\n\n async getTable(options: TableRequestOptions): Promise<TableResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, sortBy, sortDirection, offset = 0, limit = 10} = params;\n\n type TableModelResponse = {\n rows: Record<string, number | string>[];\n metadata: {total: number};\n };\n\n return executeModel({\n model: 'table',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: columns,\n sortBy,\n sortDirection,\n limit,\n offset,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TableModelResponse) => ({\n // Avoid `normalizeObjectKeys()`, which changes column names.\n rows: res.rows ?? (res as any).ROWS,\n totalCount: res.metadata?.total ?? (res as any).METADATA?.TOTAL,\n }));\n }\n\n async getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {\n column,\n operationColumn,\n joinOperation,\n operation,\n operationExp,\n stepSize,\n stepMultiplier,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n } = params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n type TimeSeriesModelResponse = {\n rows: {name: string; value: number}[];\n metadata: {categories: string[]};\n };\n\n return executeModel({\n model: 'timeseries',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n stepSize,\n stepMultiplier,\n operationColumn: operationColumn || column,\n joinOperation,\n operation,\n operationExp,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TimeSeriesModelResponse) => ({\n rows: normalizeObjectKeys(res.rows),\n categories: res.metadata?.categories,\n }));\n }\n}\n","export {executeModel} from './model.js';\nexport type {Model, ModelSource} from './model.js';\nexport type {ModelRequestOptions} from './common.js';\n","import {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {\n Filter,\n FilterLogicalOperator,\n MapType,\n QueryParameters,\n SpatialFilter,\n} from '../types.js';\nimport {assert, isPureObject} from '../utils.js';\nimport {type ModelRequestOptions, makeCall} from './common.js';\nimport {ApiVersion} from '../constants.js';\nimport type {\n SpatialDataType,\n SpatialFilterPolyfillMode,\n} from '../sources/types.js';\n\n/** @privateRemarks Source: @carto/react-api */\nconst AVAILABLE_MODELS = [\n 'category',\n 'histogram',\n 'formula',\n 'pick',\n 'timeseries',\n 'range',\n 'scatterplot',\n 'table',\n] as const;\n\nexport type Model = (typeof AVAILABLE_MODELS)[number];\n\nexport interface ModelSource {\n type: MapType;\n apiVersion: ApiVersion;\n apiBaseUrl: string;\n accessToken: string;\n clientId: string;\n connectionName: string;\n data: string;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n spatialFilter?: SpatialFilter;\n queryParameters?: QueryParameters;\n spatialDataColumn?: string;\n spatialDataType?: SpatialDataType;\n spatialFiltersMode?: SpatialFilterPolyfillMode;\n}\n\nconst {V3} = ApiVersion;\nconst REQUEST_GET_MAX_URL_LENGTH = 2048;\n\n/**\n * Execute a SQL model request.\n * @privateRemarks Source: @carto/react-api\n */\nexport function executeModel(props: {\n model: Model;\n source: ModelSource;\n params: Record<string, unknown>;\n opts?: Partial<ModelRequestOptions>;\n}) {\n assert(props.source, 'executeModel: missing source');\n assert(props.model, 'executeModel: missing model');\n assert(props.params, 'executeModel: missing params');\n\n assert(\n AVAILABLE_MODELS.includes(props.model),\n `executeModel: model provided isn't valid. Available models: ${AVAILABLE_MODELS.join(\n ', '\n )}`\n );\n\n const {model, source, params, opts} = props;\n const {type, apiVersion, apiBaseUrl, accessToken, connectionName, clientId} =\n source;\n\n assert(apiBaseUrl, 'executeModel: missing apiBaseUrl');\n assert(accessToken, 'executeModel: missing accessToken');\n assert(apiVersion === V3, 'executeModel: SQL Model API requires CARTO 3+');\n assert(type !== 'tileset', 'executeModel: Tilesets not supported');\n\n let url = `${apiBaseUrl}/v3/sql/${connectionName}/model/${model}`;\n\n const {\n data,\n filters,\n filtersLogicalOperator = 'and',\n spatialDataType = 'geo',\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialFiltersMode = 'intersects',\n } = source;\n\n const queryParams: Record<string, unknown> = {\n type,\n client: clientId,\n source: data,\n params,\n queryParameters: source.queryParameters || '',\n filters,\n filtersLogicalOperator,\n };\n\n queryParams.spatialDataType = spatialDataType;\n queryParams.spatialDataColumn = spatialDataColumn;\n\n if (source.spatialFilter) {\n // API supports multiple filters, we apply it only to spatialDataColumn\n queryParams.spatialFilters = {[spatialDataColumn]: source.spatialFilter};\n if (spatialDataType !== 'geo') {\n queryParams.spatialFiltersMode = spatialFiltersMode;\n }\n }\n\n const urlWithSearchParams =\n url + '?' + objectToURLSearchParams(queryParams).toString();\n const isGet = urlWithSearchParams.length <= REQUEST_GET_MAX_URL_LENGTH;\n if (isGet) {\n url = urlWithSearchParams;\n }\n return makeCall({\n url,\n accessToken: source.accessToken,\n opts: {\n ...opts,\n method: isGet ? 'GET' : 'POST',\n ...(!isGet && {body: JSON.stringify(queryParams)}),\n },\n });\n}\n\nfunction objectToURLSearchParams(object: Record<string, unknown>) {\n const params = new URLSearchParams();\n for (const key in object) {\n if (isPureObject(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (Array.isArray(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (object[key] === null) {\n params.append(key, 'null');\n } else if (object[key] !== undefined) {\n params.append(key, String(object[key] as unknown));\n }\n }\n return params;\n}\n","import {InvalidColumnError} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-api */\nexport interface ModelRequestOptions {\n method: 'GET' | 'POST';\n headers?: Record<string, string>;\n signal?: AbortSignal;\n otherOptions?: Record<string, unknown>;\n body?: string;\n}\n\ninterface ModelErrorResponse {\n error?: string | string[];\n hint?: string;\n column_name?: string;\n}\n\n/**\n * Return more descriptive error from API\n * @privateRemarks Source: @carto/react-api\n */\nexport function dealWithApiError({\n response,\n data,\n}: {\n response: Response;\n data: ModelErrorResponse;\n}) {\n if (data.error === 'Column not found') {\n throw new InvalidColumnError(`${data.error} ${data.column_name}`);\n }\n\n if (\n typeof data.error === 'string' &&\n data.error?.includes('Missing columns')\n ) {\n throw new InvalidColumnError(data.error);\n }\n\n switch (response.status) {\n case 401:\n throw new Error('Unauthorized access. Invalid credentials');\n case 403:\n throw new Error('Forbidden access to the requested data');\n default:\n throw new Error(\n data && data.error && typeof data.error === 'string'\n ? data.error\n : JSON.stringify(data?.hint || data.error?.[0])\n );\n }\n}\n\n/** @privateRemarks Source: @carto/react-api */\nexport async function makeCall({\n url,\n accessToken,\n opts,\n}: {\n url: string;\n accessToken: string;\n opts: ModelRequestOptions;\n}) {\n let response;\n let data;\n const isPost = opts?.method === 'POST';\n try {\n response = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...(isPost && {'Content-Type': 'application/json'}),\n ...opts.headers,\n },\n ...(isPost && {\n method: opts?.method,\n body: opts?.body,\n }),\n signal: opts?.signal,\n ...opts?.otherOptions,\n });\n data = await response.json();\n } catch (error) {\n if ((error as Error).name === 'AbortError') throw error;\n\n throw new Error(`Failed request: ${error as Error}`);\n }\n\n if (!response.ok) {\n dealWithApiError({response, data});\n }\n\n return data;\n}\n","import {FilterType} from './constants.js';\nimport type {Filter} from './types.js';\nimport {isEmptyObject} from './utils.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\ntype FilterTypeOptions<T extends FilterType> = {\n type: T;\n column: string;\n} & Filter[T];\n\nexport type AddFilterOptions =\n | FilterTypeOptions<FilterType.IN>\n | FilterTypeOptions<FilterType.BETWEEN>\n | FilterTypeOptions<FilterType.CLOSED_OPEN>\n | FilterTypeOptions<FilterType.TIME>\n | FilterTypeOptions<FilterType.STRING_SEARCH>;\n\n/**\n * Adds a {@link Filter} to the filter set. Any previous filters with the same\n * `column` and `type` will be replaced.\n */\nexport function addFilter(\n filters: Record<string, Filter>,\n {column, type, values, owner}: AddFilterOptions\n): Record<string, Filter> {\n if (!filters[column]) {\n filters[column] = {};\n }\n\n const filter = {values, owner} as FilterTypeOptions<typeof type>;\n (filters[column][type] as FilterTypeOptions<typeof type>) = filter;\n\n return filters;\n}\n\nexport type RemoveFilterOptions = {\n column: string;\n owner?: string;\n};\n\n/**\n * Removes one or more {@link Filter filters} from the filter set. If only\n * `column` is specified, then all filters on that column are removed. If both\n * `column` and `owner` are specified, then only filters for that column\n * associated with the owner are removed.\n */\nexport function removeFilter(\n filters: Record<string, Filter>,\n {column, owner}: RemoveFilterOptions\n): Record<string, Filter> {\n const filter = filters[column];\n if (!filter) {\n return filters;\n }\n\n if (owner) {\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n delete filter[type as FilterType];\n }\n }\n }\n\n if (!owner || isEmptyObject(filter)) {\n delete filters[column];\n }\n\n return filters;\n}\n\n/**\n * Clears all {@link Filter filters} from the filter set.\n */\nexport function clearFilters(\n filters: Record<string, Filter>\n): Record<string, Filter> {\n for (const column of Object.keys(filters)) {\n delete filters[column];\n }\n return filters;\n}\n\nexport type HasFilterOptions = {\n column: string;\n owner?: string;\n};\n\nexport function hasFilter(\n filters: Record<string, Filter>,\n {column, owner}: HasFilterOptions\n): boolean {\n const filter = filters[column];\n if (!filter) {\n return false;\n }\n\n if (!owner) {\n return true;\n }\n\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n return true;\n }\n }\n\n return false;\n}\n\nexport type GetFilterOptions<T extends FilterType> = {\n column: string;\n type: T;\n owner?: string;\n};\n\nexport function getFilter<T extends FilterType>(\n filters: Record<string, Filter>,\n {column, type, owner}: GetFilterOptions<T>\n): Filter[T] | null {\n const filter = filters[column];\n if (!filter) {\n return null;\n }\n\n if (!owner || owner === filter[type]?.owner) {\n return filter[type] || null;\n }\n\n return null;\n}\n\n/**\n * Given all filters for a dataset, returns the subset of filters that are not\n * attributable to the given owner. Typically used to allow filterable widgets\n * to affect other widgets *without* filtering themselves.\n *\n * @privateRemarks Source: @carto/react-widgets\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n","/**\n * Name of the category that represents the \"Others\" category.\n *\n * See `WidgetSource.getCategories` for more information.\n */\nexport const OTHERS_CATEGORY_NAME = '_carto_others';\n","import type {RasterMetadata} from '../sources/index.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceProps,\n} from './widget-tileset-source.js';\n\nexport type WidgetRasterSourceProps = WidgetTilesetSourceProps & {\n rasterMetadata: RasterMetadata;\n spatialDataType: 'quadbin';\n};\n\nexport type WidgetRasterSourceResult = {widgetSource: WidgetRasterSource};\n\nexport class WidgetRasterSource extends WidgetTilesetSource<WidgetRasterSourceProps> {}\n","import type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {TileFeatureExtractOptions} from '../filters/index.js';\nimport type {FeatureCollection} from 'geojson';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport {Method} from '../workers/constants.js';\nimport type {WorkerRequest, WorkerResponse} from '../workers/types.js';\nimport type {SpatialDataType, TilesetSourceOptions} from '../sources/types.js';\nimport {TileFormat} from '../constants.js';\nimport {WidgetTilesetSourceImpl} from './widget-tileset-source-impl.js';\n\nexport type WidgetTilesetSourceProps = WidgetSourceProps &\n Omit<TilesetSourceOptions, 'filters'> & {\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n };\n\nexport type WidgetTilesetSourceResult = {widgetSource: WidgetTilesetSource};\n\n/**\n * Source for Widget API requests on a data source defined by a tileset.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTilesetSource}, {@link h3TilesetSource}, or {@link quadbinTilesetSource},\n * which can be shared with map layers. Sources contain a `widgetSource`\n * property, for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTilesetSource } from '@carto/api-client';\n *\n * const data = vectorTilesetSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_rasters.my_tileset_source'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTilesetSource<\n Props extends WidgetTilesetSourceProps = WidgetTilesetSourceProps,\n> extends WidgetSource<Props> {\n protected _localImpl: WidgetTilesetSourceImpl | null = null;\n\n protected _workerImpl: Worker | null = null;\n protected _workerEnabled: boolean;\n protected _workerNextRequestId = 1;\n\n constructor(props: Props) {\n super(props);\n\n this._workerEnabled =\n (props.widgetWorker ?? true) &&\n TSUP_FORMAT !== 'cjs' &&\n typeof Worker !== 'undefined';\n\n if (!this._workerEnabled) {\n this._localImpl = new WidgetTilesetSourceImpl(this.props);\n }\n }\n\n destroy() {\n this._localImpl?.destroy();\n this._localImpl = null;\n\n this._workerImpl?.terminate();\n this._workerImpl = null;\n\n super.destroy();\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WEB WORKER MANAGEMENT\n\n /**\n * Returns an initialized Worker, to be reused for the lifecycle of this\n * source instance.\n */\n protected _getWorker(): Worker {\n if (this._workerImpl) {\n return this._workerImpl;\n }\n\n if (this.props.widgetWorkerUrl) {\n this._workerImpl = new Worker(this.props.widgetWorkerUrl, {\n name: 'cartowidgettileset',\n });\n } else {\n // For Vite (and perhaps other bundlers) to parse WorkerOptions, it\n // must be a static, inline object – duplicated below.\n this._workerImpl = new Worker(\n new URL('@carto/api-client/worker', import.meta.url),\n {\n type: 'module',\n name: 'cartowidgettileset',\n }\n );\n }\n\n this._workerImpl.addEventListener('error', (e) => {\n console.error('widget-tileset-source worker error', e);\n });\n\n this._workerImpl.postMessage({\n method: Method.INIT,\n params: [this.props],\n } as WorkerRequest);\n\n return this._workerImpl;\n }\n\n /** Executes a given method on the worker. */\n protected _executeWorkerMethod<T>(\n method: Method,\n params: unknown[],\n signal?: AbortSignal\n ): Promise<T> {\n if (!this._workerEnabled) {\n // @ts-expect-error No type-checking dynamic method name.\n return this._localImpl[method](...params);\n }\n\n const worker = this._getWorker();\n const requestId = this._workerNextRequestId++;\n\n let resolve: ((value: T) => void) | null = null;\n let reject: ((reason: any) => void) | null = null;\n\n // If worker sends message to main process, check whether it's a response\n // to this request, and whether the request can been aborted. Then resolve\n // or reject the Promise.\n function onMessage(e: MessageEvent) {\n const response = e.data as WorkerResponse;\n if (response.requestId !== requestId) return;\n if (signal?.aborted) return; // handled by 'abort' listener\n\n if (response.ok) {\n resolve!(response.result as T);\n } else {\n reject!(new Error(response.error));\n }\n }\n\n // If request is aborted by user, immediately reject the Promise.\n function onAbort() {\n reject!(new Error(signal!.reason));\n }\n\n worker.addEventListener('message', onMessage);\n signal?.addEventListener('abort', onAbort);\n\n // Send the task to the worker, creating a Promise to resolve/reject later.\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n\n worker.postMessage({\n requestId,\n method,\n params,\n } as WorkerRequest);\n });\n\n // Whether the task completes, fails, or aborts: clean up afterward.\n void promise.finally(() => {\n worker.removeEventListener('message', onMessage);\n signal?.removeEventListener('abort', onAbort);\n });\n\n return promise;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // DATA LOADING\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadTiles(tiles);\n }\n\n const worker = this._getWorker();\n\n // We cannot pass an instance of Tile2DHeader to a Web Worker, and must\n // extract properties required for widget calculations. Note that the\n // `tile: Tile = {...}` assignment is structured so TS will warn if any\n // types required by the internal 'Tile' type are missing.\n tiles = (tiles as Tile[]).map(\n ({id, index, bbox, isVisible, data}: Tile) => {\n const tile: Tile = {\n id,\n index,\n isVisible,\n data,\n bbox,\n };\n return tile;\n }\n );\n\n worker.postMessage({\n method: Method.LOAD_TILES,\n params: [tiles],\n } as WorkerRequest);\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n if (!this._workerEnabled) {\n return this._localImpl?.setTileFeatureExtractOptions(options);\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.SET_TILE_FEATURE_EXTRACT_OPTIONS,\n params: [options],\n });\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadGeoJSON({geojson, spatialFilter});\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.LOAD_GEOJSON,\n params: [{geojson, spatialFilter}],\n } as WorkerRequest);\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WIDGETS API\n\n // eslint-disable-next-line @typescript-eslint/require-await\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n signal,\n ...options\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n return this._executeWorkerMethod(Method.GET_FORMULA, [options], signal);\n }\n\n override async getHistogram({\n signal,\n ...options\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n return this._executeWorkerMethod(Method.GET_HISTOGRAM, [options], signal);\n }\n\n override async getCategories({\n signal,\n ...options\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n return this._executeWorkerMethod(Method.GET_CATEGORIES, [options], signal);\n }\n\n override async getScatter({\n signal,\n ...options\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n return this._executeWorkerMethod(Method.GET_SCATTER, [options], signal);\n }\n\n override async getTable({\n signal,\n ...options\n }: TableRequestOptions): Promise<TableResponse> {\n return this._executeWorkerMethod(Method.GET_TABLE, [options], signal);\n }\n\n override async getTimeSeries({\n signal,\n ...options\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n return this._executeWorkerMethod(Method.GET_TIME_SERIES, [options], signal);\n }\n\n override async getRange({\n signal,\n ...options\n }: RangeRequestOptions): Promise<RangeResponse> {\n return this._executeWorkerMethod(Method.GET_RANGE, [options], signal);\n }\n}\n","/* eslint-disable @typescript-eslint/require-await */\nimport type {\n CategoryRequestOptions,\n CategoryResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {InvalidColumnError, assert, assignOptional} from '../utils.js';\nimport type {Filter, SpatialFilter, Tile} from '../types.js';\n\nimport {\n type TileFeatureExtractOptions,\n applyFilters,\n geojsonFeatures,\n tileFeatures,\n} from '../filters/index.js';\nimport {\n aggregationFunctions,\n applySorting,\n groupValuesByColumn,\n groupValuesByDateColumn,\n histogram,\n scatterPlot,\n} from '../operations/index.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {FeatureCollection} from 'geojson';\nimport {WidgetSource} from './widget-source.js';\nimport {booleanEqual} from '@turf/boolean-equal';\nimport type {WidgetTilesetSourceProps} from './widget-tileset-source.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {AggregationTypes} from '../constants.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\n\n// TODO(cleanup): Parameter defaults in source functions and widget API calls are\n// currently duplicated and possibly inconsistent. Consider consolidating and\n// operating on Required<T> objects. See:\n// https://github.com/CartoDB/carto-api-client/issues/39\n\n/**\n * Local (in-memory) implementation of tileset widget calculations. This class\n * may be instantiated by {@link WidgetTilesetSource} in a Web Worker when\n * supported, or on the main thread.\n */\nexport class WidgetTilesetSourceImpl extends WidgetSource<WidgetTilesetSourceProps> {\n private _tiles: Tile[] = [];\n private _features: FeatureData[] = [];\n private _tileFeatureExtractOptions: TileFeatureExtractOptions = {};\n private _tileFeatureExtractPreviousInputs: {spatialFilter?: SpatialFilter} =\n {};\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n this._tiles = tiles as Tile[];\n this._features.length = 0;\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n this._tileFeatureExtractOptions = options;\n this._features.length = 0;\n }\n\n protected _extractTileFeatures(spatialFilter?: SpatialFilter) {\n // When spatial filter has not changed, don't redo extraction. If tiles or\n // tile extract options change, features will have been cleared already.\n const prevInputs = this._tileFeatureExtractPreviousInputs;\n if (\n this._features.length &&\n spatialFilterEquals(prevInputs.spatialFilter, spatialFilter)\n ) {\n return;\n }\n\n this._features = tileFeatures({\n ...assignOptional({}, this.props, this._tileFeatureExtractOptions),\n tiles: this._tiles,\n spatialFilter,\n });\n\n prevInputs.spatialFilter = spatialFilter;\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n this._features = geojsonFeatures({\n geojson,\n spatialFilter,\n ...this._tileFeatureExtractOptions,\n });\n this._tileFeatureExtractPreviousInputs.spatialFilter = spatialFilter;\n }\n\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n column = '*',\n operation = AggregationTypes.Count,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (filteredFeatures.length === 0 && operation !== AggregationTypes.Count) {\n return {value: null};\n }\n\n if (operation === AggregationTypes.Custom) {\n throw new Error('Custom aggregation not supported for tilesets');\n }\n\n // Column is required except when operation is 'count'.\n if ((column && column !== '*') || operation !== AggregationTypes.Count) {\n assertColumn(this._features, column);\n }\n\n const targetOperation = aggregationFunctions[operation];\n return {\n value: targetOperation(filteredFeatures, column, joinOperation),\n };\n }\n\n override async getHistogram({\n operation = AggregationTypes.Count,\n ticks,\n column,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n return [];\n }\n\n assertColumn(this._features, column);\n\n return histogram({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(column),\n joinOperation,\n ticks,\n operation,\n });\n }\n\n override async getCategories({\n column,\n operation = AggregationTypes.Count,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n othersThreshold,\n orderBy = 'frequency_desc',\n rawResult,\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, column, operationColumn as string);\n\n const result = groupValuesByColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n joinOperation,\n keysColumn: column,\n operation,\n othersThreshold,\n orderBy,\n });\n\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return result?.rows || [];\n }\n\n return [\n ...(result?.rows || []),\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n override async getScatter({\n xAxisColumn,\n yAxisColumn,\n xAxisJoinOperation,\n yAxisJoinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, xAxisColumn, yAxisColumn);\n\n return scatterPlot({\n data: filteredFeatures,\n xAxisColumns: normalizeColumns(xAxisColumn),\n xAxisJoinOperation,\n yAxisColumns: normalizeColumns(yAxisColumn),\n yAxisJoinOperation,\n });\n }\n\n override async getTable({\n columns,\n searchFilterColumn,\n searchFilterText,\n sortBy,\n sortDirection,\n sortByColumnType,\n offset = 0,\n limit = 10,\n filters,\n filterOwner,\n spatialFilter,\n }: TableRequestOptions): Promise<TableResponse> {\n // Filter.\n let filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: [], totalCount: 0};\n }\n\n // Search.\n // TODO(v0.6): Remove \"searchFilterText\" and \"searchFilterColumn\".\n if (searchFilterColumn && searchFilterText) {\n console.warn(\n 'WidgetTilesetSource: \"searchFilterText\" is deprecated, use \"filters\" and FilterType.STRING_SEARCH instead.'\n );\n filteredFeatures = filteredFeatures.filter(\n (row) =>\n row[searchFilterColumn] &&\n String(row[searchFilterColumn] as unknown)\n .toLowerCase()\n .includes(String(searchFilterText).toLowerCase())\n );\n }\n\n // Sort.\n let rows = applySorting(filteredFeatures, {\n sortBy,\n sortByDirection: sortDirection,\n sortByColumnType,\n });\n const totalCount = rows.length;\n\n // Offset and limit.\n rows = rows.slice(\n Math.min(offset, totalCount),\n Math.min(offset + limit, totalCount)\n );\n\n // Select columns.\n rows = rows.map((srcRow: FeatureData) => {\n const dstRow: FeatureData = {};\n for (const column of columns) {\n dstRow[column] = srcRow[column];\n }\n return dstRow;\n });\n\n return {rows, totalCount} as TableResponse;\n }\n\n override async getTimeSeries({\n column,\n stepSize,\n operation,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: []};\n }\n\n assertColumn(this._features, column, operationColumn as string);\n assert(\n operation !== 'custom',\n 'Custom operation not supported for tilesets'\n );\n\n const rows =\n groupValuesByDateColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n keysColumn: column,\n groupType: stepSize,\n operation,\n joinOperation,\n }) || [];\n\n return {rows};\n }\n\n override async getRange({\n column,\n filters,\n filterOwner,\n spatialFilter,\n }: RangeRequestOptions): Promise<RangeResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n // TODO: Is this the only nullable response in the Widgets API? If so,\n // can we do something more consistent?\n return null;\n }\n\n assertColumn(this._features, column);\n\n return {\n min: aggregationFunctions.min(filteredFeatures, column),\n max: aggregationFunctions.max(filteredFeatures, column),\n };\n }\n\n /****************************************************************************\n * INTERNAL\n */\n\n private _getFilteredFeatures(\n spatialFilter?: SpatialFilter,\n filters?: Record<string, Filter>,\n filterOwner?: string\n ): FeatureData[] {\n this._extractTileFeatures(spatialFilter);\n return applyFilters(\n this._features,\n getApplicableFilters(filterOwner, filters || this.props.filters),\n this.props.filtersLogicalOperator || 'and'\n );\n }\n}\n\nfunction assertColumn(\n features: FeatureData[],\n ...columnArgs: string[] | string[][]\n) {\n // Due to the multiple column shape, we normalise it as an array with normalizeColumns\n const columns = Array.from(new Set(columnArgs.map(normalizeColumns).flat()));\n\n const featureKeys = Object.keys(features[0]);\n\n // For backward compatibility, '' should pass column validation. For example,\n // operation='count',operationColumn='' is accepted.\n const invalidColumns = columns.filter(\n (column) => column && !featureKeys.includes(column)\n );\n\n if (invalidColumns.length) {\n throw new InvalidColumnError(\n `Missing column(s): ${invalidColumns.join(', ')}`\n );\n }\n}\n\nfunction normalizeColumns(columns: string | string[]): string[] {\n return Array.isArray(columns)\n ? columns\n : typeof columns === 'string'\n ? [columns]\n : [];\n}\n\nfunction spatialFilterEquals(a?: SpatialFilter, b?: SpatialFilter) {\n if (a === b) return true;\n if (!a || !b) return false;\n return booleanEqual(a, b);\n}\n","import type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type AggregationFunction = (\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n) => number;\n\n/** @privateRemarks Source: @carto/react-core */\nexport const aggregationFunctions: Record<\n Exclude<AggregationType, 'custom'>,\n AggregationFunction\n> = {\n count: (values) => values.length,\n min: (...args) => applyAggregationFunction(min, ...args),\n max: (...args) => applyAggregationFunction(max, ...args),\n sum: (...args) => applyAggregationFunction(sum, ...args),\n avg: (...args) => applyAggregationFunction(avg, ...args),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function aggregate(\n feature: FeatureData,\n keys?: string[],\n operation?: AggregationType\n): unknown {\n if (!keys?.length) {\n throw new Error('Cannot aggregate a feature without having keys');\n } else if (keys.length === 1) {\n const value = feature[keys[0]];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n }\n\n const aggregationFn =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!aggregationFn) {\n throw new Error(`${operation} isn't a valid aggregation function`);\n }\n\n return aggregationFn(\n keys.map((column) => {\n const value = feature[column];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n })\n );\n}\n\n/*\n * Forced casting to Number (just of non empty strings) allows to work-around\n * some specific situations, where a big numeric field is transformed into a string when generating the tileset(eg.PG)\n */\nfunction isPotentiallyValidNumber(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nconst applyAggregationFunction = (\n aggFn: AggregationFunction,\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n operation?: AggregationType\n) => {\n const normalizedKeys = normalizeKeys(keys);\n const elements =\n (normalizedKeys?.length || 0) <= 1\n ? filterFalsyElements(values as unknown[], normalizedKeys || [])\n : values;\n return aggFn(elements, keys, operation);\n};\n\nfunction filterFalsyElements(\n values: unknown[] | FeatureData[],\n keys: string[]\n) {\n const filterFn = (value: unknown) => value !== null && value !== undefined;\n\n if (!keys?.length) {\n return values.filter(filterFn);\n }\n\n return (values as FeatureData[]).filter((v) => filterFn(v[keys[0]]));\n}\n\n// Aggregation functions\nfunction avg(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n return sum(values, keys, joinOperation) / (values.length || 1);\n}\n\nfunction sum(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) => a + (aggregate(b, normalizedKeys, joinOperation) as number),\n 0\n );\n }\n\n return values.reduce((a: number, b: unknown) => a + (b as number), 0);\n}\n\nfunction min(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.min(a, aggregate(b, normalizedKeys, joinOperation) as number),\n Infinity\n );\n }\n\n let min = Number.POSITIVE_INFINITY;\n for (const value of values as number[]) {\n min = Math.min(min, value);\n }\n return min;\n}\n\nfunction max(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.max(a, aggregate(b, normalizedKeys, joinOperation) as number),\n -Infinity\n );\n }\n\n let max = Number.NEGATIVE_INFINITY;\n for (const value of values as number[]) {\n max = Math.max(max, value);\n }\n return max;\n}\n\n// Aux\n\n// Keys can come as a string (one column) or a strings array (multiple column)\n// Use always an array to make the code easier\nfunction normalizeKeys(keys: unknown): string[] | undefined {\n return Array.isArray(keys)\n ? keys\n : typeof keys === 'string'\n ? [keys]\n : undefined;\n}\n","import {firstBy} from 'thenby';\nimport type {SortDirection} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n// TODO(cleanup): Could this be simplified?\ntype SortColumns = string | string[] | object[];\n\ninterface SortOptions {\n sortBy?: SortColumns;\n sortByDirection?: SortDirection;\n sortByColumnType?: 'number' | 'string' | 'date';\n}\n\n/**\n * Apply sort structure to a collection of features\n * @param features\n * @param [sortOptions]\n * @param [sortOptions.sortBy] - One or more columns to sort by\n * @param [sortOptions.sortByDirection] - Direction by the columns will be sorted\n * @param [sortOptions.sortByColumnType] - Column type\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function applySorting(\n features: FeatureData[],\n {\n sortBy,\n sortByDirection = 'asc',\n sortByColumnType = 'string',\n }: SortOptions = {}\n): FeatureData[] {\n // If sortBy is undefined, pass all features\n if (sortBy === undefined) {\n return features;\n }\n\n // sortOptions exists, but are bad formatted\n const isValidSortBy =\n (Array.isArray(sortBy) && sortBy.length) || // sortBy can be an array of columns\n typeof sortBy === 'string'; // or just one column\n\n if (!isValidSortBy) {\n throw new Error('Sorting options are bad formatted');\n }\n const sortFn = createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType: sortByColumnType || 'string',\n });\n return features.sort(sortFn);\n}\n\n// Aux\nfunction createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const [firstSortOption, ...othersSortOptions] = normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n }) as Parameters<typeof firstBy>[];\n\n let sortFn = firstBy(...firstSortOption);\n for (const sortOptions of othersSortOptions) {\n sortFn = sortFn.thenBy(...sortOptions);\n }\n\n return sortFn;\n}\n\nfunction normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const numberFormat = sortByColumnType === 'number' && {\n cmp: (a: number, b: number) => a - b,\n };\n if (!Array.isArray(sortBy)) {\n sortBy = [sortBy];\n }\n return sortBy.map((sortByEl) => {\n // sortByEl is 'column'\n if (typeof sortByEl === 'string') {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n if (Array.isArray(sortByEl)) {\n // sortBy is ['column']\n if (sortByEl[1] === undefined) {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n // sortBy is ['column', { ... }]\n if (typeof sortByEl[1] === 'object') {\n const othersSortOptions = numberFormat\n ? {...numberFormat, ...sortByEl[1]}\n : sortByEl[1];\n return [\n sortByEl[0],\n {direction: sortByDirection, ...othersSortOptions},\n ];\n }\n }\n return sortByEl;\n });\n}\n","import {aggregationFunctions, aggregate} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n CategoryOrderBy,\n CategoryResponseEntry,\n CategoryResponseRaw,\n} from '../widget-sources/types.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n operation,\n othersThreshold,\n orderBy = 'frequency_desc',\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: AggregationType;\n keysColumn: string;\n operation: AggregationType;\n othersThreshold?: number;\n orderBy?: CategoryOrderBy;\n}): CategoryResponseRaw | null {\n if (Array.isArray(data) && data.length === 0) {\n return {rows: null};\n }\n const groups = data.reduce((accumulator, item) => {\n const group = item[keysColumn];\n\n const values = accumulator.get(group) || [];\n accumulator.set(group, values);\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid =\n (operation === 'count' ? true : aggregatedValue !== null) &&\n aggregatedValue !== undefined;\n\n if (isValid) {\n values.push(aggregatedValue);\n accumulator.set(group, values);\n }\n\n return accumulator;\n }, new Map()); // We use a map to be able to maintain the type in the key value\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!targetOperation) {\n return {rows: []};\n }\n\n const allCategories = Array.from(groups)\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort(getSorter(orderBy));\n\n if (othersThreshold && allCategories.length > othersThreshold) {\n const otherValue = allCategories\n .slice(othersThreshold)\n .flatMap(({name}) => groups.get(name));\n return {\n rows: allCategories,\n metadata: {\n others: targetOperation(otherValue),\n },\n };\n }\n\n return {\n rows: allCategories,\n };\n}\n\nexport function getSorter(\n orderBy: CategoryOrderBy\n): (a: CategoryResponseEntry, b: CategoryResponseEntry) => number {\n switch (orderBy) {\n case 'frequency_asc':\n // 'value ASC, name ASC'\n return (a, b) => a.value - b.value || localeCompare(a.name, b.name);\n case 'frequency_desc':\n // 'value DESC, name ASC'\n return (a, b) => b.value - a.value || localeCompare(a.name, b.name);\n case 'alphabetical_asc':\n // 'name ASC, value DESC'\n return (a, b) => localeCompare(a.name, b.name) || b.value - a.value;\n case 'alphabetical_desc':\n // 'name DESC, value DESC'\n return (a, b) => localeCompare(b.name, a.name) || b.value - a.value;\n }\n}\n\nfunction localeCompare(a?: string | null, b?: string | null) {\n return (a ?? 'null').localeCompare(b ?? 'null');\n}\n","import type {AggregationType, GroupDateType} from '../types.js';\nimport {getUTCMonday} from '../utils/dateUtils.js';\nimport {aggregate, aggregationFunctions} from './aggregation.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type GroupByFeature = {\n name: string;\n value: number;\n}[];\n\nconst GROUP_KEY_FN_MAPPING: Record<GroupDateType, (date: Date) => number> = {\n year: (date: Date) => Date.UTC(date.getUTCFullYear()),\n month: (date: Date) => Date.UTC(date.getUTCFullYear(), date.getUTCMonth()),\n week: (date: Date) => getUTCMonday(date),\n day: (date: Date) =>\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()),\n hour: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours()\n ),\n minute: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes()\n ),\n second: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds()\n ),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByDateColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n groupType,\n operation,\n}: {\n data: Record<string, unknown>[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n keysColumn: string;\n groupType: GroupDateType;\n operation?: Exclude<AggregationType, 'custom'>;\n}): GroupByFeature | null {\n if (Array.isArray(data) && data.length === 0) {\n return null;\n }\n\n const groupKeyFn = GROUP_KEY_FN_MAPPING[groupType];\n\n if (!groupKeyFn) {\n return null;\n }\n\n const groups = data.reduce((acc, item) => {\n const value = item[keysColumn];\n const formattedValue = new Date(value as number);\n const groupKey = groupKeyFn(formattedValue);\n\n if (!isNaN(groupKey)) {\n let groupedValues = acc.get(groupKey);\n if (!groupedValues) {\n groupedValues = [];\n acc.set(groupKey, groupedValues);\n }\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid = aggregatedValue !== null && aggregatedValue !== undefined;\n\n if (isValid) {\n groupedValues.push(aggregatedValue);\n acc.set(groupKey, groupedValues);\n }\n }\n\n return acc;\n }, new Map());\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n return [...groups.entries()]\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort((a, b) => a.name - b.name);\n}\n","/**\n * Returns midnight (local time) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getDay();\n const diff = dateCp.getDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setDate(diff);\n dateCp.setHours(0, 0, 0, 0);\n return dateCp.getTime();\n}\n\n/**\n * Returns midnight (UTC) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getUTCMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getUTCDay();\n const diff = dateCp.getUTCDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setUTCDate(diff);\n return Date.UTC(\n dateCp.getUTCFullYear(),\n dateCp.getUTCMonth(),\n dateCp.getUTCDate()\n );\n}\n","import {aggregate, aggregationFunctions} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/**\n * Histogram computation.\n * @privateRemarks Source: @carto/react-core\n */\nexport function histogram({\n data,\n valuesColumns,\n joinOperation,\n ticks,\n operation,\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n ticks: number[];\n operation: Exclude<AggregationType, 'custom'>;\n}): number[] {\n if (Array.isArray(data) && data.length === 0) {\n return [];\n }\n\n const binsContainer = [Number.MIN_SAFE_INTEGER, ...ticks].map(\n (tick, index, arr) => ({\n bin: index,\n start: tick,\n end: index === arr.length - 1 ? Number.MAX_SAFE_INTEGER : arr[index + 1],\n values: [] as number[],\n })\n );\n\n data.forEach((feature) => {\n const featureValue = aggregate(\n feature,\n valuesColumns,\n joinOperation\n ) as number;\n\n const isValid = featureValue !== null && featureValue !== undefined;\n\n if (!isValid) {\n return;\n }\n\n const binContainer = binsContainer.find(\n (bin) => bin.start <= featureValue && bin.end > featureValue\n );\n\n if (!binContainer) {\n return;\n }\n\n binContainer.values.push(featureValue);\n });\n\n const targetOperation = aggregationFunctions[operation];\n const transformedBins = binsContainer.map(\n (binContainer) => binContainer.values\n );\n return transformedBins.map((values) =>\n values.length ? targetOperation(values) : 0\n );\n}\n","import {aggregate} from './aggregation.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {AggregationType} from '../types.js';\n\nexport type ScatterPlotFeature = [number, number][];\n\n/**\n * Filters invalid features and formats data.\n * @privateRemarks Source: @carto/react-core\n */\nexport function scatterPlot({\n data,\n xAxisColumns,\n xAxisJoinOperation,\n yAxisColumns,\n yAxisJoinOperation,\n}: {\n data: FeatureData[];\n xAxisColumns: string[];\n xAxisJoinOperation?: AggregationType;\n yAxisColumns: string[];\n yAxisJoinOperation?: AggregationType;\n}): ScatterPlotFeature {\n return data.reduce(\n (acc, feature) => {\n const xValue = aggregate(\n feature,\n xAxisColumns,\n xAxisJoinOperation\n ) as number;\n\n const xIsValid = xValue !== null && xValue !== undefined;\n\n const yValue = aggregate(\n feature,\n yAxisColumns,\n yAxisJoinOperation\n ) as number;\n\n const yIsValid = yValue !== null && yValue !== undefined;\n\n if (xIsValid && yIsValid) {\n acc.push([xValue, yValue]);\n }\n\n return acc;\n },\n [] as [number, number][]\n );\n}\n","import {\n Feature,\n LineString,\n Position,\n GeoJSON,\n Point,\n Polygon,\n GeometryCollection,\n FeatureCollection,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\n/**\n\n * GeoJSON equality checking utility.\n * Adapted from https://github.com/geosquare/geojson-equality\n *\n * @memberof helpers\n * @type {Class}\n */\nclass GeojsonEquality {\n private precision: number;\n private direction = false;\n private compareProperties = true;\n\n constructor(opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }) {\n this.precision = 10 ** -(opts?.precision ?? 17);\n this.direction = opts?.direction ?? false;\n this.compareProperties = opts?.compareProperties ?? true;\n }\n\n compare(g1: GeoJSON, g2: GeoJSON): boolean {\n if (g1.type !== g2.type) {\n return false;\n }\n\n if (!sameLength(g1, g2)) {\n return false;\n }\n\n switch (g1.type) {\n case \"Point\":\n return this.compareCoord(g1.coordinates, (g2 as Point).coordinates);\n case \"LineString\":\n return this.compareLine(g1.coordinates, (g2 as LineString).coordinates);\n case \"Polygon\":\n return this.comparePolygon(g1, g2 as Polygon);\n case \"GeometryCollection\":\n return this.compareGeometryCollection(g1, g2 as GeometryCollection);\n case \"Feature\":\n return this.compareFeature(g1, g2 as Feature);\n case \"FeatureCollection\":\n return this.compareFeatureCollection(g1, g2 as FeatureCollection);\n default:\n if (g1.type.startsWith(\"Multi\")) {\n const g1s = explode(g1);\n const g2s = explode(\n g2 as MultiLineString | MultiPoint | MultiPolygon\n );\n return g1s.every((g1part) =>\n g2s.some((g2part) => this.compare(g1part as any, g2part as any))\n );\n }\n }\n return false;\n }\n\n private compareCoord(c1: Position, c2: Position) {\n return (\n c1.length === c2.length &&\n c1.every((c, i) => Math.abs(c - c2[i]) < this.precision)\n );\n }\n\n private compareLine(\n path1: Position[],\n path2: Position[],\n ind = 0,\n isPoly = false\n ): boolean {\n if (!sameLength(path1, path2)) {\n return false;\n }\n const p1 = path1;\n let p2 = path2;\n if (isPoly && !this.compareCoord(p1[0], p2[0])) {\n // fix start index of both to same point\n const startIndex = this.fixStartIndex(p2, p1);\n if (!startIndex) {\n return false;\n } else {\n p2 = startIndex;\n }\n }\n // for linestring ind =0 and for polygon ind =1\n const sameDirection = this.compareCoord(p1[ind], p2[ind]);\n if (this.direction || sameDirection) {\n return this.comparePath(p1, p2);\n } else {\n if (this.compareCoord(p1[ind], p2[p2.length - (1 + ind)])) {\n return this.comparePath(p1.slice().reverse(), p2);\n }\n return false;\n }\n }\n\n private fixStartIndex(sourcePath: Position[], targetPath: Position[]) {\n //make sourcePath first point same as of targetPath\n let correctPath,\n ind = -1;\n for (let i = 0; i < sourcePath.length; i++) {\n if (this.compareCoord(sourcePath[i], targetPath[0])) {\n ind = i;\n break;\n }\n }\n if (ind >= 0) {\n correctPath = ([] as Position[]).concat(\n sourcePath.slice(ind, sourcePath.length),\n sourcePath.slice(1, ind + 1)\n );\n }\n return correctPath;\n }\n\n private comparePath(p1: Position[], p2: Position[]) {\n return p1.every((c, i) => this.compareCoord(c, p2[i]));\n }\n\n private comparePolygon(g1: Polygon, g2: Polygon) {\n if (this.compareLine(g1.coordinates[0], g2.coordinates[0], 1, true)) {\n const holes1 = g1.coordinates.slice(1, g1.coordinates.length);\n const holes2 = g2.coordinates.slice(1, g2.coordinates.length);\n return holes1.every((h1) =>\n holes2.some((h2) => this.compareLine(h1, h2, 1, true))\n );\n }\n return false;\n }\n\n private compareGeometryCollection(\n g1: GeometryCollection,\n g2: GeometryCollection\n ) {\n return (\n sameLength(g1.geometries, g2.geometries) &&\n this.compareBBox(g1, g2) &&\n g1.geometries.every((g, i) => this.compare(g, g2.geometries[i]))\n );\n }\n\n private compareFeature(g1: Feature, g2: Feature) {\n return (\n g1.id === g2.id &&\n (this.compareProperties ? equal(g1.properties, g2.properties) : true) &&\n this.compareBBox(g1, g2) &&\n this.compare(g1.geometry, g2.geometry)\n );\n }\n\n private compareFeatureCollection(\n g1: FeatureCollection,\n g2: FeatureCollection\n ) {\n return (\n sameLength(g1.features, g2.features) &&\n this.compareBBox(g1, g2) &&\n g1.features.every((f, i) => this.compare(f, g2.features[i]))\n );\n }\n\n private compareBBox(g1: GeoJSON, g2: GeoJSON): boolean {\n return (\n Boolean(!g1.bbox && !g2.bbox) ||\n (g1.bbox && g2.bbox ? this.compareCoord(g1.bbox, g2.bbox) : false)\n );\n }\n}\n\nfunction sameLength(g1: any, g2: any) {\n return g1.coordinates\n ? g1.coordinates.length === g2.coordinates.length\n : g1.length === g2.length;\n}\n\nfunction explode(g: MultiLineString | MultiPoint | MultiPolygon) {\n return g.coordinates.map((part) => ({\n type: g.type.replace(\"Multi\", \"\"),\n coordinates: part,\n }));\n}\n\nfunction geojsonEquality(\n g1: GeoJSON,\n g2: GeoJSON,\n opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }\n): boolean {\n const eq = new GeojsonEquality(opts);\n\n return eq.compare(g1, g2);\n}\n\n// Adapted from https://medium.com/syncfusion/5-different-ways-to-deep-compare-javascript-objects-6708a0da9f05\nfunction equal(object1: GeoJsonProperties, object2: GeoJsonProperties) {\n if (object1 === null && object2 === null) {\n return true;\n }\n\n if (object1 === null || object2 === null) {\n return false;\n }\n\n const objKeys1 = Object.keys(object1);\n const objKeys2 = Object.keys(object2);\n\n if (objKeys1.length !== objKeys2.length) return false;\n\n for (var key of objKeys1) {\n const value1 = object1[key];\n const value2 = object2[key];\n\n const isObjects = isObject(value1) && isObject(value2);\n\n if (\n (isObjects && !equal(value1, value2)) ||\n (!isObjects && value1 !== value2)\n ) {\n return false;\n }\n }\n return true;\n}\n\nconst isObject = (object: any) => {\n return object != null && typeof object === \"object\";\n};\n\nexport { GeojsonEquality, geojsonEquality };\nexport default GeojsonEquality;\n","import type {\n H3TableSourceOptions,\n QuadbinTableSourceOptions,\n VectorTableSourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerTableSourceOptions =\n | Omit<VectorTableSourceOptions, 'filters'>\n | Omit<H3TableSourceOptions, 'filters'>\n | Omit<QuadbinTableSourceOptions, 'filters'>;\n\nexport type WidgetTableSourceResult = {widgetSource: WidgetTableSource};\n\n/**\n * Source for Widget API requests on a data source defined as a table.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTableSource}, {@link h3TableSource}, or {@link quadbinTableSource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTableSource } from '@carto/api-client';\n *\n * const data = vectorTableSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTableSource extends WidgetRemoteSource<\n LayerTableSourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'table',\n data: this.props.tableName,\n };\n }\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type H3TableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type H3TableSourceResponse = TilejsonResult & WidgetTableSourceResult;\n\nexport const h3TableSource = async function (\n options: H3TableSourceOptions\n): Promise<H3TableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n spatialDataColumn = 'h3',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type H3TilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type H3TilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const h3TilesetSource = async function (\n options: H3TilesetSourceOptions\n): Promise<H3TilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'h3'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'h3',\n }),\n })\n ) as Promise<H3TilesetSourceResponse>;\n};\n","import {TileFormat} from '../constants.js';\nimport type {Tilejson} from '../sources/types.js';\n\nexport function getTileFormat(tilejson: Tilejson): TileFormat {\n const tileParams = new URL(tilejson.tiles[0]).searchParams;\n return tileParams.get('formatTiles') === 'mvt'\n ? TileFormat.MVT\n : TileFormat.BINARY;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetRasterSource,\n type WidgetRasterSourceResult,\n} from '../widget-sources/index.js';\n\nimport type {\n FilterOptions,\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type RasterSourceOptions = SourceOptions &\n TilesetSourceOptions &\n FilterOptions;\ntype UrlParameters = {\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type RasterSourceResponse = TilejsonResult & WidgetRasterSourceResult;\n\nexport const rasterSource = async function (\n options: RasterSourceOptions\n): Promise<RasterSourceResponse> {\n const {tableName, filters} = options;\n const urlParameters: UrlParameters = {name: tableName};\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('raster', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetRasterSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn: 'quadbin',\n spatialDataType: 'quadbin',\n rasterMetadata: result.raster_metadata!,\n }),\n })\n ) as Promise<RasterSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const quadbinQuerySource = async function (\n options: QuadbinQuerySourceOptions\n): Promise<QuadbinQuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n sqlQuery,\n spatialDataColumn = 'quadbin',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n q: sqlQuery,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinTableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const quadbinTableSource = async function (\n options: QuadbinTableSourceOptions\n): Promise<QuadbinTableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n spatialDataColumn = 'quadbin',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type QuadbinTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type QuadbinTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const quadbinTilesetSource = async function (\n options: QuadbinTilesetSourceOptions\n): Promise<QuadbinTilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'quadbin'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'quadbin',\n }),\n })\n ) as Promise<QuadbinTilesetSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n SourceOptions,\n QuerySourceOptions,\n SpatialDataType,\n TilejsonResult,\n ColumnsOption,\n} from './types.js';\n\nexport type VectorQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n aggregationExp?: string;\n};\n\nexport type VectorQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const vectorQuerySource = async function (\n options: VectorQuerySourceOptions\n): Promise<VectorQuerySourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n sqlQuery,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n queryParameters,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n q: sqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n ColumnsOption,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTableSourceOptions = SourceOptions &\n TableSourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n name: string;\n aggregationExp?: string;\n};\n\nexport type VectorTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const vectorTableSource = async function (\n options: VectorTableSourceOptions\n): Promise<VectorTableSourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n tableName,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilesetSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type VectorTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const vectorTilesetSource = async function (\n options: VectorTilesetSourceOptions\n): Promise<VectorTilesetSourceResponse> {\n const {tableName, spatialDataColumn = DEFAULT_GEO_COLUMN} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'geo',\n }),\n })\n ) as Promise<VectorTilesetSourceResponse>;\n};\n","import {DEFAULT_API_BASE_URL} from '../constants.js';\n\nimport {\n type APIErrorContext,\n CartoAPIError,\n buildPublicMapUrl,\n buildStatsUrl,\n requestWithParameters,\n} from '../api/index.js';\n\nimport {type ParseMapResult, parseMap} from './parse-map.js';\nimport {assert} from '../utils.js';\nimport type {Basemap, Dataset, KeplerMapConfig} from './types.js';\nimport {fetchBasemapProps} from './basemap.js';\nimport {configureSource} from './source.js';\nimport type {Filters} from '../types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\n\n/* global clearInterval, setInterval, URL */\nasync function _fetchMapDataset(\n dataset: Dataset,\n filters: Filters,\n context: _FetchMapContext\n) {\n const {connectionName} = dataset;\n const cache: {value?: number} = {};\n const configuredSource = configureSource({\n dataset,\n filters: isRemoteCalculationSupported(dataset) ? filters : undefined,\n options: {\n ...context,\n connection: connectionName,\n headers: context.headers,\n accessToken: context.accessToken!,\n apiBaseUrl: context.apiBaseUrl,\n maxLengthURL: context.maxLengthURL,\n },\n });\n dataset.data = await configuredSource;\n\n let cacheChanged = true;\n if (cache.value) {\n cacheChanged = dataset.cache !== cache.value;\n dataset.cache = cache.value;\n }\n\n return cacheChanged;\n}\n\nasync function _fetchTilestats(\n attribute: string,\n dataset: Dataset,\n context: _FetchMapContext\n) {\n const {connectionName, data, id, source, type, queryParameters} = dataset;\n const {apiBaseUrl} = context;\n const errorContext: APIErrorContext = {\n requestType: 'Tile stats',\n connection: connectionName,\n type,\n source,\n };\n if (!('tilestats' in data)) {\n throw new CartoAPIError(\n new Error(`Invalid dataset for tilestats: ${id}`),\n errorContext\n );\n }\n\n const baseUrl = buildStatsUrl({attribute, apiBaseUrl, ...dataset});\n const client = new URLSearchParams(data.tiles[0]).get('client');\n const headers = {Authorization: `Bearer ${context.accessToken}`};\n const parameters: Record<string, string> = {};\n if (client) {\n parameters.client = client;\n }\n if (type === 'query') {\n parameters.q = source;\n if (queryParameters) {\n parameters.queryParameters = JSON.stringify(queryParameters);\n }\n }\n const stats = await requestWithParameters({\n baseUrl,\n headers,\n parameters,\n errorContext,\n maxLengthURL: context.maxLengthURL,\n });\n\n // Replace tilestats for attribute with value from API\n const {attributes} = data.tilestats.layers[0];\n const index = attributes.findIndex((d) => d.attribute === attribute);\n attributes[index] = stats;\n return true;\n}\n\nasync function fillInMapDatasets(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const {filters} = keplerMapConfig.config as KeplerMapConfig;\n const promises = datasets.map((dataset) =>\n _fetchMapDataset(dataset, filters[dataset.id], context)\n );\n return await Promise.all(promises);\n}\n\nasync function fillInTileStats(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const attributes: {attribute: string; dataset: any}[] = [];\n const {layers} = keplerMapConfig.config.visState;\n for (const layer of layers) {\n for (const channel of Object.keys(layer.visualChannels)) {\n const attribute = layer.visualChannels[channel]?.name;\n if (attribute) {\n const dataset = datasets.find((d) => d.id === layer.config.dataId);\n if (dataset && dataset.type !== 'tileset' && dataset.data.tilestats) {\n // Only fetch stats for QUERY & TABLE map types\n attributes.push({attribute, dataset});\n }\n }\n }\n }\n // Remove duplicates to avoid repeated requests\n const filteredAttributes: {attribute: string; dataset: any}[] = [];\n for (const a of attributes) {\n if (\n !filteredAttributes.find(\n ({attribute, dataset}) =>\n attribute === a.attribute && dataset === a.dataset\n )\n ) {\n filteredAttributes.push(a);\n }\n }\n\n const promises = filteredAttributes.map(({attribute, dataset}) =>\n _fetchTilestats(attribute, dataset, context)\n );\n return await Promise.all(promises);\n}\n\nexport type FetchMapOptions = {\n /**\n * CARTO platform access token. Only required for private maps.\n */\n accessToken?: string;\n\n /**\n * Base URL of the CARTO Maps API.\n *\n * Example for account located in EU-west region: `https://gcp-eu-west1.api.carto.com`\n *\n * @default https://gcp-us-east1.api.carto.com\n */\n apiBaseUrl?: string;\n\n /**\n * Identifier of map created in CARTO Builder.\n */\n cartoMapId: string;\n clientId?: string;\n\n /**\n * Custom HTTP headers added to map instantiation and data requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Interval in seconds at which to autoRefresh the data. If provided, `onNewData` must also be provided.\n */\n autoRefresh?: number;\n\n /**\n * Callback function that will be invoked whenever data in layers is changed. If provided, `autoRefresh` must also be provided.\n */\n onNewData?: (map: any) => void;\n\n /**\n * Maximum URL character length. Above this limit, requests use POST.\n * Used to avoid browser and CDN limits.\n * @default {@link DEFAULT_MAX_LENGTH_URL}\n */\n maxLengthURL?: number;\n};\n\n/**\n * Context reused while fetching and updating a map with fetchMap().\n */\ntype _FetchMapContext = {apiBaseUrl: string} & Pick<\n FetchMapOptions,\n 'accessToken' | 'clientId' | 'headers' | 'maxLengthURL'\n>;\n\nexport type FetchMapResult = ParseMapResult & {\n /**\n * Basemap properties.\n */\n basemap: Basemap | null;\n stopAutoRefresh?: () => void;\n};\n\nexport async function fetchMap({\n accessToken,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n cartoMapId,\n clientId,\n headers,\n autoRefresh,\n onNewData,\n maxLengthURL,\n}: FetchMapOptions): Promise<FetchMapResult> {\n assert(\n cartoMapId,\n 'Must define CARTO map id: fetchMap({cartoMapId: \"XXXX-XXXX-XXXX\"})'\n );\n\n if (accessToken) {\n headers = {Authorization: `Bearer ${accessToken}`, ...headers};\n }\n\n if (autoRefresh || onNewData) {\n assert(onNewData, 'Must define `onNewData` when using autoRefresh');\n assert(typeof onNewData === 'function', '`onNewData` must be a function');\n assert(\n typeof autoRefresh === 'number' && autoRefresh > 0,\n '`autoRefresh` must be a positive number'\n );\n }\n\n const baseUrl = buildPublicMapUrl({apiBaseUrl, cartoMapId});\n const errorContext: APIErrorContext = {\n requestType: 'Public map',\n mapId: cartoMapId,\n };\n const map = await requestWithParameters({\n baseUrl,\n headers,\n errorContext,\n maxLengthURL,\n });\n const context: _FetchMapContext = {\n accessToken: map.token || accessToken,\n apiBaseUrl,\n clientId,\n headers,\n maxLengthURL,\n };\n\n // Periodically check if the data has changed. Note that this\n // will not update when a map is published.\n let stopAutoRefresh: (() => void) | undefined;\n if (autoRefresh) {\n const intervalId = setInterval(async () => {\n const changed = await fillInMapDatasets(map, {\n ...context,\n headers: {\n ...headers,\n 'If-Modified-Since': new Date().toUTCString(),\n },\n });\n if (onNewData && changed.some((v) => v === true)) {\n onNewData(parseMap(map));\n }\n }, autoRefresh * 1000);\n stopAutoRefresh = () => {\n clearInterval(intervalId);\n };\n }\n\n const geojsonLayers = map.keplerMapConfig.config.visState.layers.filter(\n ({type}: {type: string}) => type === 'geojson' || type === 'point'\n );\n const geojsonDatasetIds = geojsonLayers.map(\n ({config}: {config: any}) => config.dataId\n );\n map.datasets.forEach((dataset: any) => {\n if (geojsonDatasetIds.includes(dataset.id)) {\n const {config} = geojsonLayers.find(\n ({config}: {config: any}) => config.dataId === dataset.id\n );\n dataset.format = 'geojson';\n // Support for very old maps. geoColumn was not stored in the past\n if (!dataset.geoColumn && config.columns.geojson) {\n dataset.geoColumn = config.columns.geojson;\n }\n }\n });\n\n const [basemap] = await Promise.all([\n fetchBasemapProps({config: map.keplerMapConfig.config, errorContext}),\n\n // Mutates map.datasets so that dataset.data contains data\n fillInMapDatasets(map, context),\n ]);\n\n // Mutates attributes in visualChannels to contain tile stats\n await fillInTileStats(map, context);\n\n const out = {...parseMap(map), basemap, ...{stopAutoRefresh}};\n\n const textLayers = out.layers.filter((layer: any) => {\n const pointType = layer.props?.pointType || '';\n return pointType.includes('text');\n });\n\n /* global FontFace, window, document */\n if (\n textLayers.length &&\n window.FontFace &&\n !document.fonts.check('12px Inter')\n ) {\n // Fetch font needed for labels\n const font = new FontFace(\n 'Inter',\n 'url(https://fonts.gstatic.com/s/inter/v12/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2)'\n );\n await font.load().then((f) => document.fonts.add(f));\n }\n\n return out as FetchMapResult;\n}\n","import type {ColorParameters} from '@luma.gl/core';\nimport {\n calculateClusterRadius,\n calculateClusterTextFontSize,\n getDefaultAggregationExpColumnAliasForLayerType,\n getLayerProps,\n getColorAccessor,\n getSizeAccessor,\n getTextAccessor,\n opacityToAlpha,\n getIconUrlAccessor,\n negateAccessor,\n getMaxMarkerSize,\n type LayerType,\n OPACITY_MAP,\n TEXT_NUMBER_FORMATTER,\n TEXT_LABEL_INDEX,\n TEXT_OUTLINE_OPACITY,\n type D3Scale,\n type ScaleType,\n} from './layer-map.js';\n\nimport {assert, isEmptyObject} from '../utils.js';\nimport type {Filters} from '../types.js';\nimport type {\n KeplerMapConfig,\n MapLayerConfig,\n VisualChannels,\n VisConfig,\n MapConfigLayer,\n Dataset,\n VisualChannelField,\n} from './types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\n\nexport type Scale = {\n field: VisualChannelField;\n domain: string[] | number[];\n range: string[] | number[];\n type: ScaleType;\n};\n\nexport type LayerDescriptor = {\n type: LayerType;\n props: Record<string, any>;\n filters?: Filters;\n scales: Record<ScaleKey, Scale>;\n};\n\nexport type ParseMapResult = {\n /** Map id. */\n id: string;\n\n /** Title of map. */\n title: string;\n\n /** Description of map. */\n description?: string;\n createdAt: string;\n updatedAt: string;\n initialViewState: any;\n\n /** @deprecated Use `basemap`. */\n mapStyle: any;\n popupSettings: any;\n token: string;\n\n layers: LayerDescriptor[];\n};\n\nexport function parseMap(json: any) {\n const {keplerMapConfig, datasets, token} = json;\n assert(keplerMapConfig.version === 'v1', 'Only support Kepler v1');\n const config = keplerMapConfig.config as KeplerMapConfig;\n const {filters, mapState, mapStyle, popupSettings, legendSettings} = config;\n const {layers, layerBlending, interactionConfig} = config.visState;\n\n return {\n id: json.id,\n title: json.title,\n description: json.description,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n initialViewState: mapState,\n /** @deprecated Use `basemap`. */\n mapStyle,\n popupSettings,\n legendSettings,\n token,\n layers: layers\n .reverse()\n .map(({id, type, config, visualChannels}: MapConfigLayer) => {\n try {\n const {dataId} = config;\n const dataset: Dataset | null = datasets.find(\n (d: any) => d.id === dataId\n );\n assert(dataset, `No dataset matching dataId: ${dataId}`);\n const {data} = dataset;\n assert(data, `No data loaded for dataId: ${dataId}`);\n\n const {propMap, defaultProps} = getLayerProps(type, config, dataset);\n\n const styleProps = createStyleProps(config, propMap);\n\n const {channelProps, scales} = createChannelProps(\n id,\n type,\n config,\n visualChannels,\n data,\n dataset\n );\n const layer: LayerDescriptor = {\n type,\n filters:\n isEmptyObject(filters) || isRemoteCalculationSupported(dataset)\n ? undefined\n : filters[dataId],\n props: {\n id,\n data,\n ...defaultProps,\n ...createInteractionProps(interactionConfig),\n ...styleProps,\n ...channelProps,\n ...createParametersProp(\n layerBlending,\n styleProps.parameters || {}\n ), // Must come after style\n ...createLoadOptions(token),\n },\n scales,\n };\n return layer;\n } catch (e: any) {\n console.error(e.message);\n return undefined;\n }\n }),\n };\n}\n\nfunction createParametersProp(\n layerBlending: string,\n parameters: ColorParameters\n) {\n if (layerBlending === 'additive') {\n parameters.blendColorSrcFactor = parameters.blendAlphaSrcFactor =\n 'src-alpha';\n parameters.blendColorDstFactor = parameters.blendAlphaDstFactor =\n 'dst-alpha';\n parameters.blendColorOperation = parameters.blendAlphaOperation = 'add';\n } else if (layerBlending === 'subtractive') {\n parameters.blendColorSrcFactor = 'one';\n parameters.blendColorDstFactor = 'one-minus-dst-color';\n parameters.blendAlphaSrcFactor = 'src-alpha';\n parameters.blendAlphaDstFactor = 'dst-alpha';\n parameters.blendColorOperation = 'subtract';\n parameters.blendAlphaOperation = 'add';\n }\n\n return Object.keys(parameters).length ? {parameters} : {};\n}\n\nfunction createInteractionProps(interactionConfig: any) {\n const pickable = interactionConfig && interactionConfig.tooltip.enabled;\n return {\n autoHighlight: pickable,\n pickable,\n };\n}\n\nfunction mapProps(source: any, target: any, mapping: any) {\n for (const sourceKey in mapping) {\n const sourceValue = source[sourceKey];\n const targetKey = mapping[sourceKey];\n if (sourceValue === undefined) {\n continue;\n }\n if (typeof targetKey === 'string') {\n target[targetKey] = sourceValue;\n } else if (typeof targetKey === 'function') {\n const [key, value] = Object.entries(targetKey(sourceValue))[0];\n target[key] = value;\n } else if (typeof targetKey === 'object') {\n // Nested definition, recurse down one level (also handles arrays)\n mapProps(sourceValue, target, targetKey);\n }\n }\n}\n\nfunction createStyleProps(config: MapLayerConfig, mapping: any) {\n const result: Record<string, any> = {};\n mapProps(config, result, mapping);\n\n // Kepler format sometimes omits strokeColor. TODO: remove once we can rely on\n // `strokeColor` always being set when `stroke: true`.\n if (result.stroked && !result.getLineColor) {\n result.getLineColor = result.getFillColor;\n }\n\n for (const colorAccessor in OPACITY_MAP) {\n if (Array.isArray(result[colorAccessor])) {\n const color = [...result[colorAccessor]];\n const opacityKey = OPACITY_MAP[colorAccessor];\n const opacity = config.visConfig[opacityKey as keyof VisConfig];\n color[3] = opacityToAlpha(opacity);\n result[colorAccessor] = color;\n }\n }\n\n result.highlightColor = config.visConfig.enable3d\n ? [255, 255, 255, 60]\n : [252, 242, 26, 255];\n return result;\n}\n\nfunction domainAndRangeFromScale(\n scale: D3Scale\n): Pick<Scale, 'domain' | 'range'> {\n return {\n domain: scale.domain(),\n range: scale.range(),\n };\n}\n\nexport type ScaleKey =\n | 'fillColor'\n | 'pointRadius'\n | 'lineColor'\n | 'elevation'\n | 'weight';\n\nfunction createChannelProps(\n id: string,\n layerType: LayerType,\n config: MapLayerConfig,\n visualChannels: VisualChannels,\n data: any,\n dataset: Dataset\n): {channelProps: Record<string, any>; scales: Record<ScaleKey, Scale>} {\n const {\n colorField,\n colorScale,\n radiusField,\n radiusScale,\n strokeColorField,\n strokeColorScale,\n weightField,\n } = visualChannels;\n const {heightField, heightScale} = visualChannels;\n const {textLabel, visConfig} = config;\n const result: Record<string, any> = {};\n\n const scales: Record<string, Scale> = {};\n\n if (colorField) {\n const {colorAggregation: aggregation, colorRange: range} = visConfig;\n const {accessor, scale} = getColorAccessor(\n colorField,\n colorScale!,\n {aggregation, range},\n visConfig.opacity,\n data\n );\n result.getFillColor = accessor;\n scales.fillColor = {\n field: colorField,\n type: colorScale!,\n ...domainAndRangeFromScale(scale),\n };\n } else if (visConfig.filled) {\n scales.fillColor = {} as any;\n }\n\n if (layerType === 'clusterTile') {\n const aggregationExpAlias = getDefaultAggregationExpColumnAliasForLayerType(\n layerType,\n dataset.providerId,\n data.schema\n );\n\n result.pointType = visConfig.isTextVisible ? 'circle+text' : 'circle';\n result.clusterLevel = visConfig.clusterLevel;\n\n result.getWeight = (d: any) => {\n return d.properties[aggregationExpAlias];\n };\n\n result.getPointRadius = (d: any, info: any) => {\n return calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n };\n\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n\n result.getText = (d: any) =>\n TEXT_NUMBER_FORMATTER.format(d.properties[aggregationExpAlias]);\n\n result.getTextColor = config.textLabel[TEXT_LABEL_INDEX].color;\n result.textOutlineColor = [\n ...(config.textLabel[TEXT_LABEL_INDEX].outlineColor as number[]),\n TEXT_OUTLINE_OPACITY,\n ];\n result.textOutlineWidth = 5;\n result.textSizeUnits = 'pixels';\n\n result.getTextSize = (d: any, info: any) => {\n const radius = calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n return calculateClusterTextFontSize(radius);\n };\n }\n\n if (radiusField) {\n const {accessor, scale} = getSizeAccessor(\n radiusField,\n radiusScale,\n visConfig.sizeAggregation,\n visConfig.radiusRange || visConfig.sizeRange,\n data\n );\n result.getPointRadius = accessor;\n scales.pointRadius = {\n field: radiusField,\n type: radiusScale || 'identity',\n ...domainAndRangeFromScale(scale),\n };\n }\n\n if (strokeColorField) {\n const opacity =\n visConfig.strokeOpacity !== undefined ? visConfig.strokeOpacity : 1;\n const {strokeColorAggregation: aggregation, strokeColorRange: range} =\n visConfig;\n const {accessor, scale} = getColorAccessor(\n strokeColorField,\n strokeColorScale!,\n {aggregation, range},\n opacity,\n data\n );\n result.getLineColor = accessor;\n scales.lineColor = {\n field: strokeColorField,\n type: strokeColorScale!,\n ...domainAndRangeFromScale(scale),\n };\n }\n if (heightField && visConfig.enable3d) {\n const {accessor, scale} = getSizeAccessor(\n heightField,\n heightScale,\n visConfig.heightAggregation,\n visConfig.heightRange || visConfig.sizeRange,\n data\n );\n result.getElevation = accessor;\n scales.elevation = {\n field: heightField,\n type: heightScale || 'identity',\n ...domainAndRangeFromScale(scale),\n };\n }\n\n if (weightField) {\n const {accessor, scale} = getSizeAccessor(\n weightField,\n undefined,\n visConfig.weightAggregation,\n undefined,\n data\n );\n result.getWeight = accessor;\n scales.weight = {\n field: weightField,\n type: 'identity',\n ...domainAndRangeFromScale(scale),\n };\n }\n\n if (visConfig.customMarkers) {\n const maxIconSize = getMaxMarkerSize(visConfig, visualChannels);\n const {getPointRadius, getFillColor} = result;\n const {\n customMarkersUrl,\n customMarkersRange,\n filled: useMaskedIcons,\n } = visConfig;\n\n result.pointType = 'icon';\n result.getIcon = getIconUrlAccessor(\n visualChannels.customMarkersField,\n customMarkersRange,\n {fallbackUrl: customMarkersUrl, maxIconSize, useMaskedIcons},\n data\n );\n result._subLayerProps = {\n 'points-icon': {\n loadOptions: {\n image: {\n type: 'imagebitmap',\n },\n imagebitmap: {\n resizeWidth: maxIconSize,\n resizeHeight: maxIconSize,\n resizeQuality: 'high',\n },\n },\n },\n };\n\n if (getFillColor && useMaskedIcons) {\n result.getIconColor = getFillColor;\n }\n\n if (getPointRadius) {\n result.getIconSize = getPointRadius;\n }\n\n if (visualChannels.rotationField) {\n const {accessor} = getSizeAccessor(\n visualChannels.rotationField,\n undefined,\n null,\n undefined,\n data\n );\n result.getIconAngle = negateAccessor(accessor);\n }\n } else if (layerType === 'tileset') {\n result.pointType = 'circle';\n }\n\n if (textLabel && textLabel.length && textLabel[0].field) {\n const [mainLabel, secondaryLabel] = textLabel;\n const collisionGroup = id;\n\n ({\n alignment: result.getTextAlignmentBaseline,\n anchor: result.getTextAnchor,\n color: result.getTextColor,\n outlineColor: result.textOutlineColor,\n size: result.textSizeScale,\n } = mainLabel);\n const {\n color: getSecondaryColor,\n field: secondaryField,\n outlineColor: secondaryOutlineColor,\n size: secondarySizeScale,\n } = secondaryLabel || {};\n\n result.getText = mainLabel.field && getTextAccessor(mainLabel.field, data);\n const getSecondaryText =\n secondaryField && getTextAccessor(secondaryField, data);\n\n result.pointType = `${result.pointType}+text`;\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n result.textOutlineWidth = 3;\n\n result._subLayerProps = {\n ...result._subLayerProps,\n 'points-text': {\n collisionEnabled: true,\n collisionGroup,\n\n // getPointRadius already has radiusScale baked in, so only pass one or the other\n ...(result.getPointRadius\n ? {getRadius: result.getPointRadius}\n : {radiusScale: visConfig.radius}),\n\n ...(secondaryField && {\n getSecondaryText,\n getSecondaryColor,\n secondarySizeScale,\n secondaryOutlineColor,\n }),\n },\n };\n }\n\n return {channelProps: result, scales};\n}\n\nfunction createLoadOptions(accessToken: string) {\n return {\n loadOptions: {fetch: {headers: {Authorization: `Bearer ${accessToken}`}}},\n };\n}\n","import {extent, groupSort} from 'd3-array';\nimport {rgb} from 'd3-color';\nimport {\n scaleLinear,\n scaleOrdinal,\n scaleLog,\n scalePoint,\n scaleQuantile,\n scaleQuantize,\n scaleSqrt,\n scaleThreshold,\n} from 'd3-scale';\nimport {format as d3Format} from 'd3-format';\n\nexport type LayerType =\n | 'clusterTile'\n | 'h3'\n | 'heatmapTile'\n | 'mvt'\n | 'quadbin'\n | 'raster'\n | 'tileset';\n\nimport {\n createBinaryProxy,\n formatDate,\n formatTimestamp,\n scaleIdentity,\n} from './utils.js';\nimport type {\n CustomMarkersRange,\n Dataset,\n MapLayerConfig,\n VisConfig,\n VisualChannelField,\n VisualChannels,\n} from './types.js';\nimport type {ProviderType, SchemaField} from '../types.js';\nimport {DEFAULT_AGGREGATION_EXP_ALIAS} from '../constants-internal.js';\nimport {AggregationTypes} from '../constants.js';\n\nexport type D3Scale = {\n domain: (d?: any) => any[];\n range: (d?: any) => any[];\n unknown?: (d?: string) => any;\n} & ((d: any) => any);\ntype D3ScaleFactory = () => D3Scale;\n\nexport type ScaleType =\n | 'linear'\n | 'ordinal'\n | 'log'\n | 'point'\n | 'quantile'\n | 'quantize'\n | 'sqrt'\n | 'custom'\n | 'identity';\nconst SCALE_FUNCS: Record<ScaleType, D3ScaleFactory> = {\n linear: scaleLinear,\n ordinal: scaleOrdinal,\n log: scaleLog,\n point: scalePoint,\n quantile: scaleQuantile,\n quantize: scaleQuantize,\n sqrt: scaleSqrt,\n custom: scaleThreshold,\n identity: scaleIdentity,\n};\n\nfunction identity<T>(v: T): T {\n return v;\n}\n\nconst UNKNOWN_COLOR = '#868d91';\n\nexport const OPACITY_MAP: Record<string, string> = {\n getFillColor: 'opacity',\n getLineColor: 'strokeOpacity',\n getTextColor: 'opacity',\n};\n\nconst hexToRGBA = (c: any) => {\n const {r, g, b, opacity} = rgb(c);\n return [r, g, b, 255 * opacity];\n};\n\n// Kepler prop value -> Deck.gl prop value\n// Supports nested definitions, and function transforms:\n// {keplerProp: 'deckProp'} is equivalent to:\n// {keplerProp: x => ({deckProp: x})}\nconst sharedPropMap = {\n // Apply the value of Kepler `color` prop to the deck `getFillColor` prop\n color: 'getFillColor',\n isVisible: 'visible',\n label: 'cartoLabel',\n textLabel: {\n alignment: 'getTextAlignmentBaseline',\n anchor: 'getTextAnchor',\n // Apply the value of Kepler `textLabel.color` prop to the deck `getTextColor` prop\n color: 'getTextColor',\n size: 'getTextSize',\n },\n visConfig: {\n enable3d: 'extruded',\n elevationScale: 'elevationScale',\n filled: 'filled',\n strokeColor: 'getLineColor',\n stroked: 'stroked',\n thickness: 'getLineWidth',\n radius: 'getPointRadius',\n wireframe: 'wireframe',\n },\n};\n\nconst customMarkersPropsMap = {\n color: 'getIconColor',\n visConfig: {\n radius: 'getIconSize',\n },\n};\n\nconst heatmapTilePropsMap = {\n visConfig: {\n colorRange: (x: any) => ({colorRange: x.colors.map(hexToRGBA)}),\n radius: (radius: number) => ({radiusPixels: 20 + radius}),\n opacity: 'opacity',\n },\n};\n\nconst defaultProps = {\n lineMiterLimit: 2,\n lineWidthUnits: 'pixels',\n pointRadiusUnits: 'pixels',\n rounded: true,\n wrapLongitude: false,\n};\n\nfunction mergePropMaps(\n a: Record<string, any> = {},\n b: Record<string, any> = {}\n) {\n return {...a, ...b, visConfig: {...a.visConfig, ...b.visConfig}};\n}\n\nconst deprecatedLayerTypes = [\n 'geojson',\n 'grid',\n 'heatmap',\n 'hexagon',\n 'hexagonId',\n 'point',\n];\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_LABEL_INDEX = 0;\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_OUTLINE_OPACITY = 64;\n\nexport const TEXT_NUMBER_FORMATTER = new Intl.NumberFormat('en-US', {\n maximumFractionDigits: 2,\n notation: 'compact',\n});\n\nexport function getLayerProps(\n type: LayerType,\n config: MapLayerConfig,\n dataset: Dataset\n): {propMap: any; defaultProps: any} {\n if (deprecatedLayerTypes.includes(type)) {\n throw new Error(\n `Outdated layer type: ${type}. Please open map in CARTO Builder to automatically migrate.`\n );\n }\n\n let basePropMap: any = sharedPropMap;\n if (config.visConfig?.customMarkers) {\n basePropMap = mergePropMaps(basePropMap, customMarkersPropsMap);\n }\n if (type === 'heatmapTile') {\n basePropMap = mergePropMaps(basePropMap, heatmapTilePropsMap);\n }\n const {aggregationExp, aggregationResLevel} = dataset;\n\n return {\n propMap: basePropMap,\n defaultProps: {\n ...defaultProps,\n ...(aggregationExp && {aggregationExp}),\n ...(aggregationResLevel && {aggregationResLevel}),\n uniqueIdProperty: 'geoid',\n },\n };\n}\n\nfunction domainFromAttribute(\n attribute: any,\n scaleType: ScaleType,\n scaleLength: number\n) {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n return attribute.categories\n .map((c: any) => c.category)\n .filter((c: any) => c !== undefined && c !== null);\n }\n\n if (scaleType === 'quantile' && attribute.quantiles) {\n return attribute.quantiles.global\n ? attribute.quantiles.global[scaleLength]\n : attribute.quantiles[scaleLength];\n }\n\n let {min} = attribute;\n if (scaleType === 'log' && min === 0) {\n min = 1e-5;\n }\n return [min, attribute.max];\n}\n\nfunction domainFromValues(values: any, scaleType: ScaleType) {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n return groupSort(\n values,\n (g) => -g.length,\n (d) => d\n );\n } else if (scaleType === 'quantile') {\n return values.sort((a: any, b: any) => a - b);\n } else if (scaleType === 'log') {\n const [d0, d1] = extent(values as number[]);\n return [d0 === 0 ? 1e-5 : d0, d1];\n }\n return extent(values);\n}\n\nfunction calculateDomain(\n data: any,\n name: any,\n scaleType: ScaleType,\n scaleLength?: number\n) {\n if (data.tilestats) {\n // Tileset data type\n const {attributes} = data.tilestats.layers[0];\n const attribute = attributes.find((a: any) => a.attribute === name);\n return domainFromAttribute(attribute, scaleType, scaleLength as number);\n }\n\n return [0, 1];\n}\n\nfunction normalizeAccessor(accessor: any, data: any) {\n if (data.features || data.tilestats) {\n return (object: any, info: any) => {\n if (object) {\n return accessor(object.properties || object.__source.object.properties);\n }\n\n const {data, index} = info;\n const proxy = createBinaryProxy(data, index);\n return accessor(proxy);\n };\n }\n return accessor;\n}\n\nexport function opacityToAlpha(opacity?: number) {\n return opacity !== undefined\n ? Math.round(255 * Math.pow(opacity, 1 / 2.2))\n : 255;\n}\n\nfunction getAccessorKeys(name: string, aggregation?: string | null): string[] {\n let keys = [name];\n if (aggregation) {\n // Snowflake will capitalized the keys, need to check lower and upper case version\n keys = keys.concat(\n [aggregation, aggregation.toUpperCase()].map((a) => `${name}_${a}`)\n );\n }\n return keys;\n}\n\nfunction findAccessorKey(keys: string[], properties: any): string[] {\n for (const key of keys) {\n if (key in properties) {\n return [key];\n }\n }\n\n // If data doesn't contain any valid keys, return all keys to run search\n // on next feature\n return keys;\n}\n\nexport function getColorAccessor(\n {name, colorColumn}: VisualChannelField,\n scaleType: ScaleType,\n {aggregation, range}: {aggregation: string; range: any},\n opacity: number | undefined,\n data: any\n): {accessor: any; scale: any} {\n const scale = calculateLayerScale(\n colorColumn || name,\n scaleType,\n range,\n data\n );\n const alpha = opacityToAlpha(opacity);\n\n let accessorKeys = getAccessorKeys(name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n const {r, g, b} = rgb(scale(propertyValue));\n return [r, g, b, propertyValue === null ? 0 : alpha];\n };\n return {accessor: normalizeAccessor(accessor, data), scale};\n}\n\nfunction calculateLayerScale(\n name: any,\n scaleType: ScaleType,\n range: any,\n data: any\n) {\n const scale = SCALE_FUNCS[scaleType]();\n let domain: (string | number)[] = [];\n let scaleColor: string[] = [];\n\n if (scaleType !== 'identity') {\n const {colorMap, colors} = range;\n\n if (Array.isArray(colorMap)) {\n colorMap.forEach(([value, color]) => {\n domain.push(value);\n scaleColor.push(color);\n });\n } else {\n domain = calculateDomain(data, name, scaleType, colors.length);\n scaleColor = colors;\n }\n\n if (scaleType === 'ordinal') {\n domain = domain.slice(0, scaleColor.length);\n }\n }\n\n scale.domain(domain);\n scale.range(scaleColor);\n scale.unknown!(UNKNOWN_COLOR);\n\n return scale;\n}\n\nconst FALLBACK_ICON =\n 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';\n\nexport function getIconUrlAccessor(\n field: VisualChannelField | null | undefined,\n range: CustomMarkersRange | null | undefined,\n {\n fallbackUrl,\n maxIconSize,\n useMaskedIcons,\n }: {\n fallbackUrl?: string | null;\n maxIconSize: number;\n useMaskedIcons?: boolean;\n },\n data: any\n) {\n const urlToUnpackedIcon = (url: string) => ({\n id: `${url}@@${maxIconSize}`,\n url,\n width: maxIconSize,\n height: maxIconSize,\n mask: useMaskedIcons,\n });\n let unknownValue = fallbackUrl || FALLBACK_ICON;\n\n if (range?.othersMarker) {\n unknownValue = range.othersMarker;\n }\n\n const unknownIcon = urlToUnpackedIcon(unknownValue);\n if (!range || !field) {\n return () => unknownIcon;\n }\n\n const mapping: Record<string, any> = {};\n for (const {value, markerUrl} of range.markerMap) {\n if (markerUrl) {\n mapping[value] = urlToUnpackedIcon(markerUrl);\n }\n }\n\n const accessor = (properties: any) => {\n const propertyValue = properties[field.name];\n return mapping[propertyValue] || unknownIcon;\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport function getMaxMarkerSize(\n visConfig: VisConfig,\n visualChannels: VisualChannels\n): number {\n const {radiusRange, radius} = visConfig;\n const {radiusField, sizeField} = visualChannels;\n const field = radiusField || sizeField;\n return Math.ceil(radiusRange && field ? radiusRange[1] : radius);\n}\n\ntype Accessor = number | ((d: any, i: any) => number);\nexport function negateAccessor(accessor: Accessor): Accessor {\n if (typeof accessor === 'function') {\n return (d: any, i: any) => -accessor(d, i);\n }\n return -accessor;\n}\n\nexport function getSizeAccessor(\n {name}: VisualChannelField,\n scaleType: ScaleType | undefined,\n aggregation: string | null | undefined,\n range: Iterable<Range> | null | undefined,\n data: any\n): {accessor: any; scale: any} {\n const scale = scaleType ? SCALE_FUNCS[scaleType]() : identity;\n if (scaleType) {\n if (aggregation !== AggregationTypes.Count) {\n (scale as D3Scale).domain(calculateDomain(data, name, scaleType));\n }\n (scale as D3Scale).range(range);\n }\n\n let accessorKeys = getAccessorKeys(name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n return scale(propertyValue);\n };\n return {accessor: normalizeAccessor(accessor, data), scale};\n}\n\nconst FORMATS: Record<string, (value: any) => string> = {\n date: formatDate,\n integer: d3Format('i'),\n float: d3Format('.5f'),\n timestamp: formatTimestamp,\n default: String,\n};\n\nexport function getTextAccessor({name, type}: VisualChannelField, data: any) {\n const format = FORMATS[type] || FORMATS.default;\n const accessor = (properties: any) => {\n return format(properties[name]);\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport {domainFromValues as _domainFromValues};\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterRadius(\n properties: {[column: string]: number},\n stats: Record<string, {min: number; max: number}>,\n radiusRange: [number, number],\n column: string\n): number {\n const {min, max} = stats[column];\n const value = properties[column];\n\n // When there's a single cluster on the screen, min and max are equivalent, so we should return the maximum radius\n if (min === max) return radiusRange[1];\n\n const normalizedValue = (value - min) / (max - min);\n return radiusRange[0] + normalizedValue * (radiusRange[1] - radiusRange[0]);\n}\n\n/** @privateRemarks Source: Builder */\nexport function getDefaultAggregationExpColumnAliasForLayerType(\n layerType: LayerType,\n provider: ProviderType,\n schema: SchemaField[]\n): string {\n if (schema && layerType === 'clusterTile') {\n return getColumnAliasForAggregationExp(\n getDefaultColumnFromSchemaForAggregationExp(schema),\n 'count',\n provider\n );\n } else {\n return DEFAULT_AGGREGATION_EXP_ALIAS;\n }\n}\n\n/** @privateRemarks Source: Builder */\nfunction getColumnAliasForAggregationExp(\n name: string,\n aggregation: string,\n provider: ProviderType\n) {\n const columnAlias = `${name}_${aggregation}`;\n return provider === 'snowflake' ? columnAlias.toUpperCase() : columnAlias;\n}\n\n/** @privateRemarks Source: Builder */\nfunction getDefaultColumnFromSchemaForAggregationExp(\n schema: SchemaField[]\n): string {\n return schema ? schema[0].name : '';\n}\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterTextFontSize(radius: number): number {\n if (radius >= 80) return 24;\n if (radius >= 72) return 24;\n if (radius >= 56) return 20;\n if (radius >= 40) return 16;\n if (radius >= 24) return 13;\n if (radius >= 8) return 11;\n return 11;\n}\n","export {default as bisect, bisectRight, bisectLeft, bisectCenter} from \"./bisect.js\";\nexport {default as ascending} from \"./ascending.js\";\nexport {default as bisector} from \"./bisector.js\";\nexport {blur, blur2, blurImage} from \"./blur.js\";\nexport {default as count} from \"./count.js\";\nexport {default as cross} from \"./cross.js\";\nexport {default as cumsum} from \"./cumsum.js\";\nexport {default as descending} from \"./descending.js\";\nexport {default as deviation} from \"./deviation.js\";\nexport {default as extent} from \"./extent.js\";\nexport {Adder, fsum, fcumsum} from \"./fsum.js\";\nexport {default as group, flatGroup, flatRollup, groups, index, indexes, rollup, rollups} from \"./group.js\";\nexport {default as groupSort} from \"./groupSort.js\";\nexport {default as bin, default as histogram} from \"./bin.js\"; // Deprecated; use bin.\nexport {default as thresholdFreedmanDiaconis} from \"./threshold/freedmanDiaconis.js\";\nexport {default as thresholdScott} from \"./threshold/scott.js\";\nexport {default as thresholdSturges} from \"./threshold/sturges.js\";\nexport {default as max} from \"./max.js\";\nexport {default as maxIndex} from \"./maxIndex.js\";\nexport {default as mean} from \"./mean.js\";\nexport {default as median, medianIndex} from \"./median.js\";\nexport {default as merge} from \"./merge.js\";\nexport {default as min} from \"./min.js\";\nexport {default as minIndex} from \"./minIndex.js\";\nexport {default as mode} from \"./mode.js\";\nexport {default as nice} from \"./nice.js\";\nexport {default as pairs} from \"./pairs.js\";\nexport {default as permute} from \"./permute.js\";\nexport {default as quantile, quantileIndex, quantileSorted} from \"./quantile.js\";\nexport {default as quickselect} from \"./quickselect.js\";\nexport {default as range} from \"./range.js\";\nexport {default as rank} from \"./rank.js\";\nexport {default as least} from \"./least.js\";\nexport {default as leastIndex} from \"./leastIndex.js\";\nexport {default as greatest} from \"./greatest.js\";\nexport {default as greatestIndex} from \"./greatestIndex.js\";\nexport {default as scan} from \"./scan.js\"; // Deprecated; use leastIndex.\nexport {default as shuffle, shuffler} from \"./shuffle.js\";\nexport {default as sum} from \"./sum.js\";\nexport {default as ticks, tickIncrement, tickStep} from \"./ticks.js\";\nexport {default as transpose} from \"./transpose.js\";\nexport {default as variance} from \"./variance.js\";\nexport {default as zip} from \"./zip.js\";\nexport {default as every} from \"./every.js\";\nexport {default as some} from \"./some.js\";\nexport {default as filter} from \"./filter.js\";\nexport {default as map} from \"./map.js\";\nexport {default as reduce} from \"./reduce.js\";\nexport {default as reverse} from \"./reverse.js\";\nexport {default as sort} from \"./sort.js\";\nexport {default as difference} from \"./difference.js\";\nexport {default as disjoint} from \"./disjoint.js\";\nexport {default as intersection} from \"./intersection.js\";\nexport {default as subset} from \"./subset.js\";\nexport {default as superset} from \"./superset.js\";\nexport {default as union} from \"./union.js\";\nexport {InternMap, InternSet} from \"internmap\";\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","import {InternMap} from \"internmap\";\nimport identity from \"./identity.js\";\n\nexport default function group(values, ...keys) {\n return nest(values, identity, identity, keys);\n}\n\nexport function groups(values, ...keys) {\n return nest(values, Array.from, identity, keys);\n}\n\nfunction flatten(groups, keys) {\n for (let i = 1, n = keys.length; i < n; ++i) {\n groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value]));\n }\n return groups;\n}\n\nexport function flatGroup(values, ...keys) {\n return flatten(groups(values, ...keys), keys);\n}\n\nexport function flatRollup(values, reduce, ...keys) {\n return flatten(rollups(values, reduce, ...keys), keys);\n}\n\nexport function rollup(values, reduce, ...keys) {\n return nest(values, identity, reduce, keys);\n}\n\nexport function rollups(values, reduce, ...keys) {\n return nest(values, Array.from, reduce, keys);\n}\n\nexport function index(values, ...keys) {\n return nest(values, identity, unique, keys);\n}\n\nexport function indexes(values, ...keys) {\n return nest(values, Array.from, unique, keys);\n}\n\nfunction unique(values) {\n if (values.length !== 1) throw new Error(\"duplicate key\");\n return values[0];\n}\n\nfunction nest(values, map, reduce, keys) {\n return (function regroup(values, i) {\n if (i >= keys.length) return reduce(values);\n const groups = new InternMap();\n const keyof = keys[i++];\n let index = -1;\n for (const value of values) {\n const key = keyof(value, ++index, values);\n const group = groups.get(key);\n if (group) group.push(value);\n else groups.set(key, [value]);\n }\n for (const [key, values] of groups) {\n groups.set(key, regroup(values, i));\n }\n return map(groups);\n })(values, 0);\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","export default function identity(x) {\n return x;\n}\n","import ascending from \"./ascending.js\";\nimport group, {rollup} from \"./group.js\";\nimport sort from \"./sort.js\";\n\nexport default function groupSort(values, reduce, key) {\n return (reduce.length !== 2\n ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk)))\n : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk))))\n .map(([key]) => key);\n}\n","import ascending from \"./ascending.js\";\nimport permute from \"./permute.js\";\n\nexport default function sort(values, ...F) {\n if (typeof values[Symbol.iterator] !== \"function\") throw new TypeError(\"values is not iterable\");\n values = Array.from(values);\n let [f] = F;\n if ((f && f.length !== 2) || F.length > 1) {\n const index = Uint32Array.from(values, (d, i) => i);\n if (F.length > 1) {\n F = F.map(f => values.map(f));\n index.sort((i, j) => {\n for (const f of F) {\n const c = ascendingDefined(f[i], f[j]);\n if (c) return c;\n }\n });\n } else {\n f = values.map(f);\n index.sort((i, j) => ascendingDefined(f[i], f[j]));\n }\n return permute(values, index);\n }\n return values.sort(compareDefined(f));\n}\n\nexport function compareDefined(compare = ascending) {\n if (compare === ascending) return ascendingDefined;\n if (typeof compare !== \"function\") throw new TypeError(\"compare is not a function\");\n return (a, b) => {\n const x = compare(a, b);\n if (x || x === 0) return x;\n return (compare(b, b) === 0) - (compare(a, a) === 0);\n };\n}\n\nexport function ascendingDefined(a, b) {\n return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);\n}\n","export default function permute(source, keys) {\n return Array.from(keys, key => source[key]);\n}\n","export {default as color, rgb, hsl} from \"./color.js\";\nexport {default as lab, hcl, lch, gray} from \"./lab.js\";\nexport {default as cubehelix} from \"./cubehelix.js\";\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import type {BinaryFeature} from '@loaders.gl/schema';\nimport type {Dataset} from './types.js';\ntype Properties = BinaryFeature['properties'];\ntype NumericProps = BinaryFeature['numericProps'];\n\n// Returns a Proxy object that allows accessing binary data\n// as if it were JSON properties\nexport function createBinaryProxy(\n data: {numericProps: NumericProps; properties: Properties[]},\n index: number\n) {\n const {properties, numericProps} = data;\n return new Proxy(properties[index] || {}, {\n get(target, property) {\n if (property in numericProps) {\n return numericProps[property as string].value[index];\n }\n return target[property as any];\n },\n\n has(target, property) {\n return property in numericProps || property in target;\n },\n\n ownKeys(target) {\n return [...Object.keys(numericProps), ...Reflect.ownKeys(target)];\n },\n\n getOwnPropertyDescriptor() {\n return {enumerable: true, configurable: true};\n },\n });\n}\n\nexport function scaleIdentity() {\n let unknown: any;\n\n function scale(x: any) {\n return x === null ? unknown : x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = (d: any) => d;\n\n scale.unknown = (u: any) => {\n if (u) {\n unknown = u;\n }\n\n return unknown;\n };\n\n scale.copy = () => {\n const scaleCopy = scaleIdentity();\n scaleCopy.unknown(unknown);\n return scaleCopy;\n };\n\n return scale;\n}\n\nexport function isRemoteCalculationSupported(dataset: Dataset) {\n if (dataset?.type === 'tileset' || dataset.providerId === 'databricks') {\n return false;\n }\n\n return true;\n}\n\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n year: '2-digit',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function formatDate(value: string | number | Date): string {\n return DATE_FORMATTER.format(new Date(value));\n}\n\nexport function formatTimestamp(value: string | number | Date): string {\n return String(Math.floor(new Date(value).getTime() / 1000));\n}\n","import {\n GOOGLE_BASEMAPS,\n CARTO_MAP_STYLES,\n applyLayerGroupFilters,\n fetchStyle,\n getStyleUrl,\n someLayerGroupsDisabled,\n} from './basemap-styles.js';\nimport type {Basemap, KeplerMapConfig, MapLibreBasemapProps} from './types.js';\nimport type {APIErrorContext} from '../api/index.js';\n\nconst CUSTOM_STYLE_ID_PREFIX = 'custom:';\nconst DEFAULT_CARTO_STYLE = 'positron';\n\n// Subset of type from @deck.gl/core to avoid adding dependency\ntype MapViewState = {\n /** Longitude of the map center */\n longitude: number;\n /** Latitude of the map center */\n latitude: number;\n /** Zoom level */\n zoom: number;\n /** Pitch (tilt) of the map, in degrees. `0` looks top down */\n pitch?: number;\n /** Bearing (rotation) of the map, in degrees. `0` is north up */\n bearing?: number;\n};\n\nfunction mapLibreViewpros(\n config: KeplerMapConfig\n): Omit<MapLibreBasemapProps, 'style'> {\n const {longitude, latitude, ...rest} = config.mapState as MapViewState;\n return {\n center: [longitude, latitude],\n ...rest,\n };\n}\n\n/**\n * Get basemap properties for Carto map.\n *\n * For maplibre-based basemaps it returns style or style URL that can be used with `maplibregl.Map` compatible component.\n * * style url is returned for non-filtered standard Carto basemaps or if user used style URL directly in configuration\n * * filtered style object returned for Carto basemaps with layer groups filtered\n *\n * For Google-maps base maps, it returns options that can be used with `google.maps.Map` constructor.\n */\nexport async function fetchBasemapProps({\n config,\n errorContext,\n\n applyLayerFilters = true,\n}: {\n config: KeplerMapConfig;\n\n /** By default `fetchBasemapProps` applies layers filters to style. Set this to `false` to disable it. */\n applyLayerFilters?: boolean;\n errorContext?: APIErrorContext;\n}): Promise<Basemap | null> {\n const {mapStyle} = config;\n const styleType = mapStyle.styleType || DEFAULT_CARTO_STYLE;\n if (styleType.startsWith(CUSTOM_STYLE_ID_PREFIX)) {\n const currentCustomStyle = config.customBaseMaps?.customStyle;\n if (currentCustomStyle) {\n return {\n type: 'maplibre',\n props: {\n style: currentCustomStyle.style || currentCustomStyle.url,\n ...mapLibreViewpros(config),\n },\n attribution: currentCustomStyle.customAttribution,\n };\n }\n }\n\n if (CARTO_MAP_STYLES.includes(styleType)) {\n const {visibleLayerGroups} = mapStyle;\n const styleUrl = getStyleUrl(styleType);\n let style = styleUrl;\n let rawStyle = styleUrl;\n if (\n applyLayerFilters &&\n visibleLayerGroups &&\n someLayerGroupsDisabled(visibleLayerGroups)\n ) {\n rawStyle = await fetchStyle({styleUrl, errorContext});\n style = applyLayerGroupFilters(rawStyle, visibleLayerGroups);\n }\n return {\n type: 'maplibre',\n props: {\n style,\n ...mapLibreViewpros(config),\n },\n visibleLayerGroups,\n rawStyle,\n };\n }\n const googleBasemapDef = GOOGLE_BASEMAPS[styleType];\n if (googleBasemapDef) {\n const {mapState} = config;\n return {\n type: 'google-maps',\n props: {\n ...googleBasemapDef,\n center: {lat: mapState.latitude, lng: mapState.longitude},\n zoom: mapState.zoom + 1,\n tilt: mapState.pitch,\n heading: mapState.bearing,\n },\n };\n }\n return {\n type: 'maplibre',\n props: {\n style: getStyleUrl(DEFAULT_CARTO_STYLE),\n ...mapLibreViewpros(config),\n },\n };\n}\n","import type {Dataset} from './types.js';\nimport {SpatialIndex, SpatialIndexColumn} from '../constants.js';\nimport type {\n QuerySourceOptions,\n TableSourceOptions,\n TilejsonResult,\n TileResolution,\n} from '../sources/types.js';\nimport {\n DEFAULT_AGGREGATION_EXP,\n DEFAULT_AGGREGATION_RES_LEVEL_H3,\n DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n DEFAULT_TILE_RESOLUTION,\n REDUCED_QUERIES_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n h3QuerySource,\n type H3QuerySourceOptions,\n h3TableSource,\n type H3TableSourceOptions,\n quadbinQuerySource,\n type QuadbinQuerySourceOptions,\n quadbinTableSource,\n type QuadbinTableSourceOptions,\n rasterSource,\n vectorQuerySource,\n type VectorQuerySourceOptions,\n vectorTableSource,\n type VectorTableSourceOptions,\n vectorTilesetSource,\n type VectorTilesetSourceOptions,\n} from '../sources/index.js';\nimport type {Filter} from '../types.js';\n\ntype FetchDatasetOptions = {\n accessToken: string;\n apiBaseUrl: string;\n connection: string;\n headers?: Record<string, string>;\n localCache?: {\n cacheControl: 'no-cache'[];\n };\n maxLengthURL?: number;\n};\n\ntype FetchDataset = {\n dataset: Dataset;\n filters?: Filter;\n options: FetchDatasetOptions;\n};\n\n// Copy of getCartoSource from cloud-native:\n// https://github.com/CartoDB/cloud-native/blob/main/workspace-www/src/features/common/utils/cartoDeckGL.ts#L79\nexport function configureSource({\n dataset,\n filters,\n options,\n}: FetchDataset): Promise<TilejsonResult> {\n const {\n geoColumn,\n columns,\n type,\n source,\n queryParameters,\n aggregationExp,\n aggregationResLevel: originalAggregationResLevel,\n } = dataset;\n const sourceOptions = getSourceOptions(options);\n const spatialDataColumn = getColumnNameFromGeoColumn(geoColumn) || undefined;\n const spatialIndex = geoColumn\n ? getSpatialIndexFromGeoColumn(geoColumn)\n : undefined;\n const tileResolution = getDynamicTileResolution(spatialIndex);\n const isH3 = spatialIndex === SpatialIndex.H3;\n const isQuadbin = spatialIndex === SpatialIndex.QUADBIN;\n let aggregationResLevel = originalAggregationResLevel;\n\n if (typeof originalAggregationResLevel !== 'number' && isH3) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3;\n } else if (typeof originalAggregationResLevel !== 'number' && isQuadbin) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN;\n }\n\n const spatialIndexOptions = {\n aggregationExp: !aggregationExp ? DEFAULT_AGGREGATION_EXP : aggregationExp,\n aggregationResLevel: scaleAggregationResLevel(\n aggregationResLevel,\n tileResolution\n ),\n spatialDataColumn,\n ...(filters && {filters}),\n } as H3QuerySourceOptions;\n const tilesetOptions = {\n ...sourceOptions,\n tableName: source,\n } as VectorTilesetSourceOptions;\n const tableOptions = {\n ...sourceOptions,\n tableName: source,\n tileResolution,\n } as TableSourceOptions;\n const queryOptions = {\n ...sourceOptions,\n sqlQuery: source,\n tileResolution,\n ...(queryParameters && {queryParameters}),\n } as QuerySourceOptions;\n const vectorOptions = {\n spatialDataColumn,\n ...(columns && {columns}),\n ...(filters && {filters}),\n ...(aggregationExp && {aggregationExp}),\n } as VectorTableSourceOptions;\n\n if (type === 'raster') {\n return rasterSource({\n ...sourceOptions,\n tableName: source,\n ...(filters && {filters: filters as any}),\n });\n }\n if (type === 'tileset') {\n return vectorTilesetSource({...tilesetOptions});\n }\n\n if (type === 'table') {\n if (isH3) {\n return h3TableSource({\n ...(tableOptions as H3TableSourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinTableSource({\n ...(tableOptions as QuadbinTableSourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorTableSource({\n ...(tableOptions as VectorTableSourceOptions),\n ...vectorOptions,\n });\n }\n }\n\n if (type === 'query') {\n if (isH3) {\n return h3QuerySource({\n ...(queryOptions as H3QuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinQuerySource({\n ...(queryOptions as QuadbinQuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorQuerySource({\n ...(queryOptions as VectorQuerySourceOptions),\n ...vectorOptions,\n });\n }\n }\n throw new Error(`Invalid source type: ${type}`);\n}\n\nfunction getSourceOptions({\n accessToken,\n apiBaseUrl,\n connection,\n headers,\n maxLengthURL,\n}: FetchDatasetOptions) {\n return {\n accessToken,\n connectionName: connection,\n apiBaseUrl,\n headers,\n maxLengthURL,\n ...(headers?.['Cache-Control']?.includes('no-cache') && {\n localCache: {\n cacheControl: ['no-cache'] as 'no-cache'[],\n },\n }),\n };\n}\n\n/**\n * Returns default tile resolution for dynamic tilesets, based on layer configuration\n * Result is not applicable for static tilesets, for which tile resolution is defined\n * by tilejson.\n */\nfunction getDynamicTileResolution(\n spatialIndex?: SpatialIndex | null\n): TileResolution {\n // TODO: Support increased tile size and resolution for dynamic H3 spatial indexes.\n if (spatialIndex !== SpatialIndex.H3) {\n return REDUCED_QUERIES_TILE_RESOLUTION;\n }\n\n return DEFAULT_TILE_RESOLUTION;\n}\n\n/**\n * @internal\n * State of `aggregationResLevel` in the UI and backend config is based on an assumption of\n * 512x512px tiles. Because we may change tile resolution for performance goals, the\n * `aggregationResLevel` passed to the deck.gl layer must be scaled with tile resolution.\n */\nexport function scaleAggregationResLevel(\n aggregationResLevel: number,\n tileResolution: number\n): number | undefined {\n if (typeof aggregationResLevel !== 'number') return;\n return aggregationResLevel - Math.log2(0.5 / tileResolution);\n}\n\n/**\n * @internal\n */\nexport function getColumnNameFromGeoColumn(\n geoColumn: string | null | undefined\n) {\n if (!geoColumn) {\n return geoColumn;\n }\n const parts = geoColumn.split(':');\n return parts.length === 1 ? parts[0] : parts.length === 2 ? parts[1] : null;\n}\n\n/**\n * @internal\n */\nexport function getSpatialIndexFromGeoColumn(geoColumn: string) {\n const spatialIndexToSearch = geoColumn.split(':')[0];\n\n for (const index of Object.values(SpatialIndex)) {\n if (SpatialIndexColumn[index].includes(spatialIndexToSearch)) {\n return index;\n }\n }\n return null;\n}\n","import bboxClip from '@turf/bbox-clip';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport union from '@turf/union';\nimport {getType} from '@turf/invariant';\nimport {polygon, multiPolygon, feature, featureCollection} from '@turf/helpers';\nimport type {BBox, Geometry, MultiPolygon, Polygon, Position} from 'geojson';\nimport type {SpatialFilter} from './types.js';\n\n/**\n * Returns a {@link SpatialFilter} for a given viewport, typically obtained\n * from deck.gl's `viewport.getBounds()` method ([west, south, east, north]).\n * If the viewport covers the entire world (to some margin of error in Web\n * Mercator space), `undefined` is returned instead.\n *\n * If the viewport extends beyond longitude range [-180, +180], the polygon\n * may be reformatted for compatibility with CARTO APIs.\n */\nexport function createViewportSpatialFilter(\n viewport: BBox\n): SpatialFilter | undefined {\n if (_isGlobalViewport(viewport)) {\n return;\n }\n return createPolygonSpatialFilter(bboxPolygon(viewport).geometry);\n}\n\n/**\n * Returns a {@link SpatialFilter} for a given {@link Polygon} or\n * {@link MultiPolygon}. If the polygon(s) extend outside longitude\n * range [-180, +180], the result may be reformatted for compatibility\n * with CARTO APIs.\n */\nexport function createPolygonSpatialFilter(\n spatialFilter: Polygon | MultiPolygon\n): SpatialFilter | undefined {\n return (spatialFilter && _normalizeGeometry(spatialFilter)) || undefined;\n}\n\n/**\n * Check if a viewport is large enough to represent a global coverage.\n * In this case the spatial filter parameter for widget calculation is removed.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _isGlobalViewport(viewport: BBox) {\n const [minx, miny, maxx, maxy] = viewport;\n return maxx - minx > 179.5 * 2 && maxy - miny > 85.05 * 2;\n}\n\n/**\n * Normalized a geometry, coming from a mask or a viewport. The parts\n * spanning outside longitude range [-180, +180] are clipped and \"folded\"\n * back to the valid range and unioned to the polygons inide that range.\n *\n * It results in a Polygon or MultiPolygon strictly inside the validity range.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _normalizeGeometry(\n geometry: Polygon | MultiPolygon\n): Polygon | MultiPolygon | null {\n const WORLD = [-180, -90, +180, +90] as BBox;\n const worldClip = _clean(\n bboxClip(geometry, WORLD).geometry as Polygon | MultiPolygon\n );\n\n const geometryTxWest = _tx(geometry, 360);\n const geometryTxEast = _tx(geometry, -360);\n\n let result: Polygon | MultiPolygon | null = worldClip;\n\n if (result && geometryTxWest) {\n const worldWestClip = _clean(\n bboxClip(geometryTxWest, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldWestClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldWestClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n if (result && geometryTxEast) {\n const worldEastClip = _clean(\n bboxClip(geometryTxEast, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldEastClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldEastClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n return result;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanPolygonCoords(cc: Position[][]) {\n const coords = cc.filter((c) => c.length > 0);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanMultiPolygonCoords(ccc: Position[][][]) {\n const coords = ccc.map(_cleanPolygonCoords).filter((cc) => cc);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _clean(\n geometry: Polygon | MultiPolygon | null\n): Polygon | MultiPolygon | null {\n if (!geometry) {\n return null;\n }\n\n if (_isPolygon(geometry)) {\n const coords = _cleanPolygonCoords(geometry.coordinates);\n return coords ? polygon(coords).geometry : null;\n }\n\n if (_isMultiPolygon(geometry)) {\n const coords = _cleanMultiPolygonCoords(geometry.coordinates);\n return coords ? multiPolygon(coords as Position[][][]).geometry : null;\n }\n\n return null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txContourCoords(cc: Position[], distance: number) {\n return cc.map((c) => [c[0] + distance, c[1]]);\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txPolygonCoords(ccc: Position[][], distance: number) {\n return ccc.map((cc) => _txContourCoords(cc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txMultiPolygonCoords(cccc: Position[][][], distance: number) {\n return cccc.map((ccc) => _txPolygonCoords(ccc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _tx(geometry: Polygon | MultiPolygon, distance: number) {\n if (geometry && getType(geometry) === 'Polygon') {\n const coords = _txPolygonCoords(\n (geometry as Polygon).coordinates,\n distance\n );\n return polygon(coords).geometry;\n } else if (geometry && getType(geometry) === 'MultiPolygon') {\n const coords = _txMultiPolygonCoords(\n (geometry as MultiPolygon).coordinates,\n distance\n );\n return multiPolygon(coords).geometry;\n } else {\n return null;\n }\n}\n\nfunction _isPolygon(geometry: Geometry): geometry is Polygon {\n return getType(geometry) === 'Polygon';\n}\n\nfunction _isMultiPolygon(geometry: Geometry): geometry is MultiPolygon {\n return getType(geometry) === 'MultiPolygon';\n}\n","// Default tile display size in deck.gl, in viewport pixels. May differ\n// from size or resolution assumed when generating the tile data,\nconst DEFAULT_TILE_SIZE = 512;\n\n// Relative scale factor (0 = no biasing, 2 = a few hexagons cover view)\nconst BIAS = 2;\n\n/**\n * Resolution conversion function. Takes a WebMercatorViewport and returns\n * a H3 resolution such that the screen space size of the hexagons is\n * \"similar\" to the given tileSize on screen. Intended for use with deck.gl.\n * @internal\n * @privateRemarks Source: https://github.com/visgl/deck.gl/blob/master/modules/carto/src/layers/h3-tileset-2d.ts\n */\nexport function _getHexagonResolution(\n viewport: {zoom: number; latitude: number},\n tileSize: number\n): number {\n // Difference in given tile size compared to deck's internal 512px tile size,\n // expressed as an offset to the viewport zoom.\n const zoomOffset = Math.log2(tileSize / DEFAULT_TILE_SIZE);\n const hexagonScaleFactor = (2 / 3) * (viewport.zoom - zoomOffset);\n const latitudeScaleFactor = Math.log(\n 1 / Math.cos((Math.PI * viewport.latitude) / 180)\n );\n\n // Clip and bias\n return Math.max(\n 0,\n Math.floor(hexagonScaleFactor + latitudeScaleFactor - BIAS)\n );\n}\n","/** Flags 'empty' values in a Uint32Array index. */\nconst EMPTY_U32 = 2 ** 32 - 1;\n\n/**\n * Custom Set-like interface optimized for BigUint64 cell IDs. Unlike Set,\n * limited in most JavaScript runtimes to ~16M entries, this implementation\n * can support up to `n = 2^32 - 1` (4 billion) entries, with lookups in\n * amortized O(1) time.\n */\nexport class CellSet {\n /** List of cells stored by the set. Stored by reference, without copying. */\n private cells: bigint[];\n\n /** DataView representing a single cell ID. Pre-allocated to reduce memory during queries. */\n private cellView = new DataView(new ArrayBuffer(8));\n\n /** Hash table, mapping a hash index (computed) to an index in the 'cells' array. */\n private hashTable: Uint32Array;\n\n constructor(cells: bigint[]) {\n this.cells = cells;\n\n // Pre-allocate hash table for queries.\n this.hashTable = new Uint32Array(hashBuckets(cells.length)).fill(EMPTY_U32);\n for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n this.hashTable[this.hashLookup(cells[cellIndex])] = cellIndex;\n }\n }\n\n has(cell: bigint): boolean {\n const hashIndex = this.hashLookup(cell);\n return this.hashTable[hashIndex] !== EMPTY_U32;\n }\n\n private hashLookup(cell: bigint): number {\n // Hash implementation operates on 32-bit chunks, so write the cell ID\n // into a pre-allocated DataView for easier iteration.\n this.cellView.setBigUint64(0, cell);\n const hashval = hash(this.cellView);\n const hashmod = this.hashTable.length - 1;\n let bucket = hashval & hashmod;\n\n // Find the first bucket in the hash table where either (a) no cell\n // is yet stored, or (b) the stored cell and the query cell are equal.\n for (let probe = 0; probe <= hashmod; probe++) {\n const cellIndex = this.hashTable[bucket];\n\n if (cellIndex === EMPTY_U32 || cell === this.cells[cellIndex]) {\n return bucket;\n }\n\n bucket = (bucket + probe + 1) & hashmod; // Hash collision; quadratic probing.\n }\n\n throw new Error('Hash table full.'); // Unreachable.\n }\n}\n\n/**\n * MurmurHash2\n *\n * References:\n * - https://github.com/mikolalysenko/murmurhash-js/blob/f19136e9f9c17f8cddc216ca3d44ec7c5c502f60/murmurhash2_gc.js#L14\n * - https://github.com/zeux/meshoptimizer/blob/e47e1be6d3d9513153188216455bdbed40a206ef/src/indexgenerator.cpp#L12\n */\nfunction hash(view: DataView, h = 0): number {\n const m = 0x5bd1e995;\n const r = 24;\n\n for (let i = 0, il = view.byteLength / 4; i < il; i++) {\n let k = view.getUint32(i * 4);\n\n k = Math.imul(k, m) >>> 0;\n k = (k ^ (k >> r)) >>> 0;\n k = Math.imul(k, m) >>> 0;\n\n h = Math.imul(h, m) >>> 0;\n h = (h ^ k) >>> 0;\n }\n\n return h;\n}\n\nfunction hashBuckets(initialCount: number) {\n let buckets = 1;\n while (buckets < initialCount + initialCount / 4) {\n buckets *= 2;\n }\n return buckets;\n}\n"],"mappings":"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","names":["exports","module","identity","v","FilterType","ApiVersion","TileFormat","SpatialIndex","Provider","stringRegExp","feature","u3","u","bc","ca","ab","u","abt","bct","cat","_8","_16","fin","fin2","ab","bc","_8","_8b","_16","_48","fin","polygon","u2","point","polygon","bbox","compare","featureId","ringId","eventId","intersection","sweeplineIntersections","intersection","featureId","bbox","lineString","polygon","feature","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","bbox","multiLineString","lineString","polygon","multiPolygon","bbox","isPointOnLineSegment","epsilon","isLineOnLine","isLineInPoly","isPolyInPoly","point","compareCoords","lineString","polygon","clone","BigNumber","v","sum","compare","format","min","max","compare","compare","v","u","set","node","v","eps","bbox","point","Segment","pt","nextPt","SplayTreeSet","evt","BigNumber","intersection","intersection","TRANSFORM_FN","transformPoint","transformMultiPoint","transformLineString","transformMultiLineString","transformPolygon","transformMultiPolygon","bbox","getPoints","multiLineString","lineString","polygon","multiPolygon","bbox","intersect","feature","quadbinCellToBoundary","quadbinGeometryToCells","h3PolygonToCells","intersection","bbox","featureId","import_quadbin","import_h3_js","intersection","quadbinGetResolution","h3GetResolution","import_quadbin","intersection","SchemaFieldType","assert","isObject","field","assert","v","feature","assert","FILTER_TYPES","operation","assert","sum","feature","operation","v","min","max","operation","group","operation","operation","feature","feature","_GeojsonEquality","_a","_b","isObject","equals","isPointOnLineSegment","point","precision","operation","assert","bbox","min","max","key","values","keyof","group","f","compare","key","min","max","scale","u","identity","v","config","min","data","scale","color","d3Format","min","max","assert","config","defaultProps","color","scale","config","client","assert","v","config","union","cc"]}
|