diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml new file mode 100644 index 0000000..67f5bbd --- /dev/null +++ b/.github/workflows/node.yml @@ -0,0 +1,22 @@ +name: Node +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm install + + - name: Run tests + run: npm test + + - name: Run build + run: npm run build diff --git a/.gitignore b/.gitignore index d8c16e3..b848523 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules coverage -.nyc_output *.log cheap-ruler.js +test/types.js +index.d.ts diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 3bd8228..0000000 --- a/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage -.nyc_output -*.log diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8131feb..0000000 --- a/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "4" - - "stable" diff --git a/LICENSE b/LICENSE index 6925f4b..21b4891 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,6 @@ -Copyright (c) 2016, Mapbox +ISC License + +Copyright (c) 2024, Mapbox Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice diff --git a/README.md b/README.md index c21a68e..c9ca7c3 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,46 @@ -# cheap-ruler [![Build Status](https://travis-ci.org/mapbox/cheap-ruler.svg?branch=master)](https://travis-ci.org/mapbox/cheap-ruler) +# cheap-ruler [![Node](https://github.com/mapbox/cheap-ruler/actions/workflows/node.yml/badge.svg)](https://github.com/mapbox/cheap-ruler/actions/workflows/node.yml) [![](https://img.shields.io/badge/simply-awesome-brightgreen.svg)](https://github.com/mourner/projects) -A collection of fast approximations to common geographic measurements, along with some utility functions. -Useful for speeding up analysis scripts when measuring things on a city scale, -replacing [Turf](http://turfjs.org/) calls in key places. +A collection of very fast approximations to common geodesic measurements. +Useful for performance-sensitive code that measures things on a city scale. Can be an order of magnitude faster than corresponding [Turf](http://turfjs.org/) methods. -For distances under a hundred miles and not on the poles, -the results are [typically within 0.1%](#precision) of corresponding Turf functions. - -## Performance - -Compared to corresponding Turf methods (using Node v5.10): - -- `distance`: ~26x faster -- `bearing`: ~3.5x faster -- `destination`: ~6.4x faster -- `lineDistance`: ~26x faster -- `area`: ~3.6x faster -- `along`: ~21x faster -- `pointOnLine`: ~72x faster -- `lineSlice`: ~56x faster - -Additional utility methods: - -- `lineSliceAlong`: ~268x faster than `turf.lineSlice(turf.along(...` -- `bufferPoint`: ~210x faster than creating a bounding box with two diagonal `turf.destination` calls -- `bufferBBox`: ~210x faster (likewise) -- `insideBBox`: ~24x faster than `turf.inside(turf.point(p), turf.bboxPolygon(bbox))` +The approximations are based on the [WGS84 ellipsoid model of the Earth](https://en.wikipedia.org/wiki/Earth_radius#Meridional), projecting coordinates to a flat surface that approximates the ellipsoid around a certain latitude. +For distances under 500 kilometers and not on the poles, +the results are very precise — within [0.1% margin of error](#precision) +compared to [Vincenti formulas](https://en.wikipedia.org/wiki/Vincenty%27s_formulae), +and usually much less for shorter distances. ## Usage ```js -var ruler = cheapRuler(35.05, 'miles'); - +var ruler = new CheapRuler(35.05, 'miles'); // calculations around latitude 35 +... var distance = ruler.distance([30.51, 50.32], [30.52, 50.312]); var lineLength = ruler.lineDistance(line.geometry.coordinates); var bbox = ruler.bufferPoint([30.5, 50.5], 0.01); ``` -**Note**: to get the full performance benefit, create the ruler object once per an area of calculation (such as a tile), and then reuse it as much as possible. +**Note**: to get the full performance benefit, +create a ruler object only once per a general area of calculation, +and then reuse it as much as possible. +Don't create a new ruler for every calculation. ### Creating a ruler object -#### cheapRuler(latitude[, units]) +#### new CheapRuler(latitude[, units]) Creates a ruler object that will approximate measurements around the given latitude. -Units are either `kilometers` (default) or `miles`. +Units are one of: `kilometers` (default), `miles`, `nauticalmiles`, `meters`, `yards`, `feet`, `inches`. + +```js +const ruler = new CheapRuler(50.5, 'meters'); +```` -#### cheapRuler.fromTile(y, z[, units]) +#### CheapRuler.fromTile(y, z[, units]) -Creates a ruler object from tile coordinates (`y` and `z`). Convenient in `tile-reduce` scripts. +Creates a ruler object from tile coordinates (`y` and `z`). ```js -var ruler = cheapRuler.fromTile(1567, 12); +const ruler = CheapRuler.fromTile(1567, 12); ``` ### Ruler methods @@ -61,7 +50,7 @@ var ruler = cheapRuler.fromTile(1567, 12); Given two points of the form `[longitude, latitude]`, returns the distance. ```js -var distance = ruler.distance([30.5, 50.5], [30.51, 50.49]); +const distance = ruler.distance([30.5, 50.5], [30.51, 50.49]); ``` #### bearing(a, b) @@ -69,7 +58,7 @@ var distance = ruler.distance([30.5, 50.5], [30.51, 50.49]); Returns the bearing between two points in angles. ```js -var bearing = ruler.bearing([30.5, 50.5], [30.51, 50.49]); +const bearing = ruler.bearing([30.5, 50.5], [30.51, 50.49]); ``` #### destination(p, dist, bearing) @@ -77,7 +66,15 @@ var bearing = ruler.bearing([30.5, 50.5], [30.51, 50.49]); Returns a new point given distance and bearing from the starting point. ```js -var point = ruler.destination([30.5, 50.5], 0.1, 90); +const point = ruler.destination([30.5, 50.5], 0.1, 90); +``` + +#### offset(p, dx, dy) + +Returns a new point given easting and northing offsets from the starting point. + +```js +const point = ruler.offset([30.5, 50.5], 10, 5); // 10km east and 5km north ``` #### lineDistance(line) @@ -85,7 +82,7 @@ var point = ruler.destination([30.5, 50.5], 0.1, 90); Given a line (an array of points), returns the total line distance. ```js -var length = ruler.lineDistance([ +const length = ruler.lineDistance([ [-67.031, 50.458], [-67.031, 50.534], [-66.929, 50.534], [-66.929, 50.458] ]); @@ -98,27 +95,37 @@ Note that it returns the value in the specified units (square kilometers by default) rather than square meters as in `turf.area`. ```js -var area = ruler.area([[ +const area = ruler.area([[ [-67.031, 50.458], [-67.031, 50.534], [-66.929, 50.534], [-66.929, 50.458], [-67.031, 50.458] ]]); ``` +#### pointToSegmentDistance(p, a, b) + +Returns the distance from a point `p` to a line segment `a` to `b`. + +```js +const distance = ruler.pointToSegmentDistance([-77.034076, 38.882017], + [-77.031669, 38.878605], [-77.029609, 38.881946]); +```` + #### along(line, dist) Returns the point at a specified distance along the line. ```js -var point = ruler.along(line, 2.5); +const point = ruler.along(line, 2.5); ``` #### pointOnLine(line, p) -Returns an object of the form `{point, index}` where `point` is closest point on the line from the given point, -and `index` is the start index of the segment with the closest point. +Returns an object of the form `{point, index, t}`, where `point` is closest point on the line from the given point, +`index` is the start index of the segment with the closest point, and `t` is a parameter from 0 to 1 that indicates +where the closest point is on that segment. ```js -var point = ruler.pointOnLine(line, [-67.04, 50.5]).point; +const point = ruler.pointOnLine(line, [-67.04, 50.5]).point; ``` #### lineSlice(start, stop, line) @@ -126,7 +133,7 @@ var point = ruler.pointOnLine(line, [-67.04, 50.5]).point; Returns a part of the given line between the start and the stop points (or their closest points on the line). ```js -ruler.lineSlice([-67.04, 50.5], [-67.05, 50.56], line); +const part = ruler.lineSlice([-67.04, 50.5], [-67.05, 50.56], line); ``` #### lineSliceAlong(startDist, stopDist, line) @@ -134,7 +141,7 @@ ruler.lineSlice([-67.04, 50.5], [-67.05, 50.56], line); Returns a part of the given line between the start and the stop points indicated by distance along the line. ```js -ruler.lineSliceAlong(10, 20, line); +const part = ruler.lineSliceAlong(10, 20, line); ``` #### bufferPoint(p, buffer) @@ -142,7 +149,7 @@ ruler.lineSliceAlong(10, 20, line); Given a point, returns a bounding box object (`[w, s, e, n]`) created from the given point buffered by a given distance. ```js -var bbox = ruler.bufferPoint([30.5, 50.5], 0.01); +const bbox = ruler.bufferPoint([30.5, 50.5], 0.01); ``` #### bufferBBox(bbox, buffer) @@ -150,7 +157,7 @@ var bbox = ruler.bufferPoint([30.5, 50.5], 0.01); Given a bounding box, returns the box buffered by a given distance. ```js -var bbox = ruler.bufferBBox([30.5, 50.5, 31, 51], 0.2); +const bbox = ruler.bufferBBox([30.5, 50.5, 31, 51], 0.2); ``` #### insideBBox(p, bbox) @@ -158,30 +165,52 @@ var bbox = ruler.bufferBBox([30.5, 50.5, 31, 51], 0.2); Returns true if the given point is inside in the given bounding box, otherwise false. ```js -var inside = ruler.insideBBox([30.5, 50.5], [30, 50, 31, 51]); +const inside = ruler.insideBBox([30.5, 50.5], [30, 50, 31, 51]); +``` + +### Units conversion + +Multipliers for converting between units are also exposed in `CheapRuler.units`: + +```js +// convert 50 meters to yards +50 * CheapRuler.units.yards / CheapRuler.units.meters; +``` + +If you don't specify units when creating a ruler object, +you can use these constants to convert return values (using multiplication) +and input arguments (using division) to any units: + +```js +// get distance between points in feet +const distanceInFeet = ruler.distance(a, b) * CheapRuler.units.feet; + +// make a bbox from a point with a 200 inch buffer +const box = ruler.bufferPoint(p, 200 / CheapRuler.units.inches); ``` ## Install - NPM: `npm install cheap-ruler` -- Browser build (CDN): https://npmcdn.com/cheap-ruler@1.3.0/cheap-ruler.js +- [Browser build on CDN (ESM)](https://esm.run/cheap-ruler) +- [Browser build on CDN (UMD)](https://cdn.jsdelivr.net/npm/cheap-ruler/cheap-ruler.js) ## Precision -A table that shows the margin of error for `ruler.distance` compared to `turf.distance`: +A table that shows the margin of error for `ruler.distance` compared to `node-vincenty` +(a state of the art distance formula): | lat | 0° | 10° | 20° | 30° | 40° | 50° | 60° | 70° | 80° | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1km | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | -| 100km | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | 0.08% | 0.09% | 0.11% | -| 1000km | 0.11% | 0.11% | 0.12% | 0.14% | 0.18% | 0.25% | 0.42% | 0.89% | 3.48% | +| 1km | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | +| 100km | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0.01% | 0.03% | +| 500km | 0.01% | 0.01% | 0.01% | 0.01% | 0.02% | 0.04% | 0.08% | 0.2% | 0.83% | +| 1000km | 0.03% | 0.03% | 0.04% | 0.06% | 0.1% | 0.17% | 0.33% | 0.8% | 3.38% | -The same table for a much more precise Vincenty distance formula (using `node-vincenty` module): +Errors for all other methods are similar. -| lat | 0° | 10° | 20° | 30° | 40° | 50° | 60° | 70° | 80° | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1km | 0.34% | 0.32% | 0.26% | 0.17% | 0.06% | 0.06% | 0.17% | 0.26% | 0.31% | -| 100km | 0.34% | 0.32% | 0.26% | 0.17% | 0.06% | 0.06% | 0.16% | 0.25% | 0.28% | -| 1000km | 0.36% | 0.34% | 0.3% | 0.23% | 0.16% | 0.11% | 0.17% | 0.55% | 3.08% | +## Related -Errors for all other methods are similar. +- [cheap-ruler-cpp](https://github.com/mapbox/cheap-ruler-cpp) – C++ port of this library +- [cheap-ruler-rs](https://github.com/vipera/cheap-ruler-rs) – Rust port of this library +- [flat-projection](https://github.com/Turbo87/flat-projection-rs) – Rust library based on the same concept diff --git a/bench/bench-along.js b/bench/bench-along.js index c20a923..ad5aa32 100644 --- a/bench/bench-along.js +++ b/bench/bench-along.js @@ -1,25 +1,25 @@ -'use strict'; -var runBench = require('./bench-run.js'); +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); -var ruler = cheapRuler(32.8351); +const ruler = new CheapRuler(32.8351); -var distances = lines.map(function (line) { - return ruler.lineDistance(line); -}); +const distances = lines.map(line => ruler.lineDistance(line)); runBench({ - 'turf.along': function () { - for (var i = 0; i < lines.length; i++) { - turf.along(turf.linestring(lines[i]), distances[i], 'kilometers'); + 'turf.along'() { + const options = {units: 'kilometers'}; + for (let i = 0; i < lines.length; i++) { + turf.along(turf.lineString(lines[i]), distances[i], options); } }, - 'ruler.along': function () { - for (var i = 0; i < lines.length; i++) { + 'ruler.along'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < lines.length; i++) { ruler.along(lines[i], distances[i]); } } diff --git a/bench/bench-area.js b/bench/bench-area.js index b9a6644..08233ce 100644 --- a/bench/bench-area.js +++ b/bench/bench-area.js @@ -1,29 +1,27 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); +const polygons = []; -var ruler = cheapRuler(32.8351); - -var polygons = []; - -for (var i = 0; i < lines.length; i++) { +for (let i = 0; i < lines.length; i++) { if (lines[i].length >= 3) { polygons.push([lines[i].concat([lines[i][0]])]); } } runBench({ - 'turf.area': function () { - for (var i = 0; i < polygons.length; i++) { + 'turf.area'() { + for (let i = 0; i < polygons.length; i++) { turf.area(turf.polygon(polygons[i])); } }, - 'ruler.area': function () { - for (var i = 0; i < polygons.length; i++) { + 'ruler.area'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < polygons.length; i++) { ruler.area(polygons[i]); } } diff --git a/bench/bench-bearing.js b/bench/bench-bearing.js index 683e68d..78f8fc8 100644 --- a/bench/bench-bearing.js +++ b/bench/bench-bearing.js @@ -1,22 +1,20 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); - -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); -var points = Array.prototype.concat.apply([], lines); - -var ruler = cheapRuler(32.8351); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); +const points = [].concat(...lines); runBench({ - 'turf.bearing': function () { - for (var i = 0; i < points.length - 1; i++) { + 'turf.bearing'() { + for (let i = 0; i < points.length - 1; i++) { turf.bearing(turf.point(points[i]), turf.point(points[i + 1])); } }, - 'ruler.bearing': function () { - for (var i = 0; i < points.length - 1; i++) { + 'ruler.bearing'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < points.length - 1; i++) { ruler.bearing(points[i], points[i + 1]); } } diff --git a/bench/bench-buffer-point.js b/bench/bench-buffer-point.js index 42f39ed..4ea488a 100644 --- a/bench/bench-buffer-point.js +++ b/bench/bench-buffer-point.js @@ -1,29 +1,27 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); - -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); -var points = Array.prototype.concat.apply([], lines); - -var ruler = cheapRuler(32.8351); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); +const points = [].concat(...lines); runBench({ - 'turf.destination-based bbox': function () { - for (var i = 0; i < points.length; i++) { + 'turf.destination-based bbox'() { + for (let i = 0; i < points.length; i++) { bboxBuffer(turf.point(points[i]), 0.01); } }, - 'ruler.bufferPoint': function () { - for (var i = 0; i < points.length; i++) { + 'ruler.bufferPoint'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < points.length; i++) { ruler.bufferPoint(points[i], 0.01); } } }); function bboxBuffer(pt, distance) { - var sw = turf.destination(pt, distance, -135); - var ne = turf.destination(pt, distance, 45); + const sw = turf.destination(pt, distance, -135); + const ne = turf.destination(pt, distance, 45); return sw.geometry.coordinates.concat(ne.geometry.coordinates); } diff --git a/bench/bench-destination.js b/bench/bench-destination.js index b9713a8..e1ac31a 100644 --- a/bench/bench-destination.js +++ b/bench/bench-destination.js @@ -1,22 +1,20 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); - -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); -var points = Array.prototype.concat.apply([], lines); - -var ruler = cheapRuler(32.8351); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); +const points = [].concat(...lines); runBench({ - 'turf.destination': function () { - for (var i = 0; i < points.length; i++) { + 'turf.destination'() { + for (let i = 0; i < points.length; i++) { turf.destination(turf.point(points[i]), 1, (i % 360) - 180, 'kilometers'); } }, - 'ruler.destination': function () { - for (var i = 0; i < points.length; i++) { + 'ruler.destination'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < points.length; i++) { ruler.destination(points[i], 1, (i % 360) - 180); } } diff --git a/bench/bench-distance.js b/bench/bench-distance.js index 86befb2..c0ec1c4 100644 --- a/bench/bench-distance.js +++ b/bench/bench-distance.js @@ -1,22 +1,30 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); - -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); - -var ruler = cheapRuler(32.8351); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); runBench({ - 'turf.lineDistance': function () { - for (var i = 0; i < lines.length; i++) { - turf.lineDistance(turf.linestring(lines[i])); + 'turf.lineDistance'() { + for (let i = 0; i < lines.length; i++) { + turf.lineDistance(turf.lineString(lines[i])); } }, - 'ruler.lineDistance': function () { - for (var i = 0; i < lines.length; i++) { + 'ruler.lineDistance'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < lines.length; i++) { ruler.lineDistance(lines[i]); } + }, + 'new ruler for every point'() { + for (let i = 0; i < lines.length; i++) { + let sum = 0; + for (let j = 0; j < lines[i].length - 1; j++) { + const p1 = lines[i][j]; + const p2 = lines[i][j + 1]; + sum += new CheapRuler((p1[1] + p2[1]) / 2).distance(p1, p2); // eslint-disable-line + } + } } }); diff --git a/bench/bench-inside-bbox.js b/bench/bench-inside-bbox.js index eb93fe5..48cf628 100644 --- a/bench/bench-inside-bbox.js +++ b/bench/bench-inside-bbox.js @@ -1,26 +1,23 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); +const points = [].concat(...lines); -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); -var points = Array.prototype.concat.apply([], lines); - -var ruler = cheapRuler(32.8351); - -var bboxes = points.map(function (p) { - return ruler.bufferPoint(p, 0.1); -}); +const ruler = new CheapRuler(32.8351); +const bboxes = points.map(p => ruler.bufferPoint(p, 0.1)); runBench({ - 'turf.inside + turf.bboxPolygon': function () { - for (var i = 0; i < points.length; i++) { + 'turf.inside + turf.bboxPolygon'() { + for (let i = 0; i < points.length; i++) { turf.inside(turf.point(points[i]), turf.bboxPolygon(bboxes[i])); } }, - 'ruler.insideBBox': function () { - for (var i = 0; i < points.length; i++) { + 'ruler.insideBBox'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < points.length; i++) { ruler.insideBBox(points[i], bboxes[i]); } } diff --git a/bench/bench-line-slice-along.js b/bench/bench-line-slice-along.js index f7000ce..506c27e 100644 --- a/bench/bench-line-slice-along.js +++ b/bench/bench-line-slice-along.js @@ -1,29 +1,26 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); - -var ruler = cheapRuler(32.8351); - -var distances = lines.map(function (line) { - return ruler.lineDistance(line); -}); +const ruler = new CheapRuler(32.8351); +const distances = lines.map(line => ruler.lineDistance(line)); runBench({ - 'turf.along + turf.lineSlice': function () { - for (var i = 0; i < lines.length; i++) { - var feature = turf.linestring(lines[i]); + 'turf.along + turf.lineSlice'() { + for (let i = 0; i < lines.length; i++) { + const feature = turf.lineString(lines[i]); turf.lineSlice( turf.along(feature, distances[i] * 0.3), turf.along(feature, distances[i] * 0.7), - turf.linestring(lines[i])); + turf.lineString(lines[i])); } }, - 'ruler.lineSliceAlong': function () { - for (var i = 0; i < lines.length; i++) { + 'ruler.lineSliceAlong'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < lines.length; i++) { ruler.lineSliceAlong(distances[i] * 0.3, distances[i] * 0.7, lines[i]); } } diff --git a/bench/bench-line-slice.js b/bench/bench-line-slice.js index 84ec6cc..f6c8020 100644 --- a/bench/bench-line-slice.js +++ b/bench/bench-line-slice.js @@ -1,15 +1,14 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); +const ruler = new CheapRuler(32.8351); -var ruler = cheapRuler(32.8351); - -var endpoints = lines.map(function (line) { - var dist = ruler.lineDistance(line); +const endpoints = lines.map((line) => { + const dist = ruler.lineDistance(line); return { start: ruler.along(line, dist * 0.3), stop: ruler.along(line, dist * 0.7) @@ -17,16 +16,17 @@ var endpoints = lines.map(function (line) { }); runBench({ - 'turf.lineSlice': function () { - for (var i = 0; i < lines.length; i++) { + 'turf.lineSlice'() { + for (let i = 0; i < lines.length; i++) { turf.lineSlice( turf.point(endpoints[i].start), turf.point(endpoints[i].stop), - turf.linestring(lines[i])); + turf.lineString(lines[i])); } }, - 'ruler.lineSlice': function () { - for (var i = 0; i < lines.length; i++) { + 'ruler.lineSlice'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < lines.length; i++) { ruler.lineSlice(endpoints[i].start, endpoints[i].stop, lines[i]); } } diff --git a/bench/bench-point-on-line.js b/bench/bench-point-on-line.js index d6befec..15c13ad 100644 --- a/bench/bench-point-on-line.js +++ b/bench/bench-point-on-line.js @@ -1,22 +1,21 @@ -'use strict'; +import runBench from './bench-run.js'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var runBench = require('./bench-run.js'); +const lines = JSON.parse(readFileSync(new URL('../test/fixtures/lines.json', import.meta.url))); -var cheapRuler = require('../'); -var turf = require('turf'); -var lines = require('../test/fixtures/lines.json'); - -var ruler = cheapRuler(32.8351); -var p = [-96.9159, 32.8351]; +const p = [-96.9159, 32.8351]; runBench({ - 'turf.pointOnLine': function () { - for (var i = 0; i < lines.length; i++) { - turf.pointOnLine(turf.linestring(lines[i]), turf.point(p)); + 'turf.pointOnLine'() { + for (let i = 0; i < lines.length; i++) { + turf.pointOnLine(turf.lineString(lines[i]), turf.point(p)); } }, - 'ruler.pointOnLine': function () { - for (var i = 0; i < lines.length; i++) { + 'ruler.pointOnLine'() { + const ruler = new CheapRuler(32.8351); + for (let i = 0; i < lines.length; i++) { ruler.pointOnLine(lines[i], p); } } diff --git a/bench/bench-run.js b/bench/bench-run.js index 7fca99d..5d1f6ca 100644 --- a/bench/bench-run.js +++ b/bench/bench-run.js @@ -1,22 +1,22 @@ -'use strict'; -var Benchmark = require('benchmark'); +import Benchmark from 'benchmark'; -module.exports = function (config) { - var suite = new Benchmark.Suite(); +export default function benchRun(config) { + const suite = new Benchmark.Suite(); - for (var name in config) { + for (const name in config) { + config[name](); suite.add(name, config[name]); } suite - .on('cycle', function (event) { - console.log(String(event.target)); - }) - .on('complete', function () { - var fastest = this.filter('fastest')[0]; - var slowest = this.filter('slowest')[0]; - console.log(fastest.name + ' is ' + (Math.round(10 * fastest.hz / slowest.hz) / 10) + 'x faster'); - }) - .run(); + .on('cycle', (event) => { + console.log(String(event.target)); + }) + .on('complete', () => { + const fastest = suite.filter('fastest')[0]; + const slowest = suite.filter('slowest')[0]; + console.log(`${fastest.name } is ${ Math.round(10 * fastest.hz / slowest.hz) / 10 }x faster`); + }) + .run(); }; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..c37aca1 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1 @@ +export {default} from 'eslint-config-mourner'; diff --git a/index.js b/index.js index c4f7dda..bcfc205 100644 --- a/index.js +++ b/index.js @@ -1,119 +1,298 @@ -'use strict'; -module.exports = cheapRuler; +const factors = { + kilometers: 1, + miles: 1000 / 1609.344, + nauticalmiles: 1000 / 1852, + meters: 1000, + metres: 1000, + yards: 1000 / 0.9144, + feet: 1000 / 0.3048, + inches: 1000 / 0.0254 +}; -function cheapRuler(lat, units) { - return new CheapRuler(lat, units); -} +// Values that define WGS84 ellipsoid model of the Earth +const RE = 6378.137; // equatorial radius +const FE = 1 / 298.257223563; // flattening + +const E2 = FE * (2 - FE); +const RAD = Math.PI / 180; + +/** + * A collection of very fast approximations to common geodesic measurements. Useful for performance-sensitive code that measures things on a city scale. + */ +export default class CheapRuler { + /** + * Creates a ruler object from tile coordinates (y and z). + * + * @param {number} y + * @param {number} z + * @param {keyof typeof factors} [units='kilometers'] + * @returns {CheapRuler} + * @example + * const ruler = cheapRuler.fromTile(1567, 12); + * //=ruler + */ + static fromTile(y, z, units) { + const n = Math.PI * (1 - 2 * (y + 0.5) / Math.pow(2, z)); + const lat = Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))) / RAD; + return new CheapRuler(lat, units); + } -cheapRuler.fromTile = function (y, z, units) { - var n = Math.PI * (1 - 2 * (y + 0.5) / Math.pow(2, z)); - var lat = Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))) * 180 / Math.PI; - return new CheapRuler(lat, units); -}; + /** + * Multipliers for converting between units. + * + * @example + * // convert 50 meters to yards + * 50 * CheapRuler.units.yards / CheapRuler.units.meters; + */ + static get units() { + return factors; + } -function CheapRuler(lat, units) { - if (lat === undefined) throw new Error('No latitude given.'); + /** + * Creates a ruler instance for very fast approximations to common geodesic measurements around a certain latitude. + * + * @param {number} lat latitude + * @param {keyof typeof factors} [units='kilometers'] + * @example + * const ruler = cheapRuler(35.05, 'miles'); + * //=ruler + */ + constructor(lat, units) { + if (lat === undefined) throw new Error('No latitude given.'); + if (units && !factors[units]) throw new Error(`Unknown unit ${ units }. Use one of: ${ Object.keys(factors).join(', ')}`); + + // Curvature formulas from https://en.wikipedia.org/wiki/Earth_radius#Meridional + const m = RAD * RE * (units ? factors[units] : 1); + const coslat = Math.cos(lat * RAD); + const w2 = 1 / (1 - E2 * (1 - coslat * coslat)); + const w = Math.sqrt(w2); + + // multipliers for converting longitude and latitude degrees into distance + this.kx = m * w * coslat; // based on normal radius of curvature + this.ky = m * w * w2 * (1 - E2); // based on meridonal radius of curvature + } - // units per degree on equator - this.d = (units === 'miles' ? 24901.55 : 40075.16) / 360; + /** + * Given two points of the form [longitude, latitude], returns the distance. + * + * @param {[number, number]} a point [longitude, latitude] + * @param {[number, number]} b point [longitude, latitude] + * @returns {number} distance + * @example + * const distance = ruler.distance([30.5, 50.5], [30.51, 50.49]); + * //=distance + */ + distance(a, b) { + const dx = wrap(a[0] - b[0]) * this.kx; + const dy = (a[1] - b[1]) * this.ky; + return Math.sqrt(dx * dx + dy * dy); + } - // longitude correction based on latitude - this.e = Math.cos(lat * Math.PI / 180); -} + /** + * Returns the bearing between two points in angles. + * + * @param {[number, number]} a point [longitude, latitude] + * @param {[number, number]} b point [longitude, latitude] + * @returns {number} bearing + * @example + * const bearing = ruler.bearing([30.5, 50.5], [30.51, 50.49]); + * //=bearing + */ + bearing(a, b) { + const dx = wrap(b[0] - a[0]) * this.kx; + const dy = (b[1] - a[1]) * this.ky; + return Math.atan2(dx, dy) / RAD; + } + + /** + * Returns a new point given distance and bearing from the starting point. + * + * @param {[number, number]} p point [longitude, latitude] + * @param {number} dist distance + * @param {number} bearing + * @returns {[number, number]} point [longitude, latitude] + * @example + * const point = ruler.destination([30.5, 50.5], 0.1, 90); + * //=point + */ + destination(p, dist, bearing) { + const a = bearing * RAD; + return this.offset(p, + Math.sin(a) * dist, + Math.cos(a) * dist); + } -CheapRuler.prototype = { - distance: function (a, b) { - var dx = (a[0] - b[0]) * this.e; - var dy = a[1] - b[1]; - return Math.sqrt(dx * dx + dy * dy) * this.d; - }, - - bearing: function (a, b) { - var dx = (b[0] - a[0]) * this.e; - var dy = b[1] - a[1]; - if (!dx && !dy) return 0; - var bearing = Math.atan2(-dy, dx) * 180 / Math.PI + 90; - if (bearing > 180) bearing -= 360; - return bearing; - }, - - destination: function (p, dist, bearing) { - var a = (90 - bearing) * Math.PI / 180; - var d = dist / this.d; + /** + * Returns a new point given easting and northing offsets (in ruler units) from the starting point. + * + * @param {[number, number]} p point [longitude, latitude] + * @param {number} dx easting + * @param {number} dy northing + * @returns {[number, number]} point [longitude, latitude] + * @example + * const point = ruler.offset([30.5, 50.5], 10, 10); + * //=point + */ + offset(p, dx, dy) { return [ - p[0] + d * Math.cos(a) / this.e, - p[1] + d * Math.sin(a) + p[0] + dx / this.kx, + p[1] + dy / this.ky ]; - }, + } - lineDistance: function (points) { - var total = 0; - for (var i = 0; i < points.length - 1; i++) { + /** + * Given a line (an array of points), returns the total line distance. + * + * @param {[number, number][]} points [longitude, latitude] + * @returns {number} total line distance + * @example + * const length = ruler.lineDistance([ + * [-67.031, 50.458], [-67.031, 50.534], + * [-66.929, 50.534], [-66.929, 50.458] + * ]); + * //=length + */ + lineDistance(points) { + let total = 0; + for (let i = 0; i < points.length - 1; i++) { total += this.distance(points[i], points[i + 1]); } return total; - }, - - area: function (polygon) { - var sum = 0; - - for (var i = 0; i < polygon.length; i++) { - var ring = polygon[i]; + } - for (var j = 0, len = ring.length, k = len - 1; j < len; k = j++) { - sum += (ring[j][0] - ring[k][0]) * (ring[j][1] + ring[k][1]) * (i ? -1 : 1); + /** + * Given a polygon (an array of rings, where each ring is an array of points), returns the area. + * + * @param {[number, number][][]} polygon + * @returns {number} area value in the specified units (square kilometers by default) + * @example + * const area = ruler.area([[ + * [-67.031, 50.458], [-67.031, 50.534], [-66.929, 50.534], + * [-66.929, 50.458], [-67.031, 50.458] + * ]]); + * //=area + */ + area(polygon) { + let sum = 0; + + for (let i = 0; i < polygon.length; i++) { + const ring = polygon[i]; + + for (let j = 0, len = ring.length, k = len - 1; j < len; k = j++) { + sum += wrap(ring[j][0] - ring[k][0]) * (ring[j][1] + ring[k][1]) * (i ? -1 : 1); } } - return (Math.abs(sum) / 2) * this.e * this.d * this.d; - }, + return (Math.abs(sum) / 2) * this.kx * this.ky; + } - along: function (line, dist) { - var sum = 0; + /** + * Returns the point at a specified distance along the line. + * + * @param {[number, number][]} line + * @param {number} dist distance + * @returns {[number, number]} point [longitude, latitude] + * @example + * const point = ruler.along(line, 2.5); + * //=point + */ + along(line, dist) { + let sum = 0; if (dist <= 0) return line[0]; - for (var i = 0; i < line.length - 1; i++) { - var p0 = line[i]; - var p1 = line[i + 1]; - var d = this.distance(p0, p1); + for (let i = 0; i < line.length - 1; i++) { + const p0 = line[i]; + const p1 = line[i + 1]; + const d = this.distance(p0, p1); sum += d; if (sum > dist) return interpolate(p0, p1, (dist - (sum - d)) / d); } return line[line.length - 1]; - }, + } + + /** + * Returns the distance from a point `p` to a line segment `a` to `b`. + * + * @pointToSegmentDistance + * @param {[number, number]} p point [longitude, latitude] + * @param {[number, number]} a segment point 1 [longitude, latitude] + * @param {[number, number]} b segment point 2 [longitude, latitude] + * @returns {number} distance + * @example + * const distance = ruler.pointToSegmentDistance([-67.04, 50.5], [-67.05, 50.57], [-67.03, 50.54]); + * //=distance + */ + pointToSegmentDistance(p, a, b) { + let [x, y] = a; + let dx = wrap(b[0] - x) * this.kx; + let dy = (b[1] - y) * this.ky; + + if (dx !== 0 || dy !== 0) { + const t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = b[0]; + y = b[1]; + + } else if (t > 0) { + x += (dx / this.kx) * t; + y += (dy / this.ky) * t; + } + } - pointOnLine: function (line, p) { - var minDist = Infinity; - var minX, minY, minI, minT; + dx = wrap(p[0] - x) * this.kx; + dy = (p[1] - y) * this.ky; - for (var i = 0; i < line.length - 1; i++) { + return Math.sqrt(dx * dx + dy * dy); + } - var x = line[i][0]; - var y = line[i][1]; - var dx = (line[i + 1][0] - x) * this.e; - var dy = line[i + 1][1] - y; + /** + * Returns an object of the form {point, index, t}, where point is closest point on the line + * from the given point, index is the start index of the segment with the closest point, + * and t is a parameter from 0 to 1 that indicates where the closest point is on that segment. + * + * @param {[number, number][]} line + * @param {[number, number]} p point [longitude, latitude] + * @returns {{point: [number, number], index: number, t: number}} {point, index, t} + * @example + * const point = ruler.pointOnLine(line, [-67.04, 50.5]).point; + * //=point + */ + pointOnLine(line, p) { + let minDist = Infinity; + let minX = line[0][0]; + let minY = line[0][1]; + let minI = 0; + let minT = 0; + + for (let i = 0; i < line.length - 1; i++) { + + let x = line[i][0]; + let y = line[i][1]; + let dx = wrap(line[i + 1][0] - x) * this.kx; + let dy = (line[i + 1][1] - y) * this.ky; + let t = 0; if (dx !== 0 || dy !== 0) { - - var t = ((p[0] - x) * this.e * dx + (p[1] - y) * dy) / (dx * dx + dy * dy); + t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy); if (t > 1) { x = line[i + 1][0]; y = line[i + 1][1]; } else if (t > 0) { - x += dx * t / this.e; - y += dy * t; + x += (dx / this.kx) * t; + y += (dy / this.ky) * t; } } - dx = (p[0] - x) * this.e; - dy = p[1] - y; + dx = wrap(p[0] - x) * this.kx; + dy = (p[1] - y) * this.ky; - var sqDist = dx * dx + dy * dy; + const sqDist = dx * dx + dy * dy; if (sqDist < minDist) { minDist = sqDist; minX = x; @@ -126,29 +305,40 @@ CheapRuler.prototype = { return { point: [minX, minY], index: minI, - t: minT + t: Math.max(0, Math.min(1, minT)) }; - }, + } - lineSlice: function (start, stop, line) { - var p1 = this.pointOnLine(line, start); - var p2 = this.pointOnLine(line, stop); + /** + * Returns a part of the given line between the start and the stop points (or their closest points on the line). + * + * @param {[number, number]} start point [longitude, latitude] + * @param {[number, number]} stop point [longitude, latitude] + * @param {[number, number][]} line + * @returns {[number, number][]} line part of a line + * @example + * const line2 = ruler.lineSlice([-67.04, 50.5], [-67.05, 50.56], line1); + * //=line2 + */ + lineSlice(start, stop, line) { + let p1 = this.pointOnLine(line, start); + let p2 = this.pointOnLine(line, stop); if (p1.index > p2.index || (p1.index === p2.index && p1.t > p2.t)) { - var tmp = p1; + const tmp = p1; p1 = p2; p2 = tmp; } - var slice = [p1.point]; + const slice = [p1.point]; - var l = p1.index + 1; - var r = p2.index; + const l = p1.index + 1; + const r = p2.index; if (!equals(line[l], slice[0]) && l <= r) slice.push(line[l]); - for (var i = l + 1; i <= r; i++) { + for (let i = l + 1; i <= r; i++) { slice.push(line[i]); } @@ -156,16 +346,27 @@ CheapRuler.prototype = { slice.push(p2.point); return slice; - }, - - lineSliceAlong: function (start, stop, line) { - var sum = 0; - var slice = []; + } - for (var i = 0; i < line.length - 1; i++) { - var p0 = line[i]; - var p1 = line[i + 1]; - var d = this.distance(p0, p1); + /** + * Returns a part of the given line between the start and the stop points indicated by distance along the line. + * + * @param {number} start start distance + * @param {number} stop stop distance + * @param {[number, number][]} line + * @returns {[number, number][]} part of a line + * @example + * const line2 = ruler.lineSliceAlong(10, 20, line1); + * //=line2 + */ + lineSliceAlong(start, stop, line) { + let sum = 0; + const slice = []; + + for (let i = 0; i < line.length - 1; i++) { + const p0 = line[i]; + const p1 = line[i + 1]; + const d = this.distance(p0, p1); sum += d; @@ -182,47 +383,97 @@ CheapRuler.prototype = { } return slice; - }, + } - bufferPoint: function (p, buffer) { - var v = buffer / this.d; - var h = v / this.e; + /** + * Given a point, returns a bounding box object ([w, s, e, n]) created from the given point buffered by a given distance. + * + * @param {[number, number]} p point [longitude, latitude] + * @param {number} buffer + * @returns {[number, number, number, number]} bbox ([w, s, e, n]) + * @example + * const bbox = ruler.bufferPoint([30.5, 50.5], 0.01); + * //=bbox + */ + bufferPoint(p, buffer) { + const v = buffer / this.ky; + const h = buffer / this.kx; return [ p[0] - h, p[1] - v, p[0] + h, p[1] + v ]; - }, + } - bufferBBox: function (bbox, buffer) { - var v = buffer / this.d; - var h = v / this.e; + /** + * Given a bounding box, returns the box buffered by a given distance. + * + * @param {[number, number, number, number]} bbox ([w, s, e, n]) + * @param {number} buffer + * @returns {[number, number, number, number]} bbox ([w, s, e, n]) + * @example + * const bbox = ruler.bufferBBox([30.5, 50.5, 31, 51], 0.2); + * //=bbox + */ + bufferBBox(bbox, buffer) { + const v = buffer / this.ky; + const h = buffer / this.kx; return [ bbox[0] - h, bbox[1] - v, bbox[2] + h, bbox[3] + v ]; - }, + } - insideBBox: function (p, bbox) { - return p[0] >= bbox[0] && - p[0] <= bbox[2] && + /** + * Returns true if the given point is inside in the given bounding box, otherwise false. + * + * @param {[number, number]} p point [longitude, latitude] + * @param {[number, number, number, number]} bbox ([w, s, e, n]) + * @returns {boolean} + * @example + * const inside = ruler.insideBBox([30.5, 50.5], [30, 50, 31, 51]); + * //=inside + */ + insideBBox(p, bbox) { // eslint-disable-line + return wrap(p[0] - bbox[0]) >= 0 && + wrap(p[0] - bbox[2]) <= 0 && p[1] >= bbox[1] && p[1] <= bbox[3]; } -}; +} +/** + * @param {[number, number]} a + * @param {[number, number]} b + */ function equals(a, b) { return a[0] === b[0] && a[1] === b[1]; } +/** + * @param {[number, number]} a + * @param {[number, number]} b + * @param {number} t + * @returns {[number, number]} + */ function interpolate(a, b, t) { - var dx = b[0] - a[0]; - var dy = b[1] - a[1]; + const dx = wrap(b[0] - a[0]); + const dy = b[1] - a[1]; return [ a[0] + dx * t, a[1] + dy * t ]; } + +/** + * normalize a degree value into [-180..180] range + * @param {number} deg + */ +function wrap(deg) { + while (deg < -180) deg += 360; + while (deg > 180) deg -= 360; + return deg; +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8845fc8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4500 @@ +{ + "name": "cheap-ruler", + "version": "4.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cheap-ruler", + "version": "4.0.0", + "license": "ISC", + "devDependencies": { + "@turf/turf": "^7.0.0", + "benchmark": "^2.1.4", + "eslint": "^9.5.0", + "eslint-config-mourner": "^4.0.0", + "node-vincenty": "0.0.6", + "rollup": "^4.18.0", + "typescript": "^5.5.2" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.16.0.tgz", + "integrity": "sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.5.0.tgz", + "integrity": "sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.3.0.tgz", + "integrity": "sha512-lQwoiYb0Fs6Yc5QS3uT8+T9CPKK2Eoxc3H8EnYJgM26v/DgtW+1lvy2WNgyBflU+ThShZaHm3a6CdD9QeKx23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^8.56.10", + "acorn": "^8.11.3", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@turf/along": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/along/-/along-7.0.0.tgz", + "integrity": "sha512-OyZcvwYwsLxlqC6ksFMNAkZ1fF/0Xfg38v4jx6D9OsaQcIDgvzXnlkuUnS3w11imfulokijkLEFnvJXFZKAzRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.0.0", + "@turf/destination": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/angle": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/angle/-/angle-7.0.0.tgz", + "integrity": "sha512-3+Lp/fyJdtoS+zMu4ZGgV1PhXub7fiowvwId6w5fNtUHWaQ2e0fUgWMAv8opVSC9gRnUtOq2QuJZdIGQAL+fkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/rhumb-bearing": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/area": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.0.0.tgz", + "integrity": "sha512-Q/P6OGV8dJJs1BiraKFNBjtsMbz7B52mLCtgKh3syzujSREMx52RlsiOBQp8GujFMMiau+Mt25XKbVwtjHVi8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.0.0.tgz", + "integrity": "sha512-IyXG5HAsn6IZLdAtQo7aWYccjU5WsV+uzIzhGaXrh/qTVylSYmRiWgLdiekHZVED9nv9r7D/EJUMOT4zyA6POA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-clip": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.0.0.tgz", + "integrity": "sha512-ZSReB14sSQpP5TE6g5SijVFijxMp8pyrM0PgEN1LR9Bm+nj7BmmGzHafV3lyteml2bmlFdQxkbTqcbvlVXS98g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-polygon": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-7.0.0.tgz", + "integrity": "sha512-RMBADOr0zOhVhTidKXCAx1TLTzgBvZwQKI6KJ1FgoCPH7GMZZnMXGMvOtdQLdsplS4Zs6+NoVtaK2x0+EXdYJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bearing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-7.0.0.tgz", + "integrity": "sha512-r6eBNqqiC8OtW+xIzu0ZyciAUfM85l2LVN2qpTeEyhnaNmnPw7hDsnqwZcbqoBFSLB66MO+BLH40X5OdaoRmmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bezier-spline": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-7.0.0.tgz", + "integrity": "sha512-1FFVLc+oa5t9S7XWsYImfOVNLWESAJo3ztC4GRlGeAFQBi5z8kSptBaGRLkTn387lZLZ1VQXYRgAfR2mP69/VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-clockwise": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-7.0.0.tgz", + "integrity": "sha512-Tn+ShgMcgIll+TeIAUHW0diPpxCN1PfQ6uZrwUJXzQXfoxlns16NvJByTBWCl+E9UCA+m1QRjHpVOzyf8pSOOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-concave": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-concave/-/boolean-concave-7.0.0.tgz", + "integrity": "sha512-ybKMUriBFzqvjJMOM+YPID2h0a7ye1ur95NkXzV+GRDG16W0KOtTcSXz3LFfHIBEXtG1dqRIxPSV2uwTTKwDTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-contains": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-7.0.0.tgz", + "integrity": "sha512-1NILJdO5OO1YrD7hYPlpahROkzd1DFA7Lcp7SxL+hTtKTp/a2iZx+K6u2qKMLUlPO1p2zhSbMfvjl1T6s/H8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/boolean-point-on-line": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-crosses": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-7.0.0.tgz", + "integrity": "sha512-T8/U3fXvEaaf7NbRf42s7hnOYUarK7K1ztXOan0hESnWVzMRFwzIv9QeSW4mARAPU/oV1oOMhSITfbF/Et6W1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/line-intersect": "^7.0.0", + "@turf/polygon-to-line": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-disjoint": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-7.0.0.tgz", + "integrity": "sha512-MAHKqMtdktgxFnz9XFrzyN+VTtmNSd+PgRyo/CT9ucsZ18hd3PV9Y3obGw/k0T6AglMivhBadlHiSMnTfed4Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/line-intersect": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/polygon-to-line": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-equal": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-7.0.0.tgz", + "integrity": "sha512-9C7xkxOyqN0/8Ze4TrysKWWYZxWB0s6zSBaADuVhaIsFzfwvC5wbEpwOL8pRop++7YRRlJ92QM8Bq53DU8+7LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clean-coords": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-intersects": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-7.0.0.tgz", + "integrity": "sha512-+jNZw/ziZ2xyeDoasuwubVu3arRS71i6tSxvnPQmsWISki6rLJF7OQEkc9LNIllYlADCZUkUTJ1OktznrEUDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-disjoint": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-overlap": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-7.0.0.tgz", + "integrity": "sha512-mnZxjGSs8OuH/+QUuP5FGkut2bLr1FGZ63ThJ97aUuJP+lZQnYnkPdT1hQIdcyhtTQgF1yOM7EH+O//DkoROpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/line-intersect": "^7.0.0", + "@turf/line-overlap": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-parallel": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-7.0.0.tgz", + "integrity": "sha512-OTL9XLjzRulLPQ12il3my9fLhemHsoyYe/owxNYz+kYtUyDHQ6lRz6vEaI3W7MKY9fnqwuIdJQpckOL5TH2cPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clean-coords": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/line-segment": "^7.0.0", + "@turf/rhumb-bearing": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-in-polygon": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.0.0.tgz", + "integrity": "sha512-Z9swETfICqUJ8iVLZimvIOh8r4Wrlu9/X/c/5vIEeVvG4Lu78Ztmgu1KaobZJFC93/ntOAjMBavc9aNgw7TXgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "point-in-polygon-hao": "^1.1.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-on-line": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-7.0.0.tgz", + "integrity": "sha512-9/1hj2MxcUU4fZu+MQC6rdMsdvAYNTtfxssLrZ1dGXo+NcAoWFbZSrfk62pSJBflveyKY5kXPYY+xQfLT0NeDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-touches": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-touches/-/boolean-touches-7.0.0.tgz", + "integrity": "sha512-eZE2uvylkQLAePHTGRjnVlr+QKnwU9gPAarz2q4YF7hi2QRDQd8kc+Ai/450C3xL9iPYO6wrbAQ7qpmB1Jsq4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/boolean-point-on-line": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-valid": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-valid/-/boolean-valid-7.0.0.tgz", + "integrity": "sha512-TM2UBVFu59u8fAZVHsVnnnCv6486J2uCFmhsVsSCgTgTET1+Lm0TK0XTj5cyPSYR35qR/BjcU1gO3l45bdap9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/boolean-crosses": "^7.0.0", + "@turf/boolean-disjoint": "^7.0.0", + "@turf/boolean-overlap": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/boolean-point-on-line": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/line-intersect": "^7.0.0", + "geojson-polygon-self-intersections": "^1.2.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-within": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-7.0.0.tgz", + "integrity": "sha512-QmOX34T7z9wzuzUVsXx3KMCMsxLi71/SOcrgkcHhcWsThx+VPPmyIUtTa8XnBt1BBlx7IIrR2pAeORkUi0CdEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/boolean-point-on-line": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/buffer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-7.0.0.tgz", + "integrity": "sha512-viw3XjTtYVtkq5DkRDBQjXoi5QeEMhe4JHWXIfHMHs4o5F9B+lZ8+TtXWo18X5aAXknv6ib1z2syoaQdBpb5Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/center": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/jsts": "^2.7.1", + "@turf/meta": "^7.0.0", + "@turf/projection": "^7.0.0", + "d3-geo": "1.7.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/center/-/center-7.0.0.tgz", + "integrity": "sha512-5RZia9uuWxz2oCyd1vsNkBeraBNdwCsIo4UGRQdyswBeLFVbRwIUa7M7+2z2D7B1YIgovuLIRVfk6FeWUQXDtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-mean": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-7.0.0.tgz", + "integrity": "sha512-pneYkH6/4a6gDDvhVL2by9OCJ4yTIANoHQ4JpYVjvB1VlQWrVI5qQd80+q3bMKCDWaACEq8UWa/5NmvKlSRT3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-median": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-7.0.0.tgz", + "integrity": "sha512-ppCVjwwNe3Rz86TQp+zt9uFI9ZlFwu2miQtpFVcv2ej9IN2D5PUIRnehWgVeQ+yZ+ocMjMNLMcackUnqeKR4FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/center-mean": "^7.0.0", + "@turf/centroid": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-of-mass": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-7.0.0.tgz", + "integrity": "sha512-vnD43bX4jl1ViDjY+nxISeQd8vfPqvLw+0N1MxpweCh5S85DNqUg6J8GXC1kbZlfOBS3mS9p2CW1Rfg4ggiGHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/centroid": "^7.0.0", + "@turf/convex": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.0.0.tgz", + "integrity": "sha512-TMKp5yadglNVRxX3xuk1qQDEy5JFHmlYVBamzXuD8DL8rYdVog2x4gQHrwn7xrUyAlKJ4fUZZPkYBWfW6TDWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/circle": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-7.0.0.tgz", + "integrity": "sha512-rRMthTL5+mhiFXQwlk4jUuf0pkqDAhry/El03VNYNyDGOx4N6p0XMmgbIdJmG6ZooinHpHfMU4N8ZQ9Xo6vVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/destination": "^7.0.0", + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clean-coords": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-7.0.0.tgz", + "integrity": "sha512-kaKR4/NnhZpgC+hWY3MfPqV2KwzG4Vr66WH59GbT5B2tvAOJqAYUmq+rgyMsG6xA3fTBL3neDW0bY1DHFVcvHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clone": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-7.0.0.tgz", + "integrity": "sha512-bQBx/wbQoGNtZzuHetLt44NMqOCnjSXcvTWm+LJ7YTmwrqZVAjISDhFxgawY/L+G3p+ya5WoxQwZWak80uYg3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-7.0.0.tgz", + "integrity": "sha512-s96uAedbT+9JX6Cg11TsjyZRZIOYABBplA7vKlFgfEKitscCRFUP+pVgiRXy8wBgyKsXqG28DJr96kXQaJKSeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-dbscan": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-7.0.0.tgz", + "integrity": "sha512-q8P7MjD0jGhNOzE+I6Cj8UiVaqkuDV27nGA8fLZWNxLW27+X2QJzU+NFLkx0suV9ApmCWRiaIyWUHWG9uZntxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "rbush": "^3.0.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-kmeans": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-7.0.0.tgz", + "integrity": "sha512-ZwN4sLcTgeD7meryarJZunLXISHM7ZLc0S7Lgwv64fYsYU2ea64BMst5mRFCZsrrlFdYmrwUo4DlihL8k9XLKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "skmeans": "0.9.7", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/collect": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-7.0.0.tgz", + "integrity": "sha512-zgKPVVmNr/5OJiHLnQAzDCMv1xDxwuNw8PfCPYkek8s2dvr9LFlEMfPxnp9hY+/oHJx8+1mC01c9qgb7hF8yPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/helpers": "^7.0.0", + "rbush": "^3.0.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/combine": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-7.0.0.tgz", + "integrity": "sha512-xNg6XGAwEWmpjYImJ3+vie+ASKQ7dzUrwUDJ5DOOS8XonLkVAIGus+qDoXdIzAcb9jqSaSFC4sGmQFdTM1Sj1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/concave": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-7.0.0.tgz", + "integrity": "sha512-iwrLBgCUgsquvLSCnzppPVDWGLoCjVDV9xgg7jncbi9aURuGPfhHd5eaC9fyxtIlSbcfrSDXSHJLoeC6bpmlOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/tin": "^7.0.0", + "topojson-client": "3.x", + "topojson-server": "3.x", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/convex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-7.0.0.tgz", + "integrity": "sha512-iAAwC1FPB4aiA7djUU/pk7lMgWjACbQOB2oX6cH39P5M7W6GXhrTEvYAx+thBtNq+M6BPk/gk3bU1BjZFrQ4+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "concaveman": "^1.2.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/destination": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-7.0.0.tgz", + "integrity": "sha512-wXfLd37ul7xuFvv4L7dtNQOZnmYepnrsMZrxbmxvy2SCnF+Rzf1C7D1NQ6+Nx5SInB/SbTfi6SCDgyfB8MOawQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/difference": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-7.0.0.tgz", + "integrity": "sha512-JCPRuGcOkT+Hq5PJcEUhkCheTyJcwB5dS1SIJGhDDNOJp8m8REHFJCmvxA3K40demovbyDLk85AojYpJ3jlALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/dissolve": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-7.0.0.tgz", + "integrity": "sha512-WUapSrl4nTpKGQ9uacfefPNI8mEl0PYrCN6vDTs2W4k6UT9NdeJYNPaR6275nAoOUEL9t9K+adPgdMltm/EG3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/flatten": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-7.0.0.tgz", + "integrity": "sha512-DBPKhHABpPZ0KRduRpEaoi8MB6r1DVuyyps68VFH2Qi5H0ZnFtJFj7nQxBPZR3bVpbUq4zzu7I+MiNAd3ujFWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance-weight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-7.0.0.tgz", + "integrity": "sha512-BFftfC1QdtcJNMx4TOYxkHX/xsy4FjiG4tdEgdx99DBZ4L1RS/qqgC1O943WuqbfvJTn15E6ka0Rkep2/90IMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/centroid": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/ellipse": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-7.0.0.tgz", + "integrity": "sha512-bdHzKPfxIWVz3p7jlsyi89BAxvjIhxCgLzDXKYp4tSf2LYGpkfWpSJA2bRnj7TuEq5zYQR8L5LJhn7jg0hehlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/rhumb-destination": "^7.0.0", + "@turf/transform-rotate": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/envelope": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-7.0.0.tgz", + "integrity": "sha512-110YN+9PmhRYE7co+4ewB/IY3SL9q90mw5FoXrv97VRYVlf8jQCa2mwSalMiuAGnhvfG+Yq1k+ibjjLJcS3gWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/bbox-polygon": "^7.0.0", + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/explode": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-7.0.0.tgz", + "integrity": "sha512-q7KZ/PxY9zHN4UGXaADUpsHGkj8lbexVZxdBnp0nEfTHm/ziLTAfpI15CdAknoz4Ee8k8tx7ldosVjjg7YJ3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flatten": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-7.0.0.tgz", + "integrity": "sha512-QVTPgE9PdulQiQPglQ+mXpThBfp3v5RhCSupBCAoqOkqo/KfnliHqJXmVTaZotUZnMgc3wbAMJtSJvDRhTnFFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flip": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-7.0.0.tgz", + "integrity": "sha512-8yqhjXhqKF9fqN4ZfLgVNKCX0AVDaOY9KzD3AGQ+UiRHgmnY/F/T8Np9hSgEVQl1E9N6GXWF/7d8fOTVKCFCbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/geojson-rbush": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/geojson-rbush/-/geojson-rbush-7.0.0.tgz", + "integrity": "sha512-h0fJPWHkpGEHkVvQ/tv4FwYkWuEbhbSF0rrQEUyXwvZtlZPRBYJ7WQ5qRsvE7QdQK81B7jWxZiM/qWeayALu1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "@types/geojson": "7946.0.8", + "rbush": "^3.0.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/great-circle": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-7.0.0.tgz", + "integrity": "sha512-onZYQ4ZiN2sIff8j648k+eaeavC+W2wG9L+7wSZjWgeaM4t40r3ZhcJLwqmMUSHxccACNlnINukQodulsflFDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz", + "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-equal": "^2.2.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/hex-grid": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-7.0.0.tgz", + "integrity": "sha512-6vWO/eVyCvk9mUOj7wxCRUSFpZ0Rlqo4fLvAWX+WsNlOn7xnYs8TFXyiVuWcJdWiMX/LzjOF2OTI6HXF3BhEAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/intersect": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/interpolate": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-7.0.0.tgz", + "integrity": "sha512-ERorrpqItp/qrVtkCkFhB0i4fgjb27cCObTucWdSVUMEitH2ieEQzysmghtyq2F6zq1DW3tC33Jjr79IDj+X6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/centroid": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/hex-grid": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/point-grid": "^7.0.0", + "@turf/square-grid": "^7.0.0", + "@turf/triangle-grid": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/intersect": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-7.0.0.tgz", + "integrity": "sha512-2GL9yAPwmzkec5UiuPbVdLpPVsJIRVl8obPu4oMzhOMKVqw3UGsFGCjWNOY2cKg2cN8E7ijfAEoFNztLyNPY+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.0.0.tgz", + "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isobands": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-7.0.0.tgz", + "integrity": "sha512-2l+FIbywYPCsus8+H6eSyyf3Xsrbe+Zi0NbgpVDScvR9TVu55ta0KMvQdS4aMEtg9ADlQa/C81hZhmYsBtvLug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/area": "^7.0.0", + "@turf/bbox": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/explode": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "marchingsquares": "^1.3.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isolines": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-7.0.0.tgz", + "integrity": "sha512-3LqwbzHnZ19gca5VC08XnHK36iRw2tEKjVtrI87iq6QEN9rR4FYcZOCmkPznYKwMKr44KkZKOlfNq/s72s1t3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "marchingsquares": "^1.3.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/jsts": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@turf/jsts/-/jsts-2.7.1.tgz", + "integrity": "sha512-+nwOKme/aUprsxnLSfr2LylV6eL6T1Tuln+4Hl92uwZ8FrmjDRCH5Bi1LJNVfWCiYgk8+5K+t2zDphWNTsIFDA==", + "dev": true, + "license": "(EDL-1.0 OR EPL-1.0)", + "dependencies": { + "jsts": "2.7.1" + } + }, + "node_modules/@turf/kinks": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-7.0.0.tgz", + "integrity": "sha512-rUzx2G4NSb7f+SMjuBZBakrK4BrS3pfb67vYH8XQA28C9NBRQcZqJBCjXqA079q16GXiDpjCLianQMewtd6ksw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "sweepline-intersections": "^1.5.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/length": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/length/-/length-7.0.0.tgz", + "integrity": "sha512-B+ABesWLtQc8W310LJ8kmUn//NfpUUhsm4Gwt9ZHNYxBVV+FNolY965F7DYm/tvLMZP9bGMomTlczFWV7O4YIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-arc": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-7.0.0.tgz", + "integrity": "sha512-kxZJlbQHR5F7toJ7QR+qF4eWX74RydGavCr2/IPOjcFK1mcSkTfyiSli3pciavD4eH3tHx0flTqH2poqTQxtyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/circle": "^7.0.0", + "@turf/destination": "^7.0.0", + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-chunk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-7.0.0.tgz", + "integrity": "sha512-oA4GuUSxof3o0JOhNyS+CdzpqJ0VFro8RlGkTtymMhEMly4T7xjbMdffIrJ9o8hpnNKdwkJs4bcB98UD8sSPeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/length": "^7.0.0", + "@turf/line-slice-along": "^7.0.0", + "@turf/meta": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-intersect": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-7.0.0.tgz", + "integrity": "sha512-vxCwzxCbTyKXO3GsEFQ8hyH1nLQShBhvFobRM2bLrbBlP2fWY9LDGixBcmWuOwV/G/wpQJxAjBJ6IYHjKIJqyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "sweepline-intersections": "^1.5.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-offset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-7.0.0.tgz", + "integrity": "sha512-ZQHAuR2y0ktG8uYAbaxGsJh931oCBwrxzOjiRtOcMifc/Hty37WFVaE9rCDrYrMLut7Ye9JQ36c6DMOljOLkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-overlap": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-7.0.0.tgz", + "integrity": "sha512-yYjT0Qe2WIvf3InuSzobmEkD4XguoimdzXt23eHFF/RKNubAwwdFDeLbmyA7fNZFGrMLNEl/zYvgBVXiQ7tihg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-on-line": "^7.0.0", + "@turf/geojson-rbush": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/line-segment": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/nearest-point-on-line": "^7.0.0", + "deep-equal": "^2.2.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-7.0.0.tgz", + "integrity": "sha512-Fn8IPEMGQyDAJjjrEOrF0VUCdRosjdvd9x38gq73Qg5oSsZ4p9DdMdgydK27XL74/ivM4+CtDqQkHcj5Aec/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-7.0.0.tgz", + "integrity": "sha512-De+j4QTdoHguYu4S3UqOdU8GEg7VrVqQ67SkGzgFWL/SFh3V98+KDhxFIMA1OmzOc5/ox3yUQ8a/BOYslAV4DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/nearest-point-on-line": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice-along": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-7.0.0.tgz", + "integrity": "sha512-+HNcI8ilm7ma/oKm23f2ca+xaNe4IjDYAjtl2Peap3b39Y9UAgw6lXhIh/L+m/XQXKkdWOfmqf4J2ar0bgG9DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.0.0", + "@turf/destination": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-split": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-7.0.0.tgz", + "integrity": "sha512-LuJuO1bY++PJEQ7gqbkzdL8RP1pZRQdgoqaZTsMy5AhxfjMCSL4Bx3o8SYAtsQt6CTx17dMCqBcjmjZwqNJJ6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/geojson-rbush": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/line-intersect": "^7.0.0", + "@turf/line-segment": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/nearest-point-on-line": "^7.0.0", + "@turf/square": "^7.0.0", + "@turf/truncate": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-to-polygon": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-7.0.0.tgz", + "integrity": "sha512-NmrY1jFj4oW30TW2LNoL00/uNmF1bGeTU8W1EtCunoCUUOVD9XSCj0kdSuq+MJLBH06PzOL+2f1jKTFf0X7Kqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/mask": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-7.0.0.tgz", + "integrity": "sha512-5vSNpN4rCRhEsS69d9u8USlFGdlf5rySCD701gzALNGpvTN4ViXoUUH9ysdqOdvp/IdC8thRP72Hget9fJKcfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "polygon-clipping": "^0.15.3" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.0.0.tgz", + "integrity": "sha512-cEXr13uFwhXq5mFBy0IK1U/QepE5qgk3zXpBYsla3lYV7cB83Vh+NNUR+r0/w/QoJqest1TG4H20F9tGYWPi/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/midpoint": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-7.0.0.tgz", + "integrity": "sha512-Zt0OgtByf5rTKT86WssAzNN2D7eqjay9ZlRb2rutynMyJDdLgbGPurTZIOXOP7ztGaS/WIMYlvPEveIp8ao1zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.0.0", + "@turf/destination": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/moran-index": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/moran-index/-/moran-index-7.0.0.tgz", + "integrity": "sha512-Vl3PD8wn8aBYZpQ7Kq+dWosiQP2HTeZmzEyQh7WGAUK7OunODFPIdObj6jLwKYj9ZW2XVxaGmogjVEmQ2/2FQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/distance-weight": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-neighbor-analysis": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/nearest-neighbor-analysis/-/nearest-neighbor-analysis-7.0.0.tgz", + "integrity": "sha512-wz+2U271niT7l18SIctAo5Muh5kqyZl4bqFUWTQhhhzXkcP2hCYT9gYWkrZN0gfyp9sCWUe7mgoU6/wGDsiENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/area": "^7.0.0", + "@turf/bbox": "^7.0.0", + "@turf/bbox-polygon": "^7.0.0", + "@turf/centroid": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/nearest-point": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-7.0.0.tgz", + "integrity": "sha512-h3uLUoeo6JWTirpI499SRooqEoDxia2C/kDqAwAeXFqwxzGqGprtNA/C0bMgHfxE1M2rxORGzvgywKirpLu1dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-7.0.0.tgz", + "integrity": "sha512-ADf+oytqY3EVT/9JApoRr5H0f8wzkzeXhJUfTDEcWZoJqT/8lOX2HCo87b6+oEb1QIavlSogoku1+M5xMIcJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.0.0", + "@turf/destination": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/line-intersect": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-to-line": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-7.0.0.tgz", + "integrity": "sha512-DmbQ88nChkVD6pe9dbFZEBVtmcgrRFKSv1n3Y1Kka+BeDFzCfie2VJuhsrqrecRmLMIEf1tdVJL/MdpinnZZTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/point-to-line-distance": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/planepoint": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-7.0.0.tgz", + "integrity": "sha512-+/Sqk1I8QwlKsd0rfjwOac3BAdIBeyjN8Irgk2vYbxUADn6QWcxyYLro8DHUVrTu9jZfllc8QNpy9/6iUykm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-grid": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-7.0.0.tgz", + "integrity": "sha512-vXtFeWFC0i9T71AVX5VdlqD2mlKhk649OF/pEJB9wtCGDHYax9kkObNDSz4mFAz4UqQ67P5Lipg8YYaawgmDZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-within": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-on-feature": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-7.0.0.tgz", + "integrity": "sha512-KTvYrQJEw62GLivd5LfCRt9z/4ZFdz29+3HxW9/RHhb8nrjLU8M8j7fJTQ+/Q+pPunWPK0Fvjv8LZAh0c30/oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/center": "^7.0.0", + "@turf/explode": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/nearest-point": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-to-line-distance": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-7.0.0.tgz", + "integrity": "sha512-BMNy/vbvm9NjrgJq6MA3xhruy+cp/Wj+ff3fiu8Rdl5QX/dMwCeyCZuuvzCftup6GTPUhRbpe0YRFUBInGzx/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/projection": "^7.0.0", + "@turf/rhumb-bearing": "^7.0.0", + "@turf/rhumb-distance": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/points-within-polygon": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-7.0.0.tgz", + "integrity": "sha512-Nz4kLSitsfZH0jwgCA5PCVcCocMWNM5+0LZo13j2JoXP980zTwL5t6jiwS2qFoofNE0Q6RfjrfQ3kVm5/g1/bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-smooth": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-7.0.0.tgz", + "integrity": "sha512-1pY81xZivsToG8zFGvX/1NjrYCNOWm+fdtciWyF+tt0rGE/xvMwE4yiX1chDrKiV2X8W+Ip/ZLry3MIBcSUx0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-tangents": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-7.0.0.tgz", + "integrity": "sha512-BNSKWqOTiCvVSj5CuLmkcHkagFsBSbUuSSffEGxC3cFY2tb0vP71nFE9qM+h9FpApkR6F/bWxRu5AxQ4oVHySQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/boolean-within": "^7.0.0", + "@turf/explode": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/nearest-point": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-to-line": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-7.0.0.tgz", + "integrity": "sha512-FkbxgABNzULN//WiSWiBqkbePbQANMmYKFgD6tUnVGldTFa1RuUjt/bgbvPjVHZfUdJieyxBszzl1dP0z8czDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygonize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-7.0.0.tgz", + "integrity": "sha512-aTVANRcWHVFZIgUwH5H5BMn9OoGk8KI+mGe4H8cXQWUvarKUz86t8BkdkbWnsAfdOTrEwK4WFWtxfmeWwJUH7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/envelope": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/projection": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-7.0.0.tgz", + "integrity": "sha512-EoPbZPZSDv0AJMfYhqnS455CVMYwPU78kHyQHeOnMR1Tc5z+TiImvyq55umhfecgpETzuDsjFkmeQ2phDKTmbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/quadrat-analysis": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/quadrat-analysis/-/quadrat-analysis-7.0.0.tgz", + "integrity": "sha512-JaCARFLS7mFIGORpRFcqrrCWVgTi+Vw5prSgQdaMVMcXo5+wsPh0fJUno4PGHt++R6AE3ZgxtDq2gS/1RZfhOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/area": "^7.0.0", + "@turf/bbox": "^7.0.0", + "@turf/bbox-polygon": "^7.0.0", + "@turf/centroid": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/point-grid": "^7.0.0", + "@turf/random": "^7.0.0", + "@turf/square-grid": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/random": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/random/-/random-7.0.0.tgz", + "integrity": "sha512-l3+FW0pk6MUQx2lyMvzps2YQS7ovP6YoV0tVvuNaQq0UICB1P4EHJIKLMTe5pXk73Z3p0wTgnEPk0Z2lqWaeGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rectangle-grid": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-7.0.0.tgz", + "integrity": "sha512-iLMRfaWs9+BlGaDP5ka7J9bTGFPGim1Tl38uNTPagIVxk6bNfB8156S9up+/7scpjuQGxY0ky3tlR9aVYlWNdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-intersects": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rewind": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-7.0.0.tgz", + "integrity": "sha512-kZwqJ4enmTZPDrI0rCf+zE9HChCuKKvD0kqZJo50XvfypfKVz5CI751Dgs/cslMIENyKFiHHHM4OMgouJ/lR1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-clockwise": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-bearing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-7.0.0.tgz", + "integrity": "sha512-4qDggFDNBbWdD+o3H+vna5eiKCAsmqAueP3T5rSEB1ier77wVgjg7cs7eTrEBbpuCbPAho7NDNdyAjgItydgLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-destination": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-7.0.0.tgz", + "integrity": "sha512-uYgqP8BGo8DBs6ZgjBo9SNCXc6BY+iA6OG7yPYSe4Lur2vu+LkbBXV6P3IodkeHyPex+X5ATea8QHutYQX6HUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-distance": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-7.0.0.tgz", + "integrity": "sha512-VAZnZcHbHHUU/Li0sj50/T6bBGRWvJ6eOZmw2aZFxxnC+AkHv4LTKDf0wNsxR03ZwGEh4uJM8OuirNugLIhAyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sample": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-7.0.0.tgz", + "integrity": "sha512-yCeITDVT3vWMaK/X1JF6jxEipgBCi2Foj87lVO7rcVg5pp/6c2S8BnFB5NoI0+HKXEpulG4eH57khUVND9VCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sector": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-7.0.0.tgz", + "integrity": "sha512-HXT8vbCYoIbomcyT0D/0Ap4p3bSmb3EFC7C5BBv3Gr9oWiMf5cFgwwA/inbGorU5fcRap7/Yt4hWWTGLO5MDTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/circle": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/line-arc": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/shortest-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-7.0.0.tgz", + "integrity": "sha512-nEtL6qA3Po6uXZsLnfbFCD+Nng3GIRBX2Okyva3PYCJvuD27qYJFvXk423Z0qA+09zZHhi2Ct1IGuXBBYmdkaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/bbox-polygon": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/clean-coords": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/transform-scale": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/simplify": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-7.0.0.tgz", + "integrity": "sha512-EizgFBv7LiLTfqk0BlzuKXmGj7owHksI7Q0mur+yOFGFhEmP5pWm+jYxq+pYfUZA3eki4J7kyN4Mhg5c+jhLTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clean-coords": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/square": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/square/-/square-7.0.0.tgz", + "integrity": "sha512-HnY2fESbGGzMeb19qZ0HKpsGRZv4f4e8oHH+gdCr6cs03z/TO6JslJdRA65zHNkdReSVEOQWIMF5IB+Cq20jCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/square-grid": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-7.0.0.tgz", + "integrity": "sha512-Dz7GyFRbcf0aek5nm7gW5gVYq/dJdn+JkVFgSIimysRl1tBtQiE0LvjZRdS97JvPs6m6hcZT+sDEXW1fLDPYFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/rectangle-grid": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/standard-deviational-ellipse": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-7.0.0.tgz", + "integrity": "sha512-rr4T48aAfu2E/V6fStE8Jq1VD2a/zztS1LGu1PSK3pbk7Eq9HTEE9jzjBIONhDI6ljoLBYy4Qib+L3DaNCfmUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/center-mean": "^7.0.0", + "@turf/ellipse": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/points-within-polygon": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tag": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-7.0.0.tgz", + "integrity": "sha512-/QVKwYq9C7BkHrVtwLXwKSrEZcZT+/JQeNpGsOFhCBnDgXUMtLpj2obkMt+v7wXXtUgTsFAnSh7ClNgS6eB2Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tesselate": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-7.0.0.tgz", + "integrity": "sha512-AWdFrBuLh4RFEBLWVaY9Z3/8jrXFv9WDvO3SyVUCQYFFcQP9aVieHyEEwebRaKb578il/o3rNHyRBuL6xSOcAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "earcut": "^2.2.4" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-7.0.0.tgz", + "integrity": "sha512-KuzXnoetCqu5RC6wcUWOvotxZMcgZptqz3gJZAuhqa1CF3DKUKFEJ851+f/9KzZ+woalUB8anFr9dMKJjcM6RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-rotate": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-7.0.0.tgz", + "integrity": "sha512-zU6ypVOdVtXaJvy2LEVjx4o7y/vR9kIL6Iu/VkzXIvGCYICDdHnrpeEVJOFZPqdq4GI4C1xAQ4ARPTwtGrpPBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/centroid": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/rhumb-bearing": "^7.0.0", + "@turf/rhumb-destination": "^7.0.0", + "@turf/rhumb-distance": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-scale": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-7.0.0.tgz", + "integrity": "sha512-G94nxT5TyP8TSNRDkoevFoGlUw0H2Az5IG1JKFTT5nRqpbML17IQblV33gaA1Hm197rekQo3CDVWEbgpOV0jAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.0.0", + "@turf/center": "^7.0.0", + "@turf/centroid": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/rhumb-bearing": "^7.0.0", + "@turf/rhumb-destination": "^7.0.0", + "@turf/rhumb-distance": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-translate": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-7.0.0.tgz", + "integrity": "sha512-sdZl29CqHoBo/Mxwos6Hvb6LXtHJYYTIjlWqphnu1kislbJwWUJpYjwD8yqTljfW4QHgDzGpnRLGzjDVZ7KHQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/rhumb-destination": "^7.0.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/triangle-grid": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-7.0.0.tgz", + "integrity": "sha512-LKBMgkGGfZxZclRzalIYHGG50eMBOHNihBZLagK/f8RAMrvG2rS/S4n/CQbqU9OXenDgYErSm3SCVXC1dTXVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/intersect": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/truncate": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-7.0.0.tgz", + "integrity": "sha512-G0cKlvONexzRIHRMkzhIA9UsOHiHbVW+iFBlAyDxXKK9Cr9USp/JjETAo8zqCnTQna40xdjt4bcHtsZxqyRQZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-7.0.0.tgz", + "integrity": "sha512-oKtvIoP9nCBT7HCUn0/QP62QwTj8eDxfS810ZGJO0aDPDg2x94tSqwbvmu5WcvcxOBB/6L6rF55UJjL+OjcHxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/along": "^7.0.0", + "@turf/angle": "^7.0.0", + "@turf/area": "^7.0.0", + "@turf/bbox": "^7.0.0", + "@turf/bbox-clip": "^7.0.0", + "@turf/bbox-polygon": "^7.0.0", + "@turf/bearing": "^7.0.0", + "@turf/bezier-spline": "^7.0.0", + "@turf/boolean-clockwise": "^7.0.0", + "@turf/boolean-concave": "^7.0.0", + "@turf/boolean-contains": "^7.0.0", + "@turf/boolean-crosses": "^7.0.0", + "@turf/boolean-disjoint": "^7.0.0", + "@turf/boolean-equal": "^7.0.0", + "@turf/boolean-intersects": "^7.0.0", + "@turf/boolean-overlap": "^7.0.0", + "@turf/boolean-parallel": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/boolean-point-on-line": "^7.0.0", + "@turf/boolean-touches": "^7.0.0", + "@turf/boolean-valid": "^7.0.0", + "@turf/boolean-within": "^7.0.0", + "@turf/buffer": "^7.0.0", + "@turf/center": "^7.0.0", + "@turf/center-mean": "^7.0.0", + "@turf/center-median": "^7.0.0", + "@turf/center-of-mass": "^7.0.0", + "@turf/centroid": "^7.0.0", + "@turf/circle": "^7.0.0", + "@turf/clean-coords": "^7.0.0", + "@turf/clone": "^7.0.0", + "@turf/clusters": "^7.0.0", + "@turf/clusters-dbscan": "^7.0.0", + "@turf/clusters-kmeans": "^7.0.0", + "@turf/collect": "^7.0.0", + "@turf/combine": "^7.0.0", + "@turf/concave": "^7.0.0", + "@turf/convex": "^7.0.0", + "@turf/destination": "^7.0.0", + "@turf/difference": "^7.0.0", + "@turf/dissolve": "^7.0.0", + "@turf/distance": "^7.0.0", + "@turf/distance-weight": "^7.0.0", + "@turf/ellipse": "^7.0.0", + "@turf/envelope": "^7.0.0", + "@turf/explode": "^7.0.0", + "@turf/flatten": "^7.0.0", + "@turf/flip": "^7.0.0", + "@turf/geojson-rbush": "^7.0.0", + "@turf/great-circle": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/hex-grid": "^7.0.0", + "@turf/interpolate": "^7.0.0", + "@turf/intersect": "^7.0.0", + "@turf/invariant": "^7.0.0", + "@turf/isobands": "^7.0.0", + "@turf/isolines": "^7.0.0", + "@turf/kinks": "^7.0.0", + "@turf/length": "^7.0.0", + "@turf/line-arc": "^7.0.0", + "@turf/line-chunk": "^7.0.0", + "@turf/line-intersect": "^7.0.0", + "@turf/line-offset": "^7.0.0", + "@turf/line-overlap": "^7.0.0", + "@turf/line-segment": "^7.0.0", + "@turf/line-slice": "^7.0.0", + "@turf/line-slice-along": "^7.0.0", + "@turf/line-split": "^7.0.0", + "@turf/line-to-polygon": "^7.0.0", + "@turf/mask": "^7.0.0", + "@turf/meta": "^7.0.0", + "@turf/midpoint": "^7.0.0", + "@turf/moran-index": "^7.0.0", + "@turf/nearest-neighbor-analysis": "^7.0.0", + "@turf/nearest-point": "^7.0.0", + "@turf/nearest-point-on-line": "^7.0.0", + "@turf/nearest-point-to-line": "^7.0.0", + "@turf/planepoint": "^7.0.0", + "@turf/point-grid": "^7.0.0", + "@turf/point-on-feature": "^7.0.0", + "@turf/point-to-line-distance": "^7.0.0", + "@turf/points-within-polygon": "^7.0.0", + "@turf/polygon-smooth": "^7.0.0", + "@turf/polygon-tangents": "^7.0.0", + "@turf/polygon-to-line": "^7.0.0", + "@turf/polygonize": "^7.0.0", + "@turf/projection": "^7.0.0", + "@turf/quadrat-analysis": "^7.0.0", + "@turf/random": "^7.0.0", + "@turf/rectangle-grid": "^7.0.0", + "@turf/rewind": "^7.0.0", + "@turf/rhumb-bearing": "^7.0.0", + "@turf/rhumb-destination": "^7.0.0", + "@turf/rhumb-distance": "^7.0.0", + "@turf/sample": "^7.0.0", + "@turf/sector": "^7.0.0", + "@turf/shortest-path": "^7.0.0", + "@turf/simplify": "^7.0.0", + "@turf/square": "^7.0.0", + "@turf/square-grid": "^7.0.0", + "@turf/standard-deviational-ellipse": "^7.0.0", + "@turf/tag": "^7.0.0", + "@turf/tesselate": "^7.0.0", + "@turf/tin": "^7.0.0", + "@turf/transform-rotate": "^7.0.0", + "@turf/transform-scale": "^7.0.0", + "@turf/transform-translate": "^7.0.0", + "@turf/triangle-grid": "^7.0.0", + "@turf/truncate": "^7.0.0", + "@turf/union": "^7.0.0", + "@turf/unkink-polygon": "^7.0.0", + "@turf/voronoi": "^7.0.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/union": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/union/-/union-7.0.0.tgz", + "integrity": "sha512-NRnP0GJ3guzVh6D2KNZvqNLMkbZtPQ6X1U4czK9ETicLROzqq6wM/S8gHZJVoh0KxxK1RYDsKu0RGFVobVT2vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/unkink-polygon": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-7.0.0.tgz", + "integrity": "sha512-mkwC7+KgINIAkRYSx0iRp8BjGtw8bijvtzC9Da5CRTSg13WH2IrvksFtasTo58xMdqyt6oO2NdMEDX3JUwRCeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/area": "^7.0.0", + "@turf/boolean-point-in-polygon": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "rbush": "^3.0.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/voronoi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-7.0.0.tgz", + "integrity": "sha512-AJMrtd9eV+nVA+su1GIp96E5ENzKUepPFr9wWHqqWedj92W2KbdAwfwJVMyl0vBmiMYeTSnfzC7HenIMXePfhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.0.0", + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "d3-voronoi": "1.1.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concaveman": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz", + "integrity": "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "point-in-polygon": "^1.1.0", + "rbush": "^3.0.1", + "robust-predicates": "^2.0.4", + "tinyqueue": "^2.0.3" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/d3-geo": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", + "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", + "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.5.0.tgz", + "integrity": "sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/config-array": "^0.16.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.5.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/eslint-config-mourner": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-mourner/-/eslint-config-mourner-4.0.0.tgz", + "integrity": "sha512-svOOXP1KFS9DZOR6hxVQVTug75a/aQQ/shc/Tlgvbszo9ypTbRta/elow54Qq6RJ7S8LwnXeuPEAcOdDWExqlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@eslint/js": "^9.5.0", + "@stylistic/eslint-plugin-js": "^2.2.2" + } + }, + "node_modules/eslint-scope": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/geojson-polygon-self-intersections": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/geojson-polygon-self-intersections/-/geojson-polygon-self-intersections-1.2.1.tgz", + "integrity": "sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rbush": "^2.0.1" + } + }, + "node_modules/geojson-polygon-self-intersections/node_modules/quickselect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/geojson-polygon-self-intersections/node_modules/rbush": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "quickselect": "^1.0.1" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsts": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/jsts/-/jsts-2.7.1.tgz", + "integrity": "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==", + "dev": true, + "license": "(EDL-1.0 OR EPL-1.0)", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/marchingsquares": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/marchingsquares/-/marchingsquares-1.3.3.tgz", + "integrity": "sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg==", + "dev": true, + "license": "AGPL-3.0" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-vincenty": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/node-vincenty/-/node-vincenty-0.0.6.tgz", + "integrity": "sha512-oxiqnpfc9LHxm5SqH69WM+rkaIzifZGGvoer3AFyWEipNLJ4LhurwaDBhvgXglootehVs8iKWDMfLapPki+esg==", + "dev": true, + "license": "BSD" + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/point-in-polygon": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", + "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/point-in-polygon-hao": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/point-in-polygon-hao/-/point-in-polygon-hao-1.1.0.tgz", + "integrity": "sha512-3hTIM2j/v9Lio+wOyur3kckD4NxruZhpowUbEgmyikW+a2Kppjtu1eN+AhnMQtoHW46zld88JiYWv6fxpsDrTQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/polygon-clipping": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.7.tgz", + "integrity": "sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==", + "dev": true, + "license": "MIT", + "dependencies": { + "robust-predicates": "^3.0.2", + "splaytree": "^3.1.0" + } + }, + "node_modules/polygon-clipping/node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "quickselect": "^2.0.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", + "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/skmeans": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz", + "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/splaytree": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.2.tgz", + "integrity": "sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sweepline-intersections": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sweepline-intersections/-/sweepline-intersections-1.5.0.tgz", + "integrity": "sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyqueue": "^2.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "dev": true, + "license": "ISC" + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-server": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz", + "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==", + "dev": true, + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "geo2topo": "bin/geo2topo" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 391b100..7a35141 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,35 @@ { "name": "cheap-ruler", - "version": "2.1.0", + "version": "4.0.0", "description": "A collection of fast approximations to common geographic measurements.", - "main": "index.js", - "dependencies": {}, + "author": "Vladimir Agafonkin", + "license": "ISC", + "type": "module", + "main": "cheap-ruler.js", + "exports": "./index.js", + "module": "index.js", + "types": "index.d.ts", "devDependencies": { - "benchmark": "^2.1.0", - "browserify": "^13.0.0", - "eslint": "^2.7.0", - "eslint-config-mourner": "^2.0.1", - "istanbul": "^0.4.3", - "tape": "^4.5.1", - "turf": "^2.0.2" + "@turf/turf": "^7.0.0", + "benchmark": "^2.1.4", + "eslint": "^9.5.0", + "eslint-config-mourner": "^4.0.0", + "node-vincenty": "0.0.6", + "rollup": "^4.18.0", + "typescript": "^5.5.2" }, "scripts": { - "pretest": "eslint index.js bench test/test.js", - "test": "tape test/test.js", - "build": "browserify index.js -s cheapRuler > cheap-ruler.js", - "prepublish": "npm run build", - "cov": "istanbul cover tape test/test.js" - }, - "eslintConfig": { - "extends": "mourner" + "pretest": "eslint index.js bench test/*.js", + "test": "tsc && node --test test/test.js", + "build": "rollup index.js -o cheap-ruler.js -n CheapRuler -f umd", + "prepublishOnly": "npm test && npm run build", + "cov": "node --test --experimental-test-coverage test/test.js" }, + "files": [ + "index.js", + "index.d.ts", + "cheap-ruler.js" + ], "repository": { "type": "git", "url": "git+https://github.com/mapbox/cheap-ruler.git" @@ -32,11 +39,5 @@ "measurement", "approximation", "distance" - ], - "author": "Vladimir Agafonkin", - "license": "ISC", - "bugs": { - "url": "https://github.com/mapbox/cheap-ruler/issues" - }, - "homepage": "https://github.com/mapbox/cheap-ruler#readme" + ] } diff --git a/test/precision.js b/test/precision.js new file mode 100644 index 0000000..8136dee --- /dev/null +++ b/test/precision.js @@ -0,0 +1,35 @@ +import CheapRuler from '../index.js'; +import vincenty from 'node-vincenty'; + +const distances = [1, 100, 300, 1000, 2000]; +const angle = 45; +const precision = 1e3; + +process.stdout.write('| lat | '); + +for (let lat = 0; lat <= 80; lat += 10) { + process.stdout.write(`${lat}° | `); +} + +process.stdout.write('\n| --- | '); +for (let lat = 0; lat <= 80; lat += 10) process.stdout.write(' --- |'); +process.stdout.write('\n'); + +for (let i = 0; i < distances.length; i++) { + const dist = distances[i]; + process.stdout.write(`| ${dist}mi | `); + + for (let lat = 0; lat <= 80; lat += 10) { + const ruler = new CheapRuler(lat, 'miles'); + + const p1 = ruler.destination([0, lat], dist / 2, angle); + const p2 = ruler.destination([0, lat], dist / 2, angle - 180); + + const d = ruler.distance(p1, p2); + // var d = turf.distance(turf.point(p1), turf.point(p2), 'miles'); + const d2 = CheapRuler.units.miles * vincenty.distVincenty(p1[1], p1[0], p2[1], p2[0]).distance / 1000; + + process.stdout.write(`${Math.round(100 * precision * Math.abs((d - d2) / d2)) / precision}% | `); + } + process.stdout.write('\n'); +} diff --git a/test/test.js b/test/test.js index 8a42a5f..5cfe061 100644 --- a/test/test.js +++ b/test/test.js @@ -1,203 +1,251 @@ -'use strict'; +import test from 'node:test'; +import assert from 'node:assert/strict'; +import CheapRuler from '../index.js'; +import * as turf from '@turf/turf'; +import {readFileSync} from 'fs'; -var test = require('tape').test; -var createRuler = require('../'); -var turf = require('turf'); -var lines = require('./fixtures/lines.json'); -var points = Array.prototype.concat.apply([], lines); +const lines = JSON.parse(readFileSync(new URL('fixtures/lines.json', import.meta.url))); -var ruler = createRuler(32.8351); -var milesRuler = createRuler(32.8351, 'miles'); +const points = Array.prototype.concat.apply([], lines); -function assertErr(t, actual, expected, maxErr, description) { - if (isNaN(actual) || isNaN(expected)) t.fail(description + ' produced NaN'); - var err = Math.abs((actual - expected) / expected); - if (err > maxErr) t.fail(description + ', err: ' + err); +const ruler = new CheapRuler(32.8351); +const milesRuler = new CheapRuler(32.8351, 'miles'); + +function assertErr(actual, expected, maxErr, description) { + if (isNaN(actual) || isNaN(expected)) assert.fail(`${description} produced NaN`); + const err = Math.abs((actual - expected) / expected); + if (err > maxErr) assert.fail(`${description}, err: ${err}`); } -test('cheapRuler constructor', function (t) { - t.throws(function () { - createRuler(); +test('cheapRuler constructor', () => { + assert.throws(() => { + const ruler = new CheapRuler(); + ruler.distance(null, null); }, 'errors without latitude'); - t.end(); }); -test('distance', function (t) { - for (var i = 0; i < points.length - 1; i++) { - var expected = turf.distance(turf.point(points[i]), turf.point(points[i + 1])); - var actual = ruler.distance(points[i], points[i + 1]); - assertErr(t, expected, actual, 0.001, 'distance'); +test('distance', () => { + for (let i = 0; i < points.length - 1; i++) { + const expected = turf.distance(turf.point(points[i]), turf.point(points[i + 1])); + const actual = ruler.distance(points[i], points[i + 1]); + assertErr(expected, actual, 0.003, 'distance'); } - t.pass('distance within 0.1%'); - t.end(); + // distance within 0.3% +}); + +test('distance over dateline', () => { + const p0 = [179.9, 32.7]; + const p1 = [-179.9, 32.9]; + const expected = turf.distance(turf.point(p0), turf.point(p1)); + const actual = ruler.distance(p0, p1); + assertErr(expected, actual, 0.001, 'distance'); + // distance within 0.1% }); -test('bearing', function (t) { - for (var i = 0; i < points.length - 1; i++) { - var expected = turf.bearing(turf.point(points[i]), turf.point(points[i + 1])); - var actual = ruler.bearing(points[i], points[i + 1]); - assertErr(t, expected, actual, 0.0001, 'bearing'); +test('distance in miles', () => { + const d = ruler.distance([30.5, 32.8351], [30.51, 32.8451]); + const d2 = milesRuler.distance([30.5, 32.8351], [30.51, 32.8451]); + + assertErr(d / d2, 1.609344, 1e-12, 'distance in miles'); + // distance in miles +}); + +test('bearing', () => { + for (let i = 0; i < points.length - 1; i++) { + const expected = turf.bearing(turf.point(points[i]), turf.point(points[i + 1])); + const actual = ruler.bearing(points[i], points[i + 1]); + assertErr(expected, actual, 0.005, 'bearing'); } - t.pass('bearing within 0.01%'); - t.end(); + // bearing within 0.05% }); -test('destination', function (t) { - for (var i = 0; i < points.length; i++) { - var bearing = (i % 360) - 180; - var expected = turf.destination(turf.point(points[i]), 1.0, bearing, 'kilometers').geometry.coordinates; - var actual = ruler.destination(points[i], 1.0, bearing); - assertErr(t, expected[0], actual[0], 3e-7, 'destination longitude'); - assertErr(t, expected[1], actual[1], 3e-7, 'destination latitude'); +test('bearing over dateline', () => { + const p0 = [179.9, 32.7]; + const p1 = [-179.9, 32.9]; + const expected = turf.bearing(turf.point(p0), turf.point(p1)); + const actual = ruler.bearing(p0, p1); + assertErr(expected, actual, 0.005, 'bearing'); + // bearing within 0.5% +}); + +test('destination', () => { + for (let i = 0; i < points.length; i++) { + const bearing = (i % 360) - 180; + const expected = turf.destination(turf.point(points[i]), 1.0, bearing, {units: 'kilometers'}).geometry.coordinates; + const actual = ruler.destination(points[i], 1.0, bearing); + assertErr(expected[0], actual[0], 1e-6, 'destination longitude'); + assertErr(expected[1], actual[1], 1e-6, 'destination latitude'); } - t.pass('destination within 3e-7'); - t.end(); + // destination within 1e-6 }); -test('lineDistance', function (t) { - for (var i = 0; i < lines.length; i++) { - var expected = turf.lineDistance(turf.linestring(lines[i])); - var actual = ruler.lineDistance(lines[i]); - assertErr(t, expected, actual, 0.001, 'lineDistance'); +test('lineDistance', () => { + for (let i = 0; i < lines.length; i++) { + const expected = turf.length(turf.lineString(lines[i])); + const actual = ruler.lineDistance(lines[i]); + assertErr(expected, actual, 0.003, 'lineDistance'); } - t.pass('lineDistance within 0.1%'); - t.end(); + // lineDistance within 0.3% }); -test('area', function (t) { - for (var i = 0; i < lines.length; i++) { +test('area', () => { + for (let i = 0; i < lines.length; i++) { if (lines[i].length < 3) continue; - var poly = turf.polygon([lines[i].concat([lines[i][0]])]); - var expected = turf.area(poly) / 1e6; - var actual = ruler.area([lines[i]]); - assertErr(t, expected, actual, 0.0002, 'area'); + const poly = turf.polygon([lines[i].concat([lines[i][0]])]); + const expected = turf.area(poly) / 1e6; + const actual = ruler.area([lines[i]]); + assertErr(expected, actual, 0.003, 'area'); } - t.pass('area within 0.02%'); - t.end(); -}); - -test('along', function (t) { - for (var i = 0; i < lines.length; i++) { - var line = turf.linestring(lines[i]); - var dist = turf.lineDistance(line) / 2; - var expected = turf.along(line, dist, 'kilometers').geometry.coordinates; - var actual = ruler.along(lines[i], dist); - assertErr(t, expected[0], actual[0], 2e-7, 'along longitude'); - assertErr(t, expected[1], actual[1], 2e-7, 'along latitude'); + // area within 0.3% +}); + +test('along', () => { + for (let i = 0; i < lines.length; i++) { + const line = turf.lineString(lines[i]); + const dist = turf.length(line) / 2; + const expected = turf.along(line, dist, {units: 'kilometers'}).geometry.coordinates; + const actual = ruler.along(lines[i], dist); + assertErr(expected[0], actual[0], 1e-6, 'along longitude'); + assertErr(expected[1], actual[1], 1e-6, 'along latitude'); } - t.pass('lineDistance within 0.1%'); - t.end(); + // along point within 1e-6 }); -test('along with dist <= 0', function (t) { - t.same(ruler.along(lines[0], -5), lines[0][0], 'first point'); - t.end(); +test('along with dist <= 0', () => { + assert.deepEqual(ruler.along(lines[0], -5), lines[0][0], 'first point'); }); -test('along with dist > length', function (t) { - t.same(ruler.along(lines[0], 1000), lines[0][lines[0].length - 1], 'last point'); - t.end(); +test('along with dist > length', () => { + assert.deepEqual(ruler.along(lines[0], 1000), lines[0][lines[0].length - 1], 'last point'); +}); + +test('along over dateline', () => { + const line = [[179.9, 32.7], [-179.9, 32.9]]; + const turfLine = turf.lineString(line); + const dist = turf.length(turfLine) / 3; + const expected = turf.along(turfLine, dist).geometry.coordinates; + const actual = ruler.along(line, dist); + + assert.ok(ruler.distance(expected, actual) < 0.02); }); -test('pointOnLine', function (t) { +test('pointOnLine', () => { // not Turf comparison because pointOnLine is bugged https://github.com/Turfjs/turf/issues/344 - var line = [[-77.031669, 38.878605], [-77.029609, 38.881946]]; - var p = ruler.pointOnLine(line, [-77.034076, 38.882017]).point; - t.same(p, [-77.03051972665213, 38.88046894284234], 'pointOnLine'); - t.end(); + const line = [[-77.031669, 38.878605], [-77.029609, 38.881946]]; + const result = ruler.pointOnLine(line, [-77.034076, 38.882017]); + + assert.deepEqual(result, {point: [-77.03052689033436, 38.880457324462576], index: 0, t: 0.5544221677861756}, 'pointOnLine'); + + assert.equal(ruler.pointOnLine(line, [-80, 38]).t, 0, 't is not less than 0'); + assert.equal(ruler.pointOnLine(line, [-75, 38]).t, 1, 't is not bigger than 1'); + }); -test('lineSlice', function (t) { - for (var i = 0; i < lines.length; i++) { - if (i === 46) continue; // skip due to Turf bug https://github.com/Turfjs/turf/issues/351 +test('pointOnLine over dateline', () => { + const line = [[179.9, 32.7], [-179.9, 32.9]]; + const actual = ruler.pointOnLine(line, [180, 32.7]); + assert.deepEqual(actual.point, [179.9416136283502, 32.7416136283502]); +}); + +test('pointToSegmentDistance', () => { + const p = [-77.034076, 38.882017]; + const p0 = [-77.031669, 38.878605]; + const p1 = [-77.029609, 38.881946]; + const distance = ruler.pointToSegmentDistance(p, p0, p1); + assert.equal(distance, 0.37461484020420416); +}); + +test('lineSlice', () => { + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const dist = ruler.lineDistance(line); + const start = ruler.along(line, dist * 0.3); + const stop = ruler.along(line, dist * 0.7); - var line = lines[i]; - var dist = ruler.lineDistance(line); - var start = ruler.along(line, dist * 0.3); - var stop = ruler.along(line, dist * 0.7); + const expected = ruler.lineDistance(turf.lineSlice( + turf.point(start), turf.point(stop), turf.lineString(line)).geometry.coordinates); - var expected = ruler.lineDistance(turf.lineSlice( - turf.point(start), turf.point(stop), turf.linestring(line)).geometry.coordinates); - var actual = ruler.lineDistance(ruler.lineSlice(start, stop, line)); + const actual = ruler.lineDistance(ruler.lineSlice(start, stop, line)); - assertErr(t, expected, actual, 0.001, 'lineSlice length'); + assertErr(expected, actual, 1e-5, 'lineSlice length'); } - t.pass('lineSlice length within 0.1%'); - t.end(); + // lineSlice length within 1e-5 }); -test('lineSliceAlong', function (t) { - for (var i = 0; i < lines.length; i++) { +test('lineSliceAlong', () => { + for (let i = 0; i < lines.length; i++) { if (i === 46) continue; // skip due to Turf bug https://github.com/Turfjs/turf/issues/351 - var line = lines[i]; - var dist = ruler.lineDistance(line); - var start = ruler.along(line, dist * 0.3); - var stop = ruler.along(line, dist * 0.7); + const line = lines[i]; + const dist = ruler.lineDistance(line); + const start = ruler.along(line, dist * 0.3); + const stop = ruler.along(line, dist * 0.7); - var expected = ruler.lineDistance(turf.lineSlice( - turf.point(start), turf.point(stop), turf.linestring(line)).geometry.coordinates); - var actual = ruler.lineDistance(ruler.lineSliceAlong(dist * 0.3, dist * 0.7, line)); + const expected = ruler.lineDistance(turf.lineSlice( + turf.point(start), turf.point(stop), turf.lineString(line)).geometry.coordinates); + const actual = ruler.lineDistance(ruler.lineSliceAlong(dist * 0.3, dist * 0.7, line)); - assertErr(t, expected, actual, 0.001, 'lineSliceAlong length'); + assertErr(expected, actual, 1e-5, 'lineSliceAlong length'); } - t.pass('lineSliceAlong length within 0.1%'); - t.end(); -}); - -test('lineSlice reverse', function (t) { - var line = lines[0]; - var dist = ruler.lineDistance(line); - var start = ruler.along(line, dist * 0.7); - var stop = ruler.along(line, dist * 0.3); - var actual = ruler.lineDistance(ruler.lineSlice(start, stop, line)); - t.equal(actual, 0.018665535420681036, 'lineSlice reversed length'); - t.end(); -}); - -test('bufferPoint', function (t) { - for (var i = 0; i < points.length; i++) { - var expected = turfPointBuffer(points[i], 0.01); - var actual = milesRuler.bufferPoint(points[i], 0.01); - assertErr(t, expected[0], actual[0], 1e-8, 'bufferPoint west'); - assertErr(t, expected[1], actual[1], 1e-8, 'bufferPoint east'); - assertErr(t, expected[2], actual[2], 1e-8, 'bufferPoint south'); - assertErr(t, expected[3], actual[3], 1e-8, 'bufferPoint north'); + // lineSliceAlong length within 1e-5 +}); + +test('lineSlice reverse', () => { + const line = lines[0]; + const dist = ruler.lineDistance(line); + const start = ruler.along(line, dist * 0.7); + const stop = ruler.along(line, dist * 0.3); + const actual = ruler.lineDistance(ruler.lineSlice(start, stop, line)); + assert.equal(actual, 0.018676476689649835, 'lineSlice reversed length'); +}); + +test('bufferPoint', () => { + for (let i = 0; i < points.length; i++) { + const expected = turfPointBuffer(points[i], 0.1); + const actual = milesRuler.bufferPoint(points[i], 0.1); + assertErr(expected[0], actual[0], 2e-7, 'bufferPoint west'); + assertErr(expected[1], actual[1], 2e-7, 'bufferPoint east'); + assertErr(expected[2], actual[2], 2e-7, 'bufferPoint south'); + assertErr(expected[3], actual[3], 2e-7, 'bufferPoint north'); } - t.pass('point buffer error within 1e-8'); - t.end(); + // point buffer error within 2e-7 +}); + +test('bufferBBox', () => { + const bbox = [30, 38, 40, 39]; + const bbox2 = ruler.bufferBBox(bbox, 1); + assert.deepEqual(bbox2, [29.989319282570946, 37.99098299160844, 40.010680717429054, 39.00901700839156], 'bufferBBox'); }); -test('bufferBBox', function (t) { - var bbox = [30, 38, 40, 39]; - var bbox2 = ruler.bufferBBox(bbox, 1); - t.same(bbox2, [29.989308794440007, 37.991016879283826, 40.01069120555999, 39.008983120716174], 'bufferBBox'); - t.end(); +test('insideBBox', () => { + const bbox = [30, 38, 40, 39]; + assert.ok(ruler.insideBBox([35, 38.5], bbox), 'insideBBox inside'); + assert.ok(!ruler.insideBBox([45, 45], bbox), 'insideBBox outside'); }); -test('insideBBox', function (t) { - var bbox = [30, 38, 40, 39]; - t.ok(ruler.insideBBox([35, 38.5], bbox), 'insideBBox inside'); - t.notOk(ruler.insideBBox([45, 45], bbox), 'insideBBox outside'); - t.end(); +test('insideBBox over dateline', () => { + assert.ok(ruler.insideBBox([180, 32.8], [179.9, 32.7, -179.9, 32.9])); }); -test('cheapRuler.fromTile', function (t) { - var ruler1 = createRuler(50.5); - var ruler2 = createRuler.fromTile(11041, 15); +test('cheapRuler.fromTile', () => { + const ruler1 = new CheapRuler(50.5); + const ruler2 = CheapRuler.fromTile(11041, 15); + + const p1 = [30.5, 50.5]; + const p2 = [30.51, 50.51]; - var p1 = [30.5, 50.5]; - var p2 = [30.51, 50.51]; + assertErr(ruler1.distance(p1, p2), ruler2.distance(p1, p2), 2e-5, 'cheapRuler.fromTile distance'); - assertErr(t, ruler1.distance(p1, p2), ruler2.distance(p1, p2), 2e-5, 'cheapRuler.fromTile distance'); +}); - t.end(); +test('cheapRuler.units', () => { + assert.equal(CheapRuler.units.kilometers, 1); }); function turfPointBuffer(p, distance) { - var dist = Math.sqrt(2) * distance; - var pt = turf.point(p); - var sw = turf.destination(pt, dist, -135, 'miles'); - var ne = turf.destination(pt, dist, 45, 'miles'); + const dist = Math.sqrt(2) * distance; + const pt = turf.point(p); + const sw = turf.destination(pt, dist, -135, {units: 'miles'}); + const ne = turf.destination(pt, dist, 45, {units: 'miles'}); return sw.geometry.coordinates.concat(ne.geometry.coordinates); } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..47d4c14 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "strict": true, + "emitDeclarationOnly": true, + "declaration": true, + "target": "es2020", + "module": "nodenext", + "moduleResolution": "nodenext" + }, + "files": [ + "index.js" + ] +}