├── .github └── workflows │ └── gh-pages.yml ├── .gitignore ├── LICENSE ├── README.md ├── data ├── README.md ├── data.bin ├── maxRect.js ├── process.js ├── protobuf.wrapper.js └── protocol.proto ├── index.html ├── package.json ├── pnpm-lock.yaml ├── src ├── core │ ├── Input.ts │ └── Viewport.ts ├── main.css ├── main.ts ├── meshes │ ├── Buildings.ts │ ├── Grid.ts │ └── Starfield.ts └── vite-env.d.ts ├── tsconfig.json └── vite.config.ts /.github/workflows/gh-pages.yml: -------------------------------------------------------------------------------- 1 | name: gh-pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | permissions: 9 | contents: read 10 | pages: write 11 | id-token: write 12 | 13 | concurrency: 14 | group: 'gh-pages' 15 | cancel-in-progress: false 16 | 17 | jobs: 18 | deploy: 19 | environment: 20 | name: github-pages 21 | url: ${{ steps.deployment.outputs.page_url }} 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: actions/checkout@v4 25 | - uses: pnpm/action-setup@v4 26 | with: 27 | version: 9 28 | - uses: actions/setup-node@v4 29 | with: 30 | node-version: 20 31 | cache: 'pnpm' 32 | - name: Install 33 | run: pnpm install 34 | - name: Build 35 | run: pnpm build 36 | - uses: actions/configure-pages@v5 37 | - uses: actions/upload-pages-artifact@v3 38 | with: 39 | path: 'dist' 40 | - id: deployment 41 | uses: actions/deploy-pages@v4 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | data/data.geojson 4 | data/protocol.d.ts 5 | data/protocol.js 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright © 2025 Daniel Esteban Nombela 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [nyc](https://nyc.gatunes.com) 2 | == 3 | 4 | ```bash 5 | # clone repo: 6 | git clone https://github.com/danielesteban/nyc.git 7 | cd nyc 8 | # install dependencies: 9 | pnpm install 10 | # start environment: 11 | pnpm start 12 | # open http://localhost:8080/ in your browser 13 | ``` 14 | -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | Download GeoJSON from: 2 | https://nycmaps-nyc.hub.arcgis.com/datasets/nyc::building/about 3 | 4 | Place it at: `data/data.geojson` 5 | 6 | ``` 7 | # Parse & Process 8 | node process.js 9 | ``` 10 | 11 | Output will be generated at: `data/data.bin` 12 | -------------------------------------------------------------------------------- /data/data.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danielesteban/nyc/3522ec635e084aaa42e679febf8e832cf376188a/data/data.bin -------------------------------------------------------------------------------- /data/maxRect.js: -------------------------------------------------------------------------------- 1 | import { parentPort } from 'worker_threads'; 2 | import * as turf from '@turf/turf'; 3 | 4 | // I found this code at: 5 | // https://louisz.medium.com/how-to-find-the-maximum-rectangle-within-a-convex-gis-polygon-in-javascript-16364e8f7f4 6 | // Seems to work fine for most cases. It can prolly be optimized, tho. 7 | // But since it only needs to run offline once I haven't bothered. 8 | 9 | function maxRect(coords) { 10 | let polygon = turf.polygon([coords]); 11 | 12 | const unitsOption = {units: 'kilometers'}; 13 | let polyline, length, bbox, percentage1, percentage2, fraction, point1, point2, bearing; 14 | let point1a, point1b, point2a, point2b, line1, line2; 15 | let largest, diagonalLength; 16 | 17 | polyline = turf.polygonToLine(polygon); 18 | length = turf.length(polyline, unitsOption); 19 | bbox = turf.bbox(polygon); 20 | diagonalLength = turf.length(turf.lineString([[bbox[0], bbox[1]], [bbox[2], bbox[3]]])); 21 | 22 | const SEARCH_PARTS = 20; 23 | for (let i = 0; i < SEARCH_PARTS; i++) { 24 | percentage1 = i / SEARCH_PARTS; 25 | point1 = turf.along(polyline, percentage1 * length, unitsOption); 26 | 27 | for (let j = 1; j < SEARCH_PARTS; j++) { 28 | fraction = j / SEARCH_PARTS; 29 | percentage2 = percentage1 + fraction; 30 | 31 | if (percentage2 > 1) { percentage2 -= 1; } 32 | 33 | let distance = percentage2 * length; 34 | point2 = turf.along(polyline, distance, unitsOption); 35 | 36 | //process as side 37 | //get bearing between points 38 | bearing = turf.bearing(point1, point2); 39 | 40 | //create perpendicual lines at start and end 41 | point1a = turf.destination(point1, diagonalLength, bearing + 90, unitsOption); 42 | point1b = turf.destination(point1, diagonalLength, bearing - 90, unitsOption); 43 | line1 = turf.lineString([turf.getCoord(point1a), turf.getCoord(point1b)]); 44 | 45 | point2a = turf.destination(point2, diagonalLength, bearing + 90, unitsOption); 46 | point2b = turf.destination(point2, diagonalLength, bearing - 90, unitsOption); 47 | line2 = turf.lineString([turf.getCoord(point2a), turf.getCoord(point2b)]); 48 | 49 | //intersect by polygon (assume single parts) 50 | let intersect1 = turf.lineIntersect(line1, polygon); 51 | let intersect2 = turf.lineIntersect(line2, polygon); 52 | 53 | let intersectObjArray = []; 54 | turf.coordAll(intersect1) 55 | .filter(coord => { 56 | return turf.distance(point1, turf.point(coord), unitsOption) > 0.001; 57 | }) 58 | .forEach(coord => { 59 | intersectObjArray.push({ 60 | coord: coord, 61 | origin: turf.getCoord(point1), 62 | opp: turf.getCoord(point2), 63 | oppLine: line2, 64 | p: point1, 65 | op: point2, 66 | }); 67 | }); 68 | 69 | turf.coordAll(intersect2) 70 | .filter(coord => { 71 | return turf.distance(point2, turf.point(coord), unitsOption) > 0.001; 72 | }) 73 | .forEach(coord => { 74 | intersectObjArray.push({ 75 | coord: coord, 76 | origin: turf.getCoord(point2), 77 | opp: turf.getCoord(point1), 78 | oppLine: line1, 79 | p: point2, 80 | op: point1, 81 | }); 82 | }); 83 | 84 | if (intersectObjArray.length === 0) 85 | continue; 86 | 87 | intersectObjArray.forEach((obj, k) => { 88 | const { origin, coord, opp, oppLine, p, op } = obj; 89 | let dest = turf.destination( 90 | turf.point(coord), 91 | turf.distance(p, op, unitsOption), 92 | turf.bearing(p, op), 93 | unitsOption 94 | ); 95 | 96 | //form rectangle and add to dest 97 | let coords = [ 98 | origin, opp, 99 | turf.getCoord(dest), 100 | coord, origin, 101 | ]; 102 | 103 | let rectangle = turf.polygon([[...coords]]); 104 | 105 | //all 4 coordinates must be within the polygon 106 | //what has been sliced by polygon should be empty 107 | if ( 108 | !turf.booleanContains(polygon, rectangle) 109 | || turf.flatten(turf.difference(turf.featureCollection([rectangle, polygon])) || turf.featureCollection([])).features.length > 0 110 | ) { 111 | return; 112 | } 113 | 114 | if (largest === undefined || turf.area(rectangle) > turf.area(largest)) { 115 | largest = rectangle; 116 | } 117 | }); 118 | } 119 | } 120 | 121 | return largest; 122 | } 123 | 124 | parentPort.on('message', (coords) => { 125 | let rect; 126 | try { 127 | rect = maxRect(coords); 128 | } catch (e) {} 129 | parentPort.postMessage(rect && rect.geometry.coordinates[0].map((p) => turf.toMercator(p))); 130 | }); 131 | -------------------------------------------------------------------------------- /data/process.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import os from 'os'; 3 | import path from 'path'; 4 | import { fileURLToPath } from 'url'; 5 | import { Worker } from 'worker_threads'; 6 | import geojson from 'geojson-stream'; 7 | // import * as turf from '@turf/turf'; 8 | import { Buildings, Building } from './protocol.js'; 9 | 10 | const __dirname = path.dirname(fileURLToPath(import.meta.url)); 11 | // const origin = turf.point([-73.971321, 40.776676]); 12 | // const radius = 1; 13 | const workers = Array.from({ length: os.cpus().length }, () => new Worker(path.join(__dirname, 'maxRect.js'))); 14 | const output = new Buildings(); 15 | 16 | let parsed = 0; 17 | let processed = 0; 18 | const queue = []; 19 | const log = () => process.stdout.write( 20 | parsed + ' parsed - ' + queue.length + ' queued - ' + processed + ' processed' + '\x1b[0G' 21 | ); 22 | 23 | const stream = fs.createReadStream(path.join(__dirname, 'data.geojson')) 24 | .pipe(geojson.parse((building) => { 25 | parsed++; 26 | log(); 27 | if ( 28 | building.geometry.type !== 'Polygon' 29 | || building.geometry.coordinates === null 30 | || building.geometry.coordinates.length === 0 31 | || building.properties.HEIGHT_ROOF === 0 32 | ) { 33 | return; 34 | } 35 | // if (!building.geometry.coordinates[0].some((p) => (turf.distance(origin, p, {units: 'kilometers'}) < radius))) { 36 | // return; 37 | // } 38 | queue.push(building); 39 | processQueue(); 40 | })); 41 | 42 | const processQueue = () => { 43 | if (!queue.length) { 44 | finish(); 45 | return; 46 | } 47 | const worker = workers.find((worker) => !worker.isBusy); 48 | if (!worker) { 49 | log(); 50 | return; 51 | } 52 | const building = queue.pop(); 53 | log(); 54 | worker.isBusy = true; 55 | worker.once('message', (rect) => { 56 | worker.isBusy = false; 57 | if (!rect) { 58 | processQueue(); 59 | return; 60 | } 61 | const min = { x: Infinity, y: Infinity }; 62 | const max = { x: -Infinity, y: -Infinity }; 63 | rect.forEach((p) => { 64 | min.x = Math.min(min.x, p[0]); 65 | min.y = Math.min(min.y, p[1]); 66 | max.x = Math.max(max.x, p[0]); 67 | max.y = Math.max(max.y, p[1]); 68 | }); 69 | const position = { x: (min.x + max.x) / 2, y: (min.y + max.y) / 2 }; 70 | const width = Math.sqrt( 71 | (rect[0][0] - rect[1][0]) ** 2 72 | + (rect[0][1] - rect[1][1]) ** 2 73 | ); 74 | const depth = Math.sqrt( 75 | (rect[1][0] - rect[2][0]) ** 2 76 | + (rect[1][1] - rect[2][1]) ** 2 77 | ); 78 | const rotation = -Math.atan2(rect[0][1] - rect[1][1], rect[0][0] - rect[1][0]); 79 | output.buildings.push(new Building({ 80 | position, 81 | scale: { x: width, y: building.properties.HEIGHT_ROOF, z: depth }, 82 | rotation, 83 | })); 84 | processed++; 85 | log(); 86 | processQueue(); 87 | }); 88 | worker.postMessage(building.geometry.coordinates[0]); 89 | }; 90 | 91 | stream.on('end', () => finish()); 92 | 93 | const finish = () => { 94 | if ( 95 | stream.readable 96 | || workers.some((worker) => worker.isBusy) 97 | ) { 98 | return; 99 | } 100 | const min = { x: Infinity, y: Infinity }; 101 | const max = { x: -Infinity, y: -Infinity }; 102 | output.buildings.forEach(({ position }) => { 103 | min.x = Math.min(min.x, position.x); 104 | min.y = Math.min(min.y, position.y); 105 | max.x = Math.max(max.x, position.x); 106 | max.y = Math.max(max.y, position.y); 107 | }); 108 | const origin = { x: (min.x + max.x) / 2, y: (min.y + max.y) / 2 }; 109 | output.buildings.forEach((building) => { 110 | building.position.x -= origin.x; 111 | building.position.y -= origin.y; 112 | }); 113 | fs.writeFileSync( 114 | path.join(__dirname, 'data.bin'), 115 | Buildings.encode(output).finish() 116 | ); 117 | console.log('\ndone!'); 118 | process.exit(); 119 | }; 120 | -------------------------------------------------------------------------------- /data/protobuf.wrapper.js: -------------------------------------------------------------------------------- 1 | import $protobuf from $DEPENDENCY; 2 | 3 | $OUTPUT; 4 | 5 | export default $root; 6 | -------------------------------------------------------------------------------- /data/protocol.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | message Vector2 { 4 | float x = 1; 5 | float y = 2; 6 | } 7 | 8 | message Vector3 { 9 | float x = 1; 10 | float y = 2; 11 | float z = 3; 12 | } 13 | 14 | message Building { 15 | Vector2 position = 1; 16 | Vector3 scale = 2; 17 | float rotation = 3; 18 | } 19 | 20 | message Buildings { 21 | repeated Building buildings = 1; 22 | } 23 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | nyc 6 | 7 | 8 | 9 |
10 |
11 | nyc - view source
12 | dani@gatunes © 2025 13 |
14 |
Loading...
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nyc", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "build": "vite build", 7 | "build:protocol": "pbjs -t static-module -w ./data/protobuf.wrapper.js --dependency protobufjs/minimal.js --es6 ./data/protocol.proto -o ./data/protocol.js && pbts -o ./data/protocol.d.ts ./data/protocol.js", 8 | "postinstall": "pnpm build:protocol", 9 | "start": "vite" 10 | }, 11 | "dependencies": { 12 | "protobufjs": "^7.4.0", 13 | "three": "^0.173.0" 14 | }, 15 | "devDependencies": { 16 | "@turf/turf": "^7.2.0", 17 | "@types/node": "^22.13.0", 18 | "@types/three": "^0.173.0", 19 | "geojson-stream": "^0.1.0", 20 | "protobufjs-cli": "^1.1.3", 21 | "typescript": "^5.7.3", 22 | "vite": "^6.0.11" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | protobufjs: 12 | specifier: ^7.4.0 13 | version: 7.4.0 14 | three: 15 | specifier: ^0.173.0 16 | version: 0.173.0 17 | devDependencies: 18 | '@turf/turf': 19 | specifier: ^7.2.0 20 | version: 7.2.0 21 | '@types/node': 22 | specifier: ^22.13.0 23 | version: 22.13.0 24 | '@types/three': 25 | specifier: ^0.173.0 26 | version: 0.173.0 27 | geojson-stream: 28 | specifier: ^0.1.0 29 | version: 0.1.0 30 | protobufjs-cli: 31 | specifier: ^1.1.3 32 | version: 1.1.3(protobufjs@7.4.0) 33 | typescript: 34 | specifier: ^5.7.3 35 | version: 5.7.3 36 | vite: 37 | specifier: ^6.0.11 38 | version: 6.0.11(@types/node@22.13.0) 39 | 40 | packages: 41 | 42 | '@babel/helper-string-parser@7.25.9': 43 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 44 | engines: {node: '>=6.9.0'} 45 | 46 | '@babel/helper-validator-identifier@7.25.9': 47 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 48 | engines: {node: '>=6.9.0'} 49 | 50 | '@babel/parser@7.26.7': 51 | resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} 52 | engines: {node: '>=6.0.0'} 53 | hasBin: true 54 | 55 | '@babel/types@7.26.7': 56 | resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} 57 | engines: {node: '>=6.9.0'} 58 | 59 | '@esbuild/aix-ppc64@0.24.2': 60 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 61 | engines: {node: '>=18'} 62 | cpu: [ppc64] 63 | os: [aix] 64 | 65 | '@esbuild/android-arm64@0.24.2': 66 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 67 | engines: {node: '>=18'} 68 | cpu: [arm64] 69 | os: [android] 70 | 71 | '@esbuild/android-arm@0.24.2': 72 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 73 | engines: {node: '>=18'} 74 | cpu: [arm] 75 | os: [android] 76 | 77 | '@esbuild/android-x64@0.24.2': 78 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 79 | engines: {node: '>=18'} 80 | cpu: [x64] 81 | os: [android] 82 | 83 | '@esbuild/darwin-arm64@0.24.2': 84 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 85 | engines: {node: '>=18'} 86 | cpu: [arm64] 87 | os: [darwin] 88 | 89 | '@esbuild/darwin-x64@0.24.2': 90 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 91 | engines: {node: '>=18'} 92 | cpu: [x64] 93 | os: [darwin] 94 | 95 | '@esbuild/freebsd-arm64@0.24.2': 96 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 97 | engines: {node: '>=18'} 98 | cpu: [arm64] 99 | os: [freebsd] 100 | 101 | '@esbuild/freebsd-x64@0.24.2': 102 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 103 | engines: {node: '>=18'} 104 | cpu: [x64] 105 | os: [freebsd] 106 | 107 | '@esbuild/linux-arm64@0.24.2': 108 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 109 | engines: {node: '>=18'} 110 | cpu: [arm64] 111 | os: [linux] 112 | 113 | '@esbuild/linux-arm@0.24.2': 114 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 115 | engines: {node: '>=18'} 116 | cpu: [arm] 117 | os: [linux] 118 | 119 | '@esbuild/linux-ia32@0.24.2': 120 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 121 | engines: {node: '>=18'} 122 | cpu: [ia32] 123 | os: [linux] 124 | 125 | '@esbuild/linux-loong64@0.24.2': 126 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 127 | engines: {node: '>=18'} 128 | cpu: [loong64] 129 | os: [linux] 130 | 131 | '@esbuild/linux-mips64el@0.24.2': 132 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 133 | engines: {node: '>=18'} 134 | cpu: [mips64el] 135 | os: [linux] 136 | 137 | '@esbuild/linux-ppc64@0.24.2': 138 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 139 | engines: {node: '>=18'} 140 | cpu: [ppc64] 141 | os: [linux] 142 | 143 | '@esbuild/linux-riscv64@0.24.2': 144 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 145 | engines: {node: '>=18'} 146 | cpu: [riscv64] 147 | os: [linux] 148 | 149 | '@esbuild/linux-s390x@0.24.2': 150 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 151 | engines: {node: '>=18'} 152 | cpu: [s390x] 153 | os: [linux] 154 | 155 | '@esbuild/linux-x64@0.24.2': 156 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 157 | engines: {node: '>=18'} 158 | cpu: [x64] 159 | os: [linux] 160 | 161 | '@esbuild/netbsd-arm64@0.24.2': 162 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 163 | engines: {node: '>=18'} 164 | cpu: [arm64] 165 | os: [netbsd] 166 | 167 | '@esbuild/netbsd-x64@0.24.2': 168 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 169 | engines: {node: '>=18'} 170 | cpu: [x64] 171 | os: [netbsd] 172 | 173 | '@esbuild/openbsd-arm64@0.24.2': 174 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 175 | engines: {node: '>=18'} 176 | cpu: [arm64] 177 | os: [openbsd] 178 | 179 | '@esbuild/openbsd-x64@0.24.2': 180 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 181 | engines: {node: '>=18'} 182 | cpu: [x64] 183 | os: [openbsd] 184 | 185 | '@esbuild/sunos-x64@0.24.2': 186 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 187 | engines: {node: '>=18'} 188 | cpu: [x64] 189 | os: [sunos] 190 | 191 | '@esbuild/win32-arm64@0.24.2': 192 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 193 | engines: {node: '>=18'} 194 | cpu: [arm64] 195 | os: [win32] 196 | 197 | '@esbuild/win32-ia32@0.24.2': 198 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 199 | engines: {node: '>=18'} 200 | cpu: [ia32] 201 | os: [win32] 202 | 203 | '@esbuild/win32-x64@0.24.2': 204 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 205 | engines: {node: '>=18'} 206 | cpu: [x64] 207 | os: [win32] 208 | 209 | '@jsdoc/salty@0.2.9': 210 | resolution: {integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==} 211 | engines: {node: '>=v12.0.0'} 212 | 213 | '@protobufjs/aspromise@1.1.2': 214 | resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} 215 | 216 | '@protobufjs/base64@1.1.2': 217 | resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} 218 | 219 | '@protobufjs/codegen@2.0.4': 220 | resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} 221 | 222 | '@protobufjs/eventemitter@1.1.0': 223 | resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} 224 | 225 | '@protobufjs/fetch@1.1.0': 226 | resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} 227 | 228 | '@protobufjs/float@1.0.2': 229 | resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} 230 | 231 | '@protobufjs/inquire@1.1.0': 232 | resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} 233 | 234 | '@protobufjs/path@1.1.2': 235 | resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} 236 | 237 | '@protobufjs/pool@1.1.0': 238 | resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} 239 | 240 | '@protobufjs/utf8@1.1.0': 241 | resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} 242 | 243 | '@rollup/rollup-android-arm-eabi@4.34.0': 244 | resolution: {integrity: sha512-Eeao7ewDq79jVEsrtWIj5RNqB8p2knlm9fhR6uJ2gqP7UfbLrTrxevudVrEPDM7Wkpn/HpRC2QfazH7MXLz3vQ==} 245 | cpu: [arm] 246 | os: [android] 247 | 248 | '@rollup/rollup-android-arm64@4.34.0': 249 | resolution: {integrity: sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA==} 250 | cpu: [arm64] 251 | os: [android] 252 | 253 | '@rollup/rollup-darwin-arm64@4.34.0': 254 | resolution: {integrity: sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ==} 255 | cpu: [arm64] 256 | os: [darwin] 257 | 258 | '@rollup/rollup-darwin-x64@4.34.0': 259 | resolution: {integrity: sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ==} 260 | cpu: [x64] 261 | os: [darwin] 262 | 263 | '@rollup/rollup-freebsd-arm64@4.34.0': 264 | resolution: {integrity: sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ==} 265 | cpu: [arm64] 266 | os: [freebsd] 267 | 268 | '@rollup/rollup-freebsd-x64@4.34.0': 269 | resolution: {integrity: sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g==} 270 | cpu: [x64] 271 | os: [freebsd] 272 | 273 | '@rollup/rollup-linux-arm-gnueabihf@4.34.0': 274 | resolution: {integrity: sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==} 275 | cpu: [arm] 276 | os: [linux] 277 | 278 | '@rollup/rollup-linux-arm-musleabihf@4.34.0': 279 | resolution: {integrity: sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==} 280 | cpu: [arm] 281 | os: [linux] 282 | 283 | '@rollup/rollup-linux-arm64-gnu@4.34.0': 284 | resolution: {integrity: sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==} 285 | cpu: [arm64] 286 | os: [linux] 287 | 288 | '@rollup/rollup-linux-arm64-musl@4.34.0': 289 | resolution: {integrity: sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==} 290 | cpu: [arm64] 291 | os: [linux] 292 | 293 | '@rollup/rollup-linux-loongarch64-gnu@4.34.0': 294 | resolution: {integrity: sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==} 295 | cpu: [loong64] 296 | os: [linux] 297 | 298 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.0': 299 | resolution: {integrity: sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==} 300 | cpu: [ppc64] 301 | os: [linux] 302 | 303 | '@rollup/rollup-linux-riscv64-gnu@4.34.0': 304 | resolution: {integrity: sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==} 305 | cpu: [riscv64] 306 | os: [linux] 307 | 308 | '@rollup/rollup-linux-s390x-gnu@4.34.0': 309 | resolution: {integrity: sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==} 310 | cpu: [s390x] 311 | os: [linux] 312 | 313 | '@rollup/rollup-linux-x64-gnu@4.34.0': 314 | resolution: {integrity: sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==} 315 | cpu: [x64] 316 | os: [linux] 317 | 318 | '@rollup/rollup-linux-x64-musl@4.34.0': 319 | resolution: {integrity: sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==} 320 | cpu: [x64] 321 | os: [linux] 322 | 323 | '@rollup/rollup-win32-arm64-msvc@4.34.0': 324 | resolution: {integrity: sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==} 325 | cpu: [arm64] 326 | os: [win32] 327 | 328 | '@rollup/rollup-win32-ia32-msvc@4.34.0': 329 | resolution: {integrity: sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A==} 330 | cpu: [ia32] 331 | os: [win32] 332 | 333 | '@rollup/rollup-win32-x64-msvc@4.34.0': 334 | resolution: {integrity: sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw==} 335 | cpu: [x64] 336 | os: [win32] 337 | 338 | '@turf/along@7.2.0': 339 | resolution: {integrity: sha512-Cf+d2LozABdb0TJoIcJwFKB+qisJY4nMUW9z6PAuZ9UCH7AR//hy2Z06vwYCKFZKP4a7DRPkOMBadQABCyoYuw==} 340 | 341 | '@turf/angle@7.2.0': 342 | resolution: {integrity: sha512-b28rs1NO8Dt/MXadFhnpqH7GnEWRsl+xF5JeFtg9+eM/+l/zGrdliPYMZtAj12xn33w22J1X4TRprAI0rruvVQ==} 343 | 344 | '@turf/area@7.2.0': 345 | resolution: {integrity: sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==} 346 | 347 | '@turf/bbox-clip@7.2.0': 348 | resolution: {integrity: sha512-q6RXTpqeUQAYLAieUL1n3J6ukRGsNVDOqcYtfzaJbPW+0VsAf+1cI16sN700t0sekbeU1DH/RRVAHhpf8+36wA==} 349 | 350 | '@turf/bbox-polygon@7.2.0': 351 | resolution: {integrity: sha512-Aj4G1GAAy26fmOqMjUk0Z+Lcax5VQ9g1xYDbHLQWXvfTsaueBT+RzdH6XPnZ/seEEnZkio2IxE8V5af/osupgA==} 352 | 353 | '@turf/bbox@7.2.0': 354 | resolution: {integrity: sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==} 355 | 356 | '@turf/bearing@7.2.0': 357 | resolution: {integrity: sha512-Jm0Xt3GgHjRrWvBtAGvgfnADLm+4exud2pRlmCYx8zfiKuNXQFkrcTZcOiJOgTfG20Agq28iSh15uta47jSIbg==} 358 | 359 | '@turf/bezier-spline@7.2.0': 360 | resolution: {integrity: sha512-7BPkc3ufYB9KLvcaTpTsnpXzh9DZoENxCS0Ms9XUwuRXw45TpevwUpOsa3atO76iKQ5puHntqFO4zs8IUxBaaA==} 361 | 362 | '@turf/boolean-clockwise@7.2.0': 363 | resolution: {integrity: sha512-0fJeFSARxy6ealGBM4Gmgpa1o8msQF87p2Dx5V6uSqzT8VPDegX1NSWl4b7QgXczYa9qv7IAABttdWP0K7Q7eQ==} 364 | 365 | '@turf/boolean-concave@7.2.0': 366 | resolution: {integrity: sha512-v3dTN04dfO6VqctQj1a+pjDHb6+/Ev90oAR2QjJuAntY4ubhhr7vKeJdk/w+tWNSMKULnYwfe65Du3EOu3/TeA==} 367 | 368 | '@turf/boolean-contains@7.2.0': 369 | resolution: {integrity: sha512-dgRQm4uVO5XuLee4PLVH7CFQZKdefUBMIXTPITm2oRIDmPLJKHDOFKQTNkGJ73mDKKBR2lmt6eVH3br6OYrEYg==} 370 | 371 | '@turf/boolean-crosses@7.2.0': 372 | resolution: {integrity: sha512-9GyM4UUWFKQOoNhHVSfJBf5XbPy8Fxfz9djjJNAnm/IOl8NmFUSwFPAjKlpiMcr6yuaAoc9R/1KokS9/eLqPvA==} 373 | 374 | '@turf/boolean-disjoint@7.2.0': 375 | resolution: {integrity: sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ==} 376 | 377 | '@turf/boolean-equal@7.2.0': 378 | resolution: {integrity: sha512-TmjKYLsxXqEmdDtFq3QgX4aSogiISp3/doeEtDOs3NNSR8susOtBEZkmvwO6DLW+g/rgoQJIBR6iVoWiRqkBxw==} 379 | 380 | '@turf/boolean-intersects@7.2.0': 381 | resolution: {integrity: sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow==} 382 | 383 | '@turf/boolean-overlap@7.2.0': 384 | resolution: {integrity: sha512-ieM5qIE4anO+gUHIOvEN7CjyowF+kQ6v20/oNYJCp63TVS6eGMkwgd+I4uMzBXfVW66nVHIXjODdUelU+Xyctw==} 385 | 386 | '@turf/boolean-parallel@7.2.0': 387 | resolution: {integrity: sha512-iOtuzzff8nmwv05ROkSvyeGLMrfdGkIi+3hyQ+DH4IVyV37vQbqR5oOJ0Nt3Qq1Tjrq9fvF8G3OMdAv3W2kY9w==} 388 | 389 | '@turf/boolean-point-in-polygon@7.2.0': 390 | resolution: {integrity: sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA==} 391 | 392 | '@turf/boolean-point-on-line@7.2.0': 393 | resolution: {integrity: sha512-H/bXX8+2VYeSyH8JWrOsu8OGmeA9KVZfM7M6U5/fSqGsRHXo9MyYJ94k39A9kcKSwI0aWiMXVD2UFmiWy8423Q==} 394 | 395 | '@turf/boolean-touches@7.2.0': 396 | resolution: {integrity: sha512-8qb1CO+cwFATGRGFgTRjzL9aibfsbI91pdiRl7KIEkVdeN/H9k8FDrUA1neY7Yq48IaciuwqjbbojQ16FD9b0w==} 397 | 398 | '@turf/boolean-valid@7.2.0': 399 | resolution: {integrity: sha512-xb7gdHN8VV6ivPJh6rPpgxmAEGReiRxqY+QZoEZVGpW2dXcmU1BdY6FA6G/cwvggXAXxJBREoANtEDgp/0ySbA==} 400 | 401 | '@turf/boolean-within@7.2.0': 402 | resolution: {integrity: sha512-zB3AiF59zQZ27Dp1iyhp9mVAKOFHat8RDH45TZhLY8EaqdEPdmLGvwMFCKfLryQcUDQvmzP8xWbtUR82QM5C4g==} 403 | 404 | '@turf/buffer@7.2.0': 405 | resolution: {integrity: sha512-QH1FTr5Mk4z1kpQNztMD8XBOZfpOXPOtlsxaSAj2kDIf5+LquA6HtJjZrjUngnGtzG5+XwcfyRL4ImvLnFjm5Q==} 406 | 407 | '@turf/center-mean@7.2.0': 408 | resolution: {integrity: sha512-NaW6IowAooTJ35O198Jw3U4diZ6UZCCeJY+4E+WMLpks3FCxMDSHEfO2QjyOXQMGWZnVxVelqI5x9DdniDbQ+A==} 409 | 410 | '@turf/center-median@7.2.0': 411 | resolution: {integrity: sha512-/CgVyHNG4zAoZpvkl7qBCe4w7giWNVtLyTU5PoIfg1vWM4VpYw+N7kcBBH46bbzvVBn0vhmZr586r543EwdC/A==} 412 | 413 | '@turf/center-of-mass@7.2.0': 414 | resolution: {integrity: sha512-ij3pmG61WQPHGTQvOziPOdIgwTMegkYTwIc71Gl7xn4C0vWH6KLDSshCphds9xdWSXt2GbHpUs3tr4XGntHkEQ==} 415 | 416 | '@turf/center@7.2.0': 417 | resolution: {integrity: sha512-UTNp9abQ2kuyRg5gCIGDNwwEQeF3NbpYsd1Q0KW9lwWuzbLVNn0sOwbxjpNF4J2HtMOs5YVOcqNvYyuoa2XrXw==} 418 | 419 | '@turf/centroid@7.2.0': 420 | resolution: {integrity: sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==} 421 | 422 | '@turf/circle@7.2.0': 423 | resolution: {integrity: sha512-1AbqBYtXhstrHmnW6jhLwsv7TtmT0mW58Hvl1uZXEDM1NCVXIR50yDipIeQPjrCuJ/Zdg/91gU8+4GuDCAxBGA==} 424 | 425 | '@turf/clean-coords@7.2.0': 426 | resolution: {integrity: sha512-+5+J1+D7wW7O/RDXn46IfCHuX1gIV1pIAQNSA7lcDbr3HQITZj334C4mOGZLEcGbsiXtlHWZiBtm785Vg8i+QQ==} 427 | 428 | '@turf/clone@7.2.0': 429 | resolution: {integrity: sha512-JlGUT+/5qoU5jqZmf6NMFIoLDY3O7jKd53Up+zbpJ2vzUp6QdwdNzwrsCeONhynWM13F0MVtPXH4AtdkrgFk4g==} 430 | 431 | '@turf/clusters-dbscan@7.2.0': 432 | resolution: {integrity: sha512-VWVUuDreev56g3/BMlnq/81yzczqaz+NVTypN5CigGgP67e+u/CnijphiuhKjtjDd/MzGjXgEWBJc26Y6LYKAw==} 433 | 434 | '@turf/clusters-kmeans@7.2.0': 435 | resolution: {integrity: sha512-BxQdK8jc8Mwm9yoClCYkktm4W004uiQGqb/i/6Y7a8xqgJITWDgTu/cy//wOxAWPk4xfe6MThjnqkszWW8JdyQ==} 436 | 437 | '@turf/clusters@7.2.0': 438 | resolution: {integrity: sha512-sKOrIKHHtXAuTKNm2USnEct+6/MrgyzMW42deZ2YG2RRKWGaaxHMFU2Yw71Yk4DqStOqTIBQpIOdrRuSOwbuQw==} 439 | 440 | '@turf/collect@7.2.0': 441 | resolution: {integrity: sha512-zRVGDlYS8Bx/Zz4vnEUyRg4dmqHhkDbW/nIUIJh657YqaMj1SFi4Iv2i9NbcurlUBDJFkpuOhCvvEvAdskJ8UA==} 442 | 443 | '@turf/combine@7.2.0': 444 | resolution: {integrity: sha512-VEjm3IvnbMt3IgeRIhCDhhQDbLqCU1/5uN1+j1u6fyA095pCizPThGp4f/COSzC3t1s/iiV+fHuDsB6DihHffQ==} 445 | 446 | '@turf/concave@7.2.0': 447 | resolution: {integrity: sha512-cpaDDlumK762kdadexw5ZAB6g/h2pJdihZ+e65lbQVe3WukJHAANnIEeKsdFCuIyNKrwTz2gWu5ws+OpjP48Yw==} 448 | 449 | '@turf/convex@7.2.0': 450 | resolution: {integrity: sha512-HsgHm+zHRE8yPCE/jBUtWFyaaBmpXcSlyHd5/xsMhSZRImFzRzBibaONWQo7xbKZMISC3Nc6BtUjDi/jEVbqyA==} 451 | 452 | '@turf/destination@7.2.0': 453 | resolution: {integrity: sha512-8DUxtOO0Fvrh1xclIUj3d9C5WS20D21F5E+j+X9Q+ju6fcM4huOqTg5ckV1DN2Pg8caABEc5HEZJnGch/5YnYQ==} 454 | 455 | '@turf/difference@7.2.0': 456 | resolution: {integrity: sha512-NHKD1v3s8RX+9lOpvHJg6xRuJOKiY3qxHhz5/FmE0VgGqnCkE7OObqWZ5SsXG+Ckh0aafs5qKhmDdDV/gGi6JA==} 457 | 458 | '@turf/dissolve@7.2.0': 459 | resolution: {integrity: sha512-gPG5TE3mAYuZqBut8tPYCKwi4hhx5Cq0ALoQMB9X0hrVtFIKrihrsj98XQM/5pL/UIpAxQfwisQvy6XaOFaoPA==} 460 | 461 | '@turf/distance-weight@7.2.0': 462 | resolution: {integrity: sha512-NeoyV0fXDH+7nIoNtLjAoH9XL0AS1pmTIyDxEE6LryoDTsqjnuR0YQxIkLCCWDqECoqaOmmBqpeWONjX5BwWCg==} 463 | 464 | '@turf/distance@7.2.0': 465 | resolution: {integrity: sha512-HBjjXIgEcD/wJYjv7/6OZj5yoky2oUvTtVeIAqO3lL80XRvoYmVg6vkOIu6NswkerwLDDNT9kl7+BFLJoHbh6Q==} 466 | 467 | '@turf/ellipse@7.2.0': 468 | resolution: {integrity: sha512-/Y75S5hE2+xjnTw4dXpQ5r/Y2HPM4xrwkPRCCQRpuuboKdEvm42azYmh7isPnMnBTVcmGb9UmGKj0HHAbiwt1g==} 469 | 470 | '@turf/envelope@7.2.0': 471 | resolution: {integrity: sha512-xOMtDeNKHwUuDfzQeoSNmdabsP0/IgVDeyzitDe/8j9wTeW+MrKzVbGz7627PT3h6gsO+2nUv5asfKtUbmTyHA==} 472 | 473 | '@turf/explode@7.2.0': 474 | resolution: {integrity: sha512-jyMXg93J1OI7/65SsLE1k9dfQD3JbcPNMi4/O3QR2Qb3BAs2039oFaSjtW+YqhMqVC4V3ZeKebMcJ8h9sK1n+A==} 475 | 476 | '@turf/flatten@7.2.0': 477 | resolution: {integrity: sha512-q38Qsqr4l7mxp780zSdn0gp/WLBX+sa+gV6qIbDQ1HKCrrPK8QQJmNx7gk1xxEXVot6tq/WyAPysCQdX+kLmMA==} 478 | 479 | '@turf/flip@7.2.0': 480 | resolution: {integrity: sha512-X0TQ0U/UYh4tyXdLO5itP1sO2HOvfrZC0fYSWmTfLDM14jEPkEK8PblofznfBygL+pIFtOS2is8FuVcp5XxYpQ==} 481 | 482 | '@turf/geojson-rbush@7.2.0': 483 | resolution: {integrity: sha512-ST8fLv+EwxVkDgsmhHggM0sPk2SfOHTZJkdgMXVFT7gB9o4lF8qk4y4lwvCCGIfFQAp2yv/PN5EaGMEKutk6xw==} 484 | 485 | '@turf/great-circle@7.2.0': 486 | resolution: {integrity: sha512-n30OiADyOKHhor0aXNgYfXQYXO3UtsOKmhQsY1D89/Oh1nCIXG/1ZPlLL9ZoaRXXBTUBjh99a+K8029NQbGDhw==} 487 | 488 | '@turf/helpers@7.2.0': 489 | resolution: {integrity: sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==} 490 | 491 | '@turf/hex-grid@7.2.0': 492 | resolution: {integrity: sha512-Yo2yUGxrTCQfmcVsSjDt0G3Veg8YD26WRd7etVPD9eirNNgXrIyZkbYA7zVV/qLeRWVmYIKRXg1USWl7ORQOGA==} 493 | 494 | '@turf/interpolate@7.2.0': 495 | resolution: {integrity: sha512-Ifgjm1SEo6XujuSAU6lpRMvoJ1SYTreil1Rf5WsaXj16BQJCedht/4FtWCTNhSWTwEz2motQ1WNrjTCuPG94xA==} 496 | 497 | '@turf/intersect@7.2.0': 498 | resolution: {integrity: sha512-81GMzKS9pKqLPa61qSlFxLFeAC8XbwyCQ9Qv4z6o5skWk1qmMUbEHeMqaGUTEzk+q2XyhZ0sju1FV4iLevQ/aw==} 499 | 500 | '@turf/invariant@7.2.0': 501 | resolution: {integrity: sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q==} 502 | 503 | '@turf/isobands@7.2.0': 504 | resolution: {integrity: sha512-lYoHeRieFzpBp29Jh19QcDIb0E+dzo/K5uwZuNga4wxr6heNU0AfkD4ByAHYIXHtvmp4m/JpSKq/2N6h/zvBkg==} 505 | 506 | '@turf/isolines@7.2.0': 507 | resolution: {integrity: sha512-4ZXKxvA/JKkxAXixXhN3UVza5FABsdYgOWXyYm3L5ryTPJVOYTVSSd9A+CAVlv9dZc3YdlsqMqLTXNOOre/kwg==} 508 | 509 | '@turf/jsts@2.7.2': 510 | resolution: {integrity: sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==} 511 | 512 | '@turf/kinks@7.2.0': 513 | resolution: {integrity: sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA==} 514 | 515 | '@turf/length@7.2.0': 516 | resolution: {integrity: sha512-LBmYN+iCgVtWNLsckVnpQIJENqIIPO63mogazMp23lrDGfWXu07zZQ9ZinJVO5xYurXNhc/QI2xxoqt2Xw90Ig==} 517 | 518 | '@turf/line-arc@7.2.0': 519 | resolution: {integrity: sha512-kfWzA5oYrTpslTg5fN50G04zSypiYQzjZv3FLjbZkk6kta5fo4JkERKjTeA8x4XNojb+pfmjMBB0yIh2w2dDRw==} 520 | 521 | '@turf/line-chunk@7.2.0': 522 | resolution: {integrity: sha512-1ODyL5gETtWSL85MPI0lgp/78vl95M39gpeBxePXyDIqx8geDP9kXfAzctuKdxBoR4JmOVM3NT7Fz7h+IEkC+g==} 523 | 524 | '@turf/line-intersect@7.2.0': 525 | resolution: {integrity: sha512-GhCJVEkc8EmggNi85EuVLoXF5T5jNVxmhIetwppiVyJzMrwkYAkZSYB3IBFYGUUB9qiNFnTwungVSsBV/S8ZiA==} 526 | 527 | '@turf/line-offset@7.2.0': 528 | resolution: {integrity: sha512-1+OkYueDCbnEWzbfBh3taVr+3SyM2bal5jfnSEuDiLA6jnlScgr8tn3INo+zwrUkPFZPPAejL1swVyO5TjUahw==} 529 | 530 | '@turf/line-overlap@7.2.0': 531 | resolution: {integrity: sha512-NNn7/jg53+N10q2Kyt66bEDqN3101iW/1zA5FW7J6UbKApDFkByh+18YZq1of71kS6oUYplP86WkDp16LFpqqw==} 532 | 533 | '@turf/line-segment@7.2.0': 534 | resolution: {integrity: sha512-E162rmTF9XjVN4rINJCd15AdQGCBlNqeWN3V0YI1vOUpZFNT2ii4SqEMCcH2d+5EheHLL8BWVwZoOsvHZbvaWA==} 535 | 536 | '@turf/line-slice-along@7.2.0': 537 | resolution: {integrity: sha512-4/gPgP0j5Rp+1prbhXqn7kIH/uZTmSgiubUnn67F8nb9zE+MhbRglhSlRYEZxAVkB7VrGwjyolCwvrROhjHp2A==} 538 | 539 | '@turf/line-slice@7.2.0': 540 | resolution: {integrity: sha512-bHotzZIaU1GPV3RMwttYpDrmcvb3X2i1g/WUttPZWtKrEo2VVAkoYdeZ2aFwtogERYS4quFdJ/TDzAtquBC8WQ==} 541 | 542 | '@turf/line-split@7.2.0': 543 | resolution: {integrity: sha512-yJTZR+c8CwoKqdW/aIs+iLbuFwAa3Yan+EOADFQuXXIUGps3bJUXx/38rmowNoZbHyP1np1+OtrotyHu5uBsfQ==} 544 | 545 | '@turf/line-to-polygon@7.2.0': 546 | resolution: {integrity: sha512-iKpJqc7EYc5NvlD4KaqrKKO6mXR7YWO/YwtW60E2FnsF/blnsy9OfAOcilYHgH3S/V/TT0VedC7DW7Kgjy2EIA==} 547 | 548 | '@turf/mask@7.2.0': 549 | resolution: {integrity: sha512-ulJ6dQqXC0wrjIoqFViXuMUdIPX5Q6GPViZ3kGfeVijvlLM7kTFBsZiPQwALSr5nTQg4Ppf3FD0Jmg8IErPrgA==} 550 | 551 | '@turf/meta@7.2.0': 552 | resolution: {integrity: sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==} 553 | 554 | '@turf/midpoint@7.2.0': 555 | resolution: {integrity: sha512-AMn5S9aSrbXdE+Q4Rj+T5nLdpfpn+mfzqIaEKkYI021HC0vb22HyhQHsQbSeX+AWcS4CjD1hFsYVcgKI+5qCfw==} 556 | 557 | '@turf/moran-index@7.2.0': 558 | resolution: {integrity: sha512-Aexh1EmXVPJhApr9grrd120vbalIthcIsQ3OAN2Tqwf+eExHXArJEJqGBo9IZiQbIpFJeftt/OvUvlI8BeO1bA==} 559 | 560 | '@turf/nearest-neighbor-analysis@7.2.0': 561 | resolution: {integrity: sha512-LmP/crXb7gilgsL0wL9hsygqc537W/a1W5r9XBKJT4SKdqjoXX5APJatJfd3nwXbRIqwDH0cDA9/YyFjBPlKnA==} 562 | 563 | '@turf/nearest-point-on-line@7.2.0': 564 | resolution: {integrity: sha512-UOhAeoDPVewBQV+PWg1YTMQcYpJsIqfW5+EuZ5vJl60XwUa0+kqB/eVfSLNXmHENjKKIlEt9Oy9HIDF4VeWmXA==} 565 | 566 | '@turf/nearest-point-to-line@7.2.0': 567 | resolution: {integrity: sha512-EorU7Qj30A7nAjh++KF/eTPDlzwuuV4neBz7tmSTB21HKuXZAR0upJsx6M2X1CSyGEgNsbFB0ivNKIvymRTKBw==} 568 | 569 | '@turf/nearest-point@7.2.0': 570 | resolution: {integrity: sha512-0wmsqXZ8CGw4QKeZmS+NdjYTqCMC+HXZvM3XAQIU6k6laNLqjad2oS4nDrtcRs/nWDvcj1CR+Io7OiQ6sbpn5Q==} 571 | 572 | '@turf/planepoint@7.2.0': 573 | resolution: {integrity: sha512-8Vno01tvi5gThUEKBQ46CmlEKDAwVpkl7stOPFvJYlA1oywjAL4PsmgwjXgleZuFtXQUPBNgv5a42Pf438XP4g==} 574 | 575 | '@turf/point-grid@7.2.0': 576 | resolution: {integrity: sha512-ai7lwBV2FREPW3XiUNohT4opC1hd6+F56qZe20xYhCTkTD9diWjXHiNudQPSmVAUjgMzQGasblQQqvOdL+bJ3Q==} 577 | 578 | '@turf/point-on-feature@7.2.0': 579 | resolution: {integrity: sha512-ksoYoLO9WtJ/qI8VI9ltF+2ZjLWrAjZNsCsu8F7nyGeCh4I8opjf4qVLytFG44XA2qI5yc6iXDpyv0sshvP82Q==} 580 | 581 | '@turf/point-to-line-distance@7.2.0': 582 | resolution: {integrity: sha512-fB9Rdnb5w5+t76Gho2dYDkGe20eRrFk8CXi4v1+l1PC8YyLXO+x+l3TrtT8HzL/dVaZeepO6WUIsIw3ditTOPg==} 583 | 584 | '@turf/point-to-polygon-distance@7.2.0': 585 | resolution: {integrity: sha512-w+WYuINgTiFjoZemQwOaQSje/8Kq+uqJOynvx7+gleQPHyWQ3VtTodtV4LwzVzXz8Sf7Mngx1Jcp2SNai5CJYA==} 586 | 587 | '@turf/points-within-polygon@7.2.0': 588 | resolution: {integrity: sha512-jRKp8/mWNMzA+hKlQhxci97H5nOio9tp14R2SzpvkOt+cswxl+NqTEi1hDd2XetA7tjU0TSoNjEgVY8FfA0S6w==} 589 | 590 | '@turf/polygon-smooth@7.2.0': 591 | resolution: {integrity: sha512-KCp9wF2IEynvGXVhySR8oQ2razKP0zwg99K+fuClP21pSKCFjAPaihPEYq6e8uI/1J7ibjL5++6EMl+LrUTrLg==} 592 | 593 | '@turf/polygon-tangents@7.2.0': 594 | resolution: {integrity: sha512-AHUUPmOjiQDrtP/ODXukHBlUG0C/9I1je7zz50OTfl2ZDOdEqFJQC3RyNELwq07grTXZvg5TS5wYx/Y7nsm47g==} 595 | 596 | '@turf/polygon-to-line@7.2.0': 597 | resolution: {integrity: sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA==} 598 | 599 | '@turf/polygonize@7.2.0': 600 | resolution: {integrity: sha512-U9v+lBhUPDv+nsg/VcScdiqCB59afO6CHDGrwIl2+5i6Ve+/KQKjpTV/R+NqoC1iMXAEq3brY6HY8Ukp/pUWng==} 601 | 602 | '@turf/projection@7.2.0': 603 | resolution: {integrity: sha512-/qke5vJScv8Mu7a+fU3RSChBRijE6EVuFHU3RYihMuYm04Vw8dBMIs0enEpoq0ke/IjSbleIrGQNZIMRX9EwZQ==} 604 | 605 | '@turf/quadrat-analysis@7.2.0': 606 | resolution: {integrity: sha512-fDQh3+ldYNxUqS6QYlvJ7GZLlCeDZR6tD3ikdYtOsSemwW1n/4gm2xcgWJqy3Y0uszBwxc13IGGY7NGEjHA+0w==} 607 | 608 | '@turf/random@7.2.0': 609 | resolution: {integrity: sha512-fNXs5mOeXsrirliw84S8UCNkpm4RMNbefPNsuCTfZEXhcr1MuHMzq4JWKb4FweMdN1Yx2l/xcytkO0s71cJ50w==} 610 | 611 | '@turf/rectangle-grid@7.2.0': 612 | resolution: {integrity: sha512-f0o5ifvy0Ml/nHDJzMNcuSk4h11aa3BfvQNnYQhLpuTQu03j/ICZNlzKTLxwjcUqvxADUifty7Z9CX5W6zky4A==} 613 | 614 | '@turf/rewind@7.2.0': 615 | resolution: {integrity: sha512-SZpRAZiZsE22+HVz6pEID+ST25vOdpAMGk5NO1JeqzhpMALIkIGnkG+xnun2CfYHz7wv8/Z0ADiAvei9rkcQYA==} 616 | 617 | '@turf/rhumb-bearing@7.2.0': 618 | resolution: {integrity: sha512-jbdexlrR8X2ZauUciHx3tRwG+BXoMXke4B8p8/IgDlAfIrVdzAxSQN89FMzIKnjJ/kdLjo9bFGvb92bu31Etug==} 619 | 620 | '@turf/rhumb-destination@7.2.0': 621 | resolution: {integrity: sha512-U9OLgLAHlH4Wfx3fBZf3jvnkDjdTcfRan5eI7VPV1+fQWkOteATpzkiRjCvSYK575GljVwWBjkKca8LziGWitQ==} 622 | 623 | '@turf/rhumb-distance@7.2.0': 624 | resolution: {integrity: sha512-NsijTPON1yOc9tirRPEQQuJ5aQi7pREsqchQquaYKbHNWsexZjcDi4wnw2kM3Si4XjmgynT+2f7aXH7FHarHzw==} 625 | 626 | '@turf/sample@7.2.0': 627 | resolution: {integrity: sha512-f+ZbcbQJ9glQ/F26re8LadxO0ORafy298EJZe6XtbctRTJrNus6UNAsl8+GYXFqMnXM22tbTAznnJX3ZiWNorA==} 628 | 629 | '@turf/sector@7.2.0': 630 | resolution: {integrity: sha512-zL06MjbbMG4DdpiNz+Q9Ax8jsCekt3R76uxeWShulAGkyDB5smdBOUDoRwxn05UX7l4kKv4Ucq2imQXhxKFd1w==} 631 | 632 | '@turf/shortest-path@7.2.0': 633 | resolution: {integrity: sha512-6fpx8feZ2jMSaeRaFdqFShGWkNb+veUOeyLFSHA/aRD9n/e9F2pWZoRbQWKbKTpcKFJ2FnDEqCZnh/GrcAsqWA==} 634 | 635 | '@turf/simplify@7.2.0': 636 | resolution: {integrity: sha512-9YHIfSc8BXQfi5IvEMbCeQYqNch0UawIGwbboJaoV8rodhtk6kKV2wrpXdGqk/6Thg6/RWvChJFKVVTjVrULyQ==} 637 | 638 | '@turf/square-grid@7.2.0': 639 | resolution: {integrity: sha512-EmzGXa90hz+tiCOs9wX+Lak6pH0Vghb7QuX6KZej+pmWi3Yz7vdvQLmy/wuN048+wSkD5c8WUo/kTeNDe7GnmA==} 640 | 641 | '@turf/square@7.2.0': 642 | resolution: {integrity: sha512-9pMoAGFvqzCDOlO9IRSSBCGXKbl8EwMx6xRRBMKdZgpS0mZgfm9xiptMmx/t1m4qqHIlb/N+3MUF7iMBx6upcA==} 643 | 644 | '@turf/standard-deviational-ellipse@7.2.0': 645 | resolution: {integrity: sha512-+uC0pR2nRjm90JvMXe/2xOCZsYV2II1ZZ2zmWcBWv6bcFXBspcxk2QfCC3k0bj6jDapELzoQgnn3cG5lbdQV2w==} 646 | 647 | '@turf/tag@7.2.0': 648 | resolution: {integrity: sha512-TAFvsbp5TCBqXue8ui+CtcLsPZ6NPC88L8Ad6Hb/R6VAi21qe0U42WJHQYXzWmtThoTNwxi+oKSeFbRDsr0FIA==} 649 | 650 | '@turf/tesselate@7.2.0': 651 | resolution: {integrity: sha512-zHGcG85aOJJu1seCm+CYTJ3UempX4Xtyt669vFG6Hbr/Hc7ii6STQ2ysFr7lJwFtU9uyYhphVrrgwIqwglvI/Q==} 652 | 653 | '@turf/tin@7.2.0': 654 | resolution: {integrity: sha512-y24Vt3oeE6ZXvyLJamP0Ke02rPlDGE9gF7OFADnR0mT+2uectb0UTIBC3kKzON80TEAlA3GXpKFkCW5Fo/O/Kg==} 655 | 656 | '@turf/transform-rotate@7.2.0': 657 | resolution: {integrity: sha512-EMCj0Zqy3cF9d3mGRqDlYnX2ZBXe3LgT+piDR0EuF5c5sjuKErcFcaBIsn/lg1gp4xCNZFinkZ3dsFfgGHf6fw==} 658 | 659 | '@turf/transform-scale@7.2.0': 660 | resolution: {integrity: sha512-HYB+pw938eeI8s1/zSWFy6hq+t38fuUaBb0jJsZB1K9zQ1WjEYpPvKF/0//80zNPlyxLv3cOkeBucso3hzI07A==} 661 | 662 | '@turf/transform-translate@7.2.0': 663 | resolution: {integrity: sha512-zAglR8MKCqkzDTjGMIQgbg/f+Q3XcKVzr9cELw5l9CrS1a0VTSDtBZLDm0kWx0ankwtam7ZmI2jXyuQWT8Gbug==} 664 | 665 | '@turf/triangle-grid@7.2.0': 666 | resolution: {integrity: sha512-4gcAqWKh9hg6PC5nNSb9VWyLgl821cwf9yR9yEzQhEFfwYL/pZONBWCO1cwVF23vSYMSMm+/TwqxH4emxaArfw==} 667 | 668 | '@turf/truncate@7.2.0': 669 | resolution: {integrity: sha512-jyFzxYbPugK4XjV5V/k6Xr3taBjjvo210IbPHJXw0Zh7Y6sF+hGxeRVtSuZ9VP/6oRyqAOHKUrze+OOkPqBgUg==} 670 | 671 | '@turf/turf@7.2.0': 672 | resolution: {integrity: sha512-G1kKBu4hYgoNoRJgnpJohNuS7bLnoWHZ2G/4wUMym5xOSiYah6carzdTEsMoTsauyi7ilByWHx5UHwbjjCVcBw==} 673 | 674 | '@turf/union@7.2.0': 675 | resolution: {integrity: sha512-Xex/cfKSmH0RZRWSJl4RLlhSmEALVewywiEXcu0aIxNbuZGTcpNoI0h4oLFrE/fUd0iBGFg/EGLXRL3zTfpg6g==} 676 | 677 | '@turf/unkink-polygon@7.2.0': 678 | resolution: {integrity: sha512-dFPfzlIgkEr15z6oXVxTSWshWi51HeITGVFtl1GAKGMtiXJx1uMqnfRsvljqEjaQu/4AzG1QAp3b+EkSklQSiQ==} 679 | 680 | '@turf/voronoi@7.2.0': 681 | resolution: {integrity: sha512-3K6N0LtJsWTXxPb/5N2qD9e8f4q8+tjTbGV3lE3v8x06iCnNlnuJnqM5NZNPpvgvCatecBkhClO3/3RndE61Fw==} 682 | 683 | '@tweenjs/tween.js@23.1.3': 684 | resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} 685 | 686 | '@types/d3-voronoi@1.1.12': 687 | resolution: {integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==} 688 | 689 | '@types/estree@1.0.6': 690 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 691 | 692 | '@types/geojson@7946.0.16': 693 | resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} 694 | 695 | '@types/linkify-it@5.0.0': 696 | resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} 697 | 698 | '@types/markdown-it@14.1.2': 699 | resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} 700 | 701 | '@types/mdurl@2.0.0': 702 | resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} 703 | 704 | '@types/node@22.13.0': 705 | resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==} 706 | 707 | '@types/stats.js@0.17.3': 708 | resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==} 709 | 710 | '@types/three@0.173.0': 711 | resolution: {integrity: sha512-KtNjfI/CRB6JVKIVeZM1R3GYDX2wkoV2itNcQu2j4d7qkhjGOuB+s2oF6jl9mztycDLGMtrAnJQYxInC8Bb20A==} 712 | 713 | '@types/webxr@0.5.21': 714 | resolution: {integrity: sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA==} 715 | 716 | '@webgpu/types@0.1.54': 717 | resolution: {integrity: sha512-81oaalC8LFrXjhsczomEQ0u3jG+TqE6V9QHLA8GNZq/Rnot0KDugu3LhSYSlie8tSdooAN1Hov05asrUUp9qgg==} 718 | 719 | JSONStream@1.3.5: 720 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} 721 | hasBin: true 722 | 723 | acorn-jsx@5.3.2: 724 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 725 | peerDependencies: 726 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 727 | 728 | acorn@8.14.0: 729 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 730 | engines: {node: '>=0.4.0'} 731 | hasBin: true 732 | 733 | ansi-styles@4.3.0: 734 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 735 | engines: {node: '>=8'} 736 | 737 | argparse@2.0.1: 738 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 739 | 740 | balanced-match@1.0.2: 741 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 742 | 743 | bignumber.js@9.1.2: 744 | resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} 745 | 746 | bluebird@3.7.2: 747 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 748 | 749 | brace-expansion@2.0.1: 750 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 751 | 752 | catharsis@0.9.0: 753 | resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} 754 | engines: {node: '>= 10'} 755 | 756 | chalk@4.1.2: 757 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 758 | engines: {node: '>=10'} 759 | 760 | color-convert@2.0.1: 761 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 762 | engines: {node: '>=7.0.0'} 763 | 764 | color-name@1.1.4: 765 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 766 | 767 | commander@2.20.3: 768 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 769 | 770 | concaveman@1.2.1: 771 | resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==} 772 | 773 | d3-array@1.2.4: 774 | resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} 775 | 776 | d3-geo@1.7.1: 777 | resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==} 778 | 779 | d3-voronoi@1.1.2: 780 | resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==} 781 | 782 | deep-is@0.1.4: 783 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 784 | 785 | earcut@2.2.4: 786 | resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} 787 | 788 | entities@4.5.0: 789 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 790 | engines: {node: '>=0.12'} 791 | 792 | esbuild@0.24.2: 793 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 794 | engines: {node: '>=18'} 795 | hasBin: true 796 | 797 | escape-string-regexp@2.0.0: 798 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 799 | engines: {node: '>=8'} 800 | 801 | escodegen@1.14.3: 802 | resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} 803 | engines: {node: '>=4.0'} 804 | hasBin: true 805 | 806 | eslint-visitor-keys@3.4.3: 807 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 808 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 809 | 810 | espree@9.6.1: 811 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 812 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 813 | 814 | esprima@4.0.1: 815 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 816 | engines: {node: '>=4'} 817 | hasBin: true 818 | 819 | estraverse@4.3.0: 820 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 821 | engines: {node: '>=4.0'} 822 | 823 | estraverse@5.3.0: 824 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 825 | engines: {node: '>=4.0'} 826 | 827 | esutils@2.0.3: 828 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 829 | engines: {node: '>=0.10.0'} 830 | 831 | fast-deep-equal@3.1.3: 832 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 833 | 834 | fast-levenshtein@2.0.6: 835 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 836 | 837 | fflate@0.8.2: 838 | resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} 839 | 840 | fs.realpath@1.0.0: 841 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 842 | 843 | fsevents@2.3.3: 844 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 845 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 846 | os: [darwin] 847 | 848 | geojson-equality-ts@1.0.2: 849 | resolution: {integrity: sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==} 850 | 851 | geojson-polygon-self-intersections@1.2.1: 852 | resolution: {integrity: sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==} 853 | 854 | geojson-stream@0.1.0: 855 | resolution: {integrity: sha512-svSg5fFXPaTiqzEBGXScA+nISaeC9rLvku2PH+wM5LToATUw2bLIrvls43ymnT9Xnp51nBPVyK9m4Af40KpJ7w==} 856 | 857 | glob@8.1.0: 858 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 859 | engines: {node: '>=12'} 860 | deprecated: Glob versions prior to v9 are no longer supported 861 | 862 | graceful-fs@4.2.11: 863 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 864 | 865 | has-flag@4.0.0: 866 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 867 | engines: {node: '>=8'} 868 | 869 | inflight@1.0.6: 870 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 871 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 872 | 873 | inherits@2.0.4: 874 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 875 | 876 | js2xmlparser@4.0.2: 877 | resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} 878 | 879 | jsdoc@4.0.4: 880 | resolution: {integrity: sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==} 881 | engines: {node: '>=12.0.0'} 882 | hasBin: true 883 | 884 | jsonparse@1.3.1: 885 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} 886 | engines: {'0': node >= 0.2.0} 887 | 888 | jsts@2.7.1: 889 | resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==} 890 | engines: {node: '>= 12'} 891 | 892 | klaw@3.0.0: 893 | resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} 894 | 895 | levn@0.3.0: 896 | resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} 897 | engines: {node: '>= 0.8.0'} 898 | 899 | linkify-it@5.0.0: 900 | resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} 901 | 902 | lodash@4.17.21: 903 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 904 | 905 | long@5.2.4: 906 | resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==} 907 | 908 | marchingsquares@1.3.3: 909 | resolution: {integrity: sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg==} 910 | 911 | markdown-it-anchor@8.6.7: 912 | resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} 913 | peerDependencies: 914 | '@types/markdown-it': '*' 915 | markdown-it: '*' 916 | 917 | markdown-it@14.1.0: 918 | resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} 919 | hasBin: true 920 | 921 | marked@4.3.0: 922 | resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} 923 | engines: {node: '>= 12'} 924 | hasBin: true 925 | 926 | mdurl@2.0.0: 927 | resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} 928 | 929 | meshoptimizer@0.18.1: 930 | resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} 931 | 932 | minimatch@5.1.6: 933 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 934 | engines: {node: '>=10'} 935 | 936 | minimist@1.2.8: 937 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 938 | 939 | mkdirp@1.0.4: 940 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 941 | engines: {node: '>=10'} 942 | hasBin: true 943 | 944 | nanoid@3.3.8: 945 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 946 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 947 | hasBin: true 948 | 949 | once@1.4.0: 950 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 951 | 952 | optionator@0.8.3: 953 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} 954 | engines: {node: '>= 0.8.0'} 955 | 956 | picocolors@1.1.1: 957 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 958 | 959 | point-in-polygon-hao@1.2.4: 960 | resolution: {integrity: sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==} 961 | 962 | point-in-polygon@1.1.0: 963 | resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} 964 | 965 | polyclip-ts@0.16.8: 966 | resolution: {integrity: sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==} 967 | 968 | postcss@8.5.1: 969 | resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} 970 | engines: {node: ^10 || ^12 || >=14} 971 | 972 | prelude-ls@1.1.2: 973 | resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} 974 | engines: {node: '>= 0.8.0'} 975 | 976 | protobufjs-cli@1.1.3: 977 | resolution: {integrity: sha512-MqD10lqF+FMsOayFiNOdOGNlXc4iKDCf0ZQPkPR+gizYh9gqUeGTWulABUCdI+N67w5RfJ6xhgX4J8pa8qmMXQ==} 978 | engines: {node: '>=12.0.0'} 979 | hasBin: true 980 | peerDependencies: 981 | protobufjs: ^7.0.0 982 | 983 | protobufjs@7.4.0: 984 | resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} 985 | engines: {node: '>=12.0.0'} 986 | 987 | punycode.js@2.3.1: 988 | resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} 989 | engines: {node: '>=6'} 990 | 991 | quickselect@1.1.1: 992 | resolution: {integrity: sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==} 993 | 994 | quickselect@2.0.0: 995 | resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} 996 | 997 | rbush@2.0.2: 998 | resolution: {integrity: sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==} 999 | 1000 | rbush@3.0.1: 1001 | resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} 1002 | 1003 | requizzle@0.2.4: 1004 | resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} 1005 | 1006 | robust-predicates@2.0.4: 1007 | resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==} 1008 | 1009 | robust-predicates@3.0.2: 1010 | resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} 1011 | 1012 | rollup@4.34.0: 1013 | resolution: {integrity: sha512-+4C/cgJ9w6sudisA0nZz0+O7lTP9a3CzNLsoDwaRumM8QHwghUsu6tqHXiTmNUp/rqNiM14++7dkzHDyCRs0Jg==} 1014 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1015 | hasBin: true 1016 | 1017 | semver@7.7.0: 1018 | resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} 1019 | engines: {node: '>=10'} 1020 | hasBin: true 1021 | 1022 | skmeans@0.9.7: 1023 | resolution: {integrity: sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==} 1024 | 1025 | source-map-js@1.2.1: 1026 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1027 | engines: {node: '>=0.10.0'} 1028 | 1029 | source-map@0.6.1: 1030 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1031 | engines: {node: '>=0.10.0'} 1032 | 1033 | splaytree-ts@1.0.2: 1034 | resolution: {integrity: sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==} 1035 | 1036 | strip-json-comments@3.1.1: 1037 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1038 | engines: {node: '>=8'} 1039 | 1040 | supports-color@7.2.0: 1041 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1042 | engines: {node: '>=8'} 1043 | 1044 | sweepline-intersections@1.5.0: 1045 | resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==} 1046 | 1047 | three@0.173.0: 1048 | resolution: {integrity: sha512-AUwVmViIEUgBwxJJ7stnF0NkPpZxx1aZ6WiAbQ/Qq61h6I9UR4grXtZDmO8mnlaNORhHnIBlXJ1uBxILEKuVyw==} 1049 | 1050 | through@2.3.8: 1051 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1052 | 1053 | tinyqueue@2.0.3: 1054 | resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} 1055 | 1056 | tmp@0.2.3: 1057 | resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} 1058 | engines: {node: '>=14.14'} 1059 | 1060 | topojson-client@3.1.0: 1061 | resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} 1062 | hasBin: true 1063 | 1064 | topojson-server@3.0.1: 1065 | resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==} 1066 | hasBin: true 1067 | 1068 | tslib@2.8.1: 1069 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1070 | 1071 | type-check@0.3.2: 1072 | resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} 1073 | engines: {node: '>= 0.8.0'} 1074 | 1075 | typescript@5.7.3: 1076 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1077 | engines: {node: '>=14.17'} 1078 | hasBin: true 1079 | 1080 | uc.micro@2.1.0: 1081 | resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} 1082 | 1083 | uglify-js@3.19.3: 1084 | resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} 1085 | engines: {node: '>=0.8.0'} 1086 | hasBin: true 1087 | 1088 | underscore@1.13.7: 1089 | resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} 1090 | 1091 | undici-types@6.20.0: 1092 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1093 | 1094 | vite@6.0.11: 1095 | resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} 1096 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1097 | hasBin: true 1098 | peerDependencies: 1099 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1100 | jiti: '>=1.21.0' 1101 | less: '*' 1102 | lightningcss: ^1.21.0 1103 | sass: '*' 1104 | sass-embedded: '*' 1105 | stylus: '*' 1106 | sugarss: '*' 1107 | terser: ^5.16.0 1108 | tsx: ^4.8.1 1109 | yaml: ^2.4.2 1110 | peerDependenciesMeta: 1111 | '@types/node': 1112 | optional: true 1113 | jiti: 1114 | optional: true 1115 | less: 1116 | optional: true 1117 | lightningcss: 1118 | optional: true 1119 | sass: 1120 | optional: true 1121 | sass-embedded: 1122 | optional: true 1123 | stylus: 1124 | optional: true 1125 | sugarss: 1126 | optional: true 1127 | terser: 1128 | optional: true 1129 | tsx: 1130 | optional: true 1131 | yaml: 1132 | optional: true 1133 | 1134 | word-wrap@1.2.5: 1135 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1136 | engines: {node: '>=0.10.0'} 1137 | 1138 | wrappy@1.0.2: 1139 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1140 | 1141 | xmlcreate@2.0.4: 1142 | resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} 1143 | 1144 | snapshots: 1145 | 1146 | '@babel/helper-string-parser@7.25.9': {} 1147 | 1148 | '@babel/helper-validator-identifier@7.25.9': {} 1149 | 1150 | '@babel/parser@7.26.7': 1151 | dependencies: 1152 | '@babel/types': 7.26.7 1153 | 1154 | '@babel/types@7.26.7': 1155 | dependencies: 1156 | '@babel/helper-string-parser': 7.25.9 1157 | '@babel/helper-validator-identifier': 7.25.9 1158 | 1159 | '@esbuild/aix-ppc64@0.24.2': 1160 | optional: true 1161 | 1162 | '@esbuild/android-arm64@0.24.2': 1163 | optional: true 1164 | 1165 | '@esbuild/android-arm@0.24.2': 1166 | optional: true 1167 | 1168 | '@esbuild/android-x64@0.24.2': 1169 | optional: true 1170 | 1171 | '@esbuild/darwin-arm64@0.24.2': 1172 | optional: true 1173 | 1174 | '@esbuild/darwin-x64@0.24.2': 1175 | optional: true 1176 | 1177 | '@esbuild/freebsd-arm64@0.24.2': 1178 | optional: true 1179 | 1180 | '@esbuild/freebsd-x64@0.24.2': 1181 | optional: true 1182 | 1183 | '@esbuild/linux-arm64@0.24.2': 1184 | optional: true 1185 | 1186 | '@esbuild/linux-arm@0.24.2': 1187 | optional: true 1188 | 1189 | '@esbuild/linux-ia32@0.24.2': 1190 | optional: true 1191 | 1192 | '@esbuild/linux-loong64@0.24.2': 1193 | optional: true 1194 | 1195 | '@esbuild/linux-mips64el@0.24.2': 1196 | optional: true 1197 | 1198 | '@esbuild/linux-ppc64@0.24.2': 1199 | optional: true 1200 | 1201 | '@esbuild/linux-riscv64@0.24.2': 1202 | optional: true 1203 | 1204 | '@esbuild/linux-s390x@0.24.2': 1205 | optional: true 1206 | 1207 | '@esbuild/linux-x64@0.24.2': 1208 | optional: true 1209 | 1210 | '@esbuild/netbsd-arm64@0.24.2': 1211 | optional: true 1212 | 1213 | '@esbuild/netbsd-x64@0.24.2': 1214 | optional: true 1215 | 1216 | '@esbuild/openbsd-arm64@0.24.2': 1217 | optional: true 1218 | 1219 | '@esbuild/openbsd-x64@0.24.2': 1220 | optional: true 1221 | 1222 | '@esbuild/sunos-x64@0.24.2': 1223 | optional: true 1224 | 1225 | '@esbuild/win32-arm64@0.24.2': 1226 | optional: true 1227 | 1228 | '@esbuild/win32-ia32@0.24.2': 1229 | optional: true 1230 | 1231 | '@esbuild/win32-x64@0.24.2': 1232 | optional: true 1233 | 1234 | '@jsdoc/salty@0.2.9': 1235 | dependencies: 1236 | lodash: 4.17.21 1237 | 1238 | '@protobufjs/aspromise@1.1.2': {} 1239 | 1240 | '@protobufjs/base64@1.1.2': {} 1241 | 1242 | '@protobufjs/codegen@2.0.4': {} 1243 | 1244 | '@protobufjs/eventemitter@1.1.0': {} 1245 | 1246 | '@protobufjs/fetch@1.1.0': 1247 | dependencies: 1248 | '@protobufjs/aspromise': 1.1.2 1249 | '@protobufjs/inquire': 1.1.0 1250 | 1251 | '@protobufjs/float@1.0.2': {} 1252 | 1253 | '@protobufjs/inquire@1.1.0': {} 1254 | 1255 | '@protobufjs/path@1.1.2': {} 1256 | 1257 | '@protobufjs/pool@1.1.0': {} 1258 | 1259 | '@protobufjs/utf8@1.1.0': {} 1260 | 1261 | '@rollup/rollup-android-arm-eabi@4.34.0': 1262 | optional: true 1263 | 1264 | '@rollup/rollup-android-arm64@4.34.0': 1265 | optional: true 1266 | 1267 | '@rollup/rollup-darwin-arm64@4.34.0': 1268 | optional: true 1269 | 1270 | '@rollup/rollup-darwin-x64@4.34.0': 1271 | optional: true 1272 | 1273 | '@rollup/rollup-freebsd-arm64@4.34.0': 1274 | optional: true 1275 | 1276 | '@rollup/rollup-freebsd-x64@4.34.0': 1277 | optional: true 1278 | 1279 | '@rollup/rollup-linux-arm-gnueabihf@4.34.0': 1280 | optional: true 1281 | 1282 | '@rollup/rollup-linux-arm-musleabihf@4.34.0': 1283 | optional: true 1284 | 1285 | '@rollup/rollup-linux-arm64-gnu@4.34.0': 1286 | optional: true 1287 | 1288 | '@rollup/rollup-linux-arm64-musl@4.34.0': 1289 | optional: true 1290 | 1291 | '@rollup/rollup-linux-loongarch64-gnu@4.34.0': 1292 | optional: true 1293 | 1294 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.0': 1295 | optional: true 1296 | 1297 | '@rollup/rollup-linux-riscv64-gnu@4.34.0': 1298 | optional: true 1299 | 1300 | '@rollup/rollup-linux-s390x-gnu@4.34.0': 1301 | optional: true 1302 | 1303 | '@rollup/rollup-linux-x64-gnu@4.34.0': 1304 | optional: true 1305 | 1306 | '@rollup/rollup-linux-x64-musl@4.34.0': 1307 | optional: true 1308 | 1309 | '@rollup/rollup-win32-arm64-msvc@4.34.0': 1310 | optional: true 1311 | 1312 | '@rollup/rollup-win32-ia32-msvc@4.34.0': 1313 | optional: true 1314 | 1315 | '@rollup/rollup-win32-x64-msvc@4.34.0': 1316 | optional: true 1317 | 1318 | '@turf/along@7.2.0': 1319 | dependencies: 1320 | '@turf/bearing': 7.2.0 1321 | '@turf/destination': 7.2.0 1322 | '@turf/distance': 7.2.0 1323 | '@turf/helpers': 7.2.0 1324 | '@turf/invariant': 7.2.0 1325 | '@types/geojson': 7946.0.16 1326 | tslib: 2.8.1 1327 | 1328 | '@turf/angle@7.2.0': 1329 | dependencies: 1330 | '@turf/bearing': 7.2.0 1331 | '@turf/helpers': 7.2.0 1332 | '@turf/invariant': 7.2.0 1333 | '@turf/rhumb-bearing': 7.2.0 1334 | '@types/geojson': 7946.0.16 1335 | tslib: 2.8.1 1336 | 1337 | '@turf/area@7.2.0': 1338 | dependencies: 1339 | '@turf/helpers': 7.2.0 1340 | '@turf/meta': 7.2.0 1341 | '@types/geojson': 7946.0.16 1342 | tslib: 2.8.1 1343 | 1344 | '@turf/bbox-clip@7.2.0': 1345 | dependencies: 1346 | '@turf/helpers': 7.2.0 1347 | '@turf/invariant': 7.2.0 1348 | '@types/geojson': 7946.0.16 1349 | tslib: 2.8.1 1350 | 1351 | '@turf/bbox-polygon@7.2.0': 1352 | dependencies: 1353 | '@turf/helpers': 7.2.0 1354 | '@types/geojson': 7946.0.16 1355 | tslib: 2.8.1 1356 | 1357 | '@turf/bbox@7.2.0': 1358 | dependencies: 1359 | '@turf/helpers': 7.2.0 1360 | '@turf/meta': 7.2.0 1361 | '@types/geojson': 7946.0.16 1362 | tslib: 2.8.1 1363 | 1364 | '@turf/bearing@7.2.0': 1365 | dependencies: 1366 | '@turf/helpers': 7.2.0 1367 | '@turf/invariant': 7.2.0 1368 | '@types/geojson': 7946.0.16 1369 | tslib: 2.8.1 1370 | 1371 | '@turf/bezier-spline@7.2.0': 1372 | dependencies: 1373 | '@turf/helpers': 7.2.0 1374 | '@turf/invariant': 7.2.0 1375 | '@types/geojson': 7946.0.16 1376 | tslib: 2.8.1 1377 | 1378 | '@turf/boolean-clockwise@7.2.0': 1379 | dependencies: 1380 | '@turf/helpers': 7.2.0 1381 | '@turf/invariant': 7.2.0 1382 | '@types/geojson': 7946.0.16 1383 | tslib: 2.8.1 1384 | 1385 | '@turf/boolean-concave@7.2.0': 1386 | dependencies: 1387 | '@turf/helpers': 7.2.0 1388 | '@turf/invariant': 7.2.0 1389 | '@types/geojson': 7946.0.16 1390 | tslib: 2.8.1 1391 | 1392 | '@turf/boolean-contains@7.2.0': 1393 | dependencies: 1394 | '@turf/bbox': 7.2.0 1395 | '@turf/boolean-point-in-polygon': 7.2.0 1396 | '@turf/boolean-point-on-line': 7.2.0 1397 | '@turf/helpers': 7.2.0 1398 | '@turf/invariant': 7.2.0 1399 | '@types/geojson': 7946.0.16 1400 | tslib: 2.8.1 1401 | 1402 | '@turf/boolean-crosses@7.2.0': 1403 | dependencies: 1404 | '@turf/boolean-point-in-polygon': 7.2.0 1405 | '@turf/helpers': 7.2.0 1406 | '@turf/invariant': 7.2.0 1407 | '@turf/line-intersect': 7.2.0 1408 | '@turf/polygon-to-line': 7.2.0 1409 | '@types/geojson': 7946.0.16 1410 | tslib: 2.8.1 1411 | 1412 | '@turf/boolean-disjoint@7.2.0': 1413 | dependencies: 1414 | '@turf/boolean-point-in-polygon': 7.2.0 1415 | '@turf/helpers': 7.2.0 1416 | '@turf/line-intersect': 7.2.0 1417 | '@turf/meta': 7.2.0 1418 | '@turf/polygon-to-line': 7.2.0 1419 | '@types/geojson': 7946.0.16 1420 | tslib: 2.8.1 1421 | 1422 | '@turf/boolean-equal@7.2.0': 1423 | dependencies: 1424 | '@turf/clean-coords': 7.2.0 1425 | '@turf/helpers': 7.2.0 1426 | '@turf/invariant': 7.2.0 1427 | '@types/geojson': 7946.0.16 1428 | geojson-equality-ts: 1.0.2 1429 | tslib: 2.8.1 1430 | 1431 | '@turf/boolean-intersects@7.2.0': 1432 | dependencies: 1433 | '@turf/boolean-disjoint': 7.2.0 1434 | '@turf/helpers': 7.2.0 1435 | '@turf/meta': 7.2.0 1436 | '@types/geojson': 7946.0.16 1437 | tslib: 2.8.1 1438 | 1439 | '@turf/boolean-overlap@7.2.0': 1440 | dependencies: 1441 | '@turf/helpers': 7.2.0 1442 | '@turf/invariant': 7.2.0 1443 | '@turf/line-intersect': 7.2.0 1444 | '@turf/line-overlap': 7.2.0 1445 | '@turf/meta': 7.2.0 1446 | '@types/geojson': 7946.0.16 1447 | geojson-equality-ts: 1.0.2 1448 | tslib: 2.8.1 1449 | 1450 | '@turf/boolean-parallel@7.2.0': 1451 | dependencies: 1452 | '@turf/clean-coords': 7.2.0 1453 | '@turf/helpers': 7.2.0 1454 | '@turf/line-segment': 7.2.0 1455 | '@turf/rhumb-bearing': 7.2.0 1456 | '@types/geojson': 7946.0.16 1457 | tslib: 2.8.1 1458 | 1459 | '@turf/boolean-point-in-polygon@7.2.0': 1460 | dependencies: 1461 | '@turf/helpers': 7.2.0 1462 | '@turf/invariant': 7.2.0 1463 | '@types/geojson': 7946.0.16 1464 | point-in-polygon-hao: 1.2.4 1465 | tslib: 2.8.1 1466 | 1467 | '@turf/boolean-point-on-line@7.2.0': 1468 | dependencies: 1469 | '@turf/helpers': 7.2.0 1470 | '@turf/invariant': 7.2.0 1471 | '@types/geojson': 7946.0.16 1472 | tslib: 2.8.1 1473 | 1474 | '@turf/boolean-touches@7.2.0': 1475 | dependencies: 1476 | '@turf/boolean-point-in-polygon': 7.2.0 1477 | '@turf/boolean-point-on-line': 7.2.0 1478 | '@turf/helpers': 7.2.0 1479 | '@turf/invariant': 7.2.0 1480 | '@types/geojson': 7946.0.16 1481 | tslib: 2.8.1 1482 | 1483 | '@turf/boolean-valid@7.2.0': 1484 | dependencies: 1485 | '@turf/bbox': 7.2.0 1486 | '@turf/boolean-crosses': 7.2.0 1487 | '@turf/boolean-disjoint': 7.2.0 1488 | '@turf/boolean-overlap': 7.2.0 1489 | '@turf/boolean-point-in-polygon': 7.2.0 1490 | '@turf/boolean-point-on-line': 7.2.0 1491 | '@turf/helpers': 7.2.0 1492 | '@turf/invariant': 7.2.0 1493 | '@turf/line-intersect': 7.2.0 1494 | '@types/geojson': 7946.0.16 1495 | geojson-polygon-self-intersections: 1.2.1 1496 | tslib: 2.8.1 1497 | 1498 | '@turf/boolean-within@7.2.0': 1499 | dependencies: 1500 | '@turf/bbox': 7.2.0 1501 | '@turf/boolean-point-in-polygon': 7.2.0 1502 | '@turf/boolean-point-on-line': 7.2.0 1503 | '@turf/helpers': 7.2.0 1504 | '@turf/invariant': 7.2.0 1505 | '@types/geojson': 7946.0.16 1506 | tslib: 2.8.1 1507 | 1508 | '@turf/buffer@7.2.0': 1509 | dependencies: 1510 | '@turf/bbox': 7.2.0 1511 | '@turf/center': 7.2.0 1512 | '@turf/helpers': 7.2.0 1513 | '@turf/jsts': 2.7.2 1514 | '@turf/meta': 7.2.0 1515 | '@turf/projection': 7.2.0 1516 | '@types/geojson': 7946.0.16 1517 | d3-geo: 1.7.1 1518 | 1519 | '@turf/center-mean@7.2.0': 1520 | dependencies: 1521 | '@turf/bbox': 7.2.0 1522 | '@turf/helpers': 7.2.0 1523 | '@turf/meta': 7.2.0 1524 | '@types/geojson': 7946.0.16 1525 | tslib: 2.8.1 1526 | 1527 | '@turf/center-median@7.2.0': 1528 | dependencies: 1529 | '@turf/center-mean': 7.2.0 1530 | '@turf/centroid': 7.2.0 1531 | '@turf/distance': 7.2.0 1532 | '@turf/helpers': 7.2.0 1533 | '@turf/meta': 7.2.0 1534 | '@types/geojson': 7946.0.16 1535 | tslib: 2.8.1 1536 | 1537 | '@turf/center-of-mass@7.2.0': 1538 | dependencies: 1539 | '@turf/centroid': 7.2.0 1540 | '@turf/convex': 7.2.0 1541 | '@turf/helpers': 7.2.0 1542 | '@turf/invariant': 7.2.0 1543 | '@turf/meta': 7.2.0 1544 | '@types/geojson': 7946.0.16 1545 | tslib: 2.8.1 1546 | 1547 | '@turf/center@7.2.0': 1548 | dependencies: 1549 | '@turf/bbox': 7.2.0 1550 | '@turf/helpers': 7.2.0 1551 | '@types/geojson': 7946.0.16 1552 | tslib: 2.8.1 1553 | 1554 | '@turf/centroid@7.2.0': 1555 | dependencies: 1556 | '@turf/helpers': 7.2.0 1557 | '@turf/meta': 7.2.0 1558 | '@types/geojson': 7946.0.16 1559 | tslib: 2.8.1 1560 | 1561 | '@turf/circle@7.2.0': 1562 | dependencies: 1563 | '@turf/destination': 7.2.0 1564 | '@turf/helpers': 7.2.0 1565 | '@types/geojson': 7946.0.16 1566 | tslib: 2.8.1 1567 | 1568 | '@turf/clean-coords@7.2.0': 1569 | dependencies: 1570 | '@turf/helpers': 7.2.0 1571 | '@turf/invariant': 7.2.0 1572 | '@types/geojson': 7946.0.16 1573 | tslib: 2.8.1 1574 | 1575 | '@turf/clone@7.2.0': 1576 | dependencies: 1577 | '@turf/helpers': 7.2.0 1578 | '@types/geojson': 7946.0.16 1579 | tslib: 2.8.1 1580 | 1581 | '@turf/clusters-dbscan@7.2.0': 1582 | dependencies: 1583 | '@turf/clone': 7.2.0 1584 | '@turf/distance': 7.2.0 1585 | '@turf/helpers': 7.2.0 1586 | '@turf/meta': 7.2.0 1587 | '@types/geojson': 7946.0.16 1588 | rbush: 3.0.1 1589 | tslib: 2.8.1 1590 | 1591 | '@turf/clusters-kmeans@7.2.0': 1592 | dependencies: 1593 | '@turf/clone': 7.2.0 1594 | '@turf/helpers': 7.2.0 1595 | '@turf/invariant': 7.2.0 1596 | '@turf/meta': 7.2.0 1597 | '@types/geojson': 7946.0.16 1598 | skmeans: 0.9.7 1599 | tslib: 2.8.1 1600 | 1601 | '@turf/clusters@7.2.0': 1602 | dependencies: 1603 | '@turf/helpers': 7.2.0 1604 | '@turf/meta': 7.2.0 1605 | '@types/geojson': 7946.0.16 1606 | tslib: 2.8.1 1607 | 1608 | '@turf/collect@7.2.0': 1609 | dependencies: 1610 | '@turf/bbox': 7.2.0 1611 | '@turf/boolean-point-in-polygon': 7.2.0 1612 | '@turf/helpers': 7.2.0 1613 | '@types/geojson': 7946.0.16 1614 | rbush: 3.0.1 1615 | tslib: 2.8.1 1616 | 1617 | '@turf/combine@7.2.0': 1618 | dependencies: 1619 | '@turf/helpers': 7.2.0 1620 | '@turf/meta': 7.2.0 1621 | '@types/geojson': 7946.0.16 1622 | tslib: 2.8.1 1623 | 1624 | '@turf/concave@7.2.0': 1625 | dependencies: 1626 | '@turf/clone': 7.2.0 1627 | '@turf/distance': 7.2.0 1628 | '@turf/helpers': 7.2.0 1629 | '@turf/invariant': 7.2.0 1630 | '@turf/meta': 7.2.0 1631 | '@turf/tin': 7.2.0 1632 | '@types/geojson': 7946.0.16 1633 | topojson-client: 3.1.0 1634 | topojson-server: 3.0.1 1635 | tslib: 2.8.1 1636 | 1637 | '@turf/convex@7.2.0': 1638 | dependencies: 1639 | '@turf/helpers': 7.2.0 1640 | '@turf/meta': 7.2.0 1641 | '@types/geojson': 7946.0.16 1642 | concaveman: 1.2.1 1643 | tslib: 2.8.1 1644 | 1645 | '@turf/destination@7.2.0': 1646 | dependencies: 1647 | '@turf/helpers': 7.2.0 1648 | '@turf/invariant': 7.2.0 1649 | '@types/geojson': 7946.0.16 1650 | tslib: 2.8.1 1651 | 1652 | '@turf/difference@7.2.0': 1653 | dependencies: 1654 | '@turf/helpers': 7.2.0 1655 | '@turf/meta': 7.2.0 1656 | '@types/geojson': 7946.0.16 1657 | polyclip-ts: 0.16.8 1658 | tslib: 2.8.1 1659 | 1660 | '@turf/dissolve@7.2.0': 1661 | dependencies: 1662 | '@turf/flatten': 7.2.0 1663 | '@turf/helpers': 7.2.0 1664 | '@turf/invariant': 7.2.0 1665 | '@turf/meta': 7.2.0 1666 | '@types/geojson': 7946.0.16 1667 | polyclip-ts: 0.16.8 1668 | tslib: 2.8.1 1669 | 1670 | '@turf/distance-weight@7.2.0': 1671 | dependencies: 1672 | '@turf/centroid': 7.2.0 1673 | '@turf/helpers': 7.2.0 1674 | '@turf/invariant': 7.2.0 1675 | '@turf/meta': 7.2.0 1676 | '@types/geojson': 7946.0.16 1677 | tslib: 2.8.1 1678 | 1679 | '@turf/distance@7.2.0': 1680 | dependencies: 1681 | '@turf/helpers': 7.2.0 1682 | '@turf/invariant': 7.2.0 1683 | '@types/geojson': 7946.0.16 1684 | tslib: 2.8.1 1685 | 1686 | '@turf/ellipse@7.2.0': 1687 | dependencies: 1688 | '@turf/helpers': 7.2.0 1689 | '@turf/invariant': 7.2.0 1690 | '@turf/rhumb-destination': 7.2.0 1691 | '@turf/transform-rotate': 7.2.0 1692 | '@types/geojson': 7946.0.16 1693 | tslib: 2.8.1 1694 | 1695 | '@turf/envelope@7.2.0': 1696 | dependencies: 1697 | '@turf/bbox': 7.2.0 1698 | '@turf/bbox-polygon': 7.2.0 1699 | '@turf/helpers': 7.2.0 1700 | '@types/geojson': 7946.0.16 1701 | tslib: 2.8.1 1702 | 1703 | '@turf/explode@7.2.0': 1704 | dependencies: 1705 | '@turf/helpers': 7.2.0 1706 | '@turf/meta': 7.2.0 1707 | '@types/geojson': 7946.0.16 1708 | tslib: 2.8.1 1709 | 1710 | '@turf/flatten@7.2.0': 1711 | dependencies: 1712 | '@turf/helpers': 7.2.0 1713 | '@turf/meta': 7.2.0 1714 | '@types/geojson': 7946.0.16 1715 | tslib: 2.8.1 1716 | 1717 | '@turf/flip@7.2.0': 1718 | dependencies: 1719 | '@turf/clone': 7.2.0 1720 | '@turf/helpers': 7.2.0 1721 | '@turf/meta': 7.2.0 1722 | '@types/geojson': 7946.0.16 1723 | tslib: 2.8.1 1724 | 1725 | '@turf/geojson-rbush@7.2.0': 1726 | dependencies: 1727 | '@turf/bbox': 7.2.0 1728 | '@turf/helpers': 7.2.0 1729 | '@turf/meta': 7.2.0 1730 | '@types/geojson': 7946.0.16 1731 | rbush: 3.0.1 1732 | 1733 | '@turf/great-circle@7.2.0': 1734 | dependencies: 1735 | '@turf/helpers': 7.2.0 1736 | '@turf/invariant': 7.2.0 1737 | '@types/geojson': 7946.0.16 1738 | 1739 | '@turf/helpers@7.2.0': 1740 | dependencies: 1741 | '@types/geojson': 7946.0.16 1742 | tslib: 2.8.1 1743 | 1744 | '@turf/hex-grid@7.2.0': 1745 | dependencies: 1746 | '@turf/distance': 7.2.0 1747 | '@turf/helpers': 7.2.0 1748 | '@turf/intersect': 7.2.0 1749 | '@turf/invariant': 7.2.0 1750 | '@types/geojson': 7946.0.16 1751 | tslib: 2.8.1 1752 | 1753 | '@turf/interpolate@7.2.0': 1754 | dependencies: 1755 | '@turf/bbox': 7.2.0 1756 | '@turf/centroid': 7.2.0 1757 | '@turf/clone': 7.2.0 1758 | '@turf/distance': 7.2.0 1759 | '@turf/helpers': 7.2.0 1760 | '@turf/hex-grid': 7.2.0 1761 | '@turf/invariant': 7.2.0 1762 | '@turf/meta': 7.2.0 1763 | '@turf/point-grid': 7.2.0 1764 | '@turf/square-grid': 7.2.0 1765 | '@turf/triangle-grid': 7.2.0 1766 | '@types/geojson': 7946.0.16 1767 | 1768 | '@turf/intersect@7.2.0': 1769 | dependencies: 1770 | '@turf/helpers': 7.2.0 1771 | '@turf/meta': 7.2.0 1772 | '@types/geojson': 7946.0.16 1773 | polyclip-ts: 0.16.8 1774 | tslib: 2.8.1 1775 | 1776 | '@turf/invariant@7.2.0': 1777 | dependencies: 1778 | '@turf/helpers': 7.2.0 1779 | '@types/geojson': 7946.0.16 1780 | tslib: 2.8.1 1781 | 1782 | '@turf/isobands@7.2.0': 1783 | dependencies: 1784 | '@turf/area': 7.2.0 1785 | '@turf/bbox': 7.2.0 1786 | '@turf/boolean-point-in-polygon': 7.2.0 1787 | '@turf/explode': 7.2.0 1788 | '@turf/helpers': 7.2.0 1789 | '@turf/invariant': 7.2.0 1790 | '@turf/meta': 7.2.0 1791 | '@types/geojson': 7946.0.16 1792 | marchingsquares: 1.3.3 1793 | tslib: 2.8.1 1794 | 1795 | '@turf/isolines@7.2.0': 1796 | dependencies: 1797 | '@turf/bbox': 7.2.0 1798 | '@turf/helpers': 7.2.0 1799 | '@turf/invariant': 7.2.0 1800 | '@turf/meta': 7.2.0 1801 | '@types/geojson': 7946.0.16 1802 | marchingsquares: 1.3.3 1803 | tslib: 2.8.1 1804 | 1805 | '@turf/jsts@2.7.2': 1806 | dependencies: 1807 | jsts: 2.7.1 1808 | 1809 | '@turf/kinks@7.2.0': 1810 | dependencies: 1811 | '@turf/helpers': 7.2.0 1812 | '@types/geojson': 7946.0.16 1813 | tslib: 2.8.1 1814 | 1815 | '@turf/length@7.2.0': 1816 | dependencies: 1817 | '@turf/distance': 7.2.0 1818 | '@turf/helpers': 7.2.0 1819 | '@turf/meta': 7.2.0 1820 | '@types/geojson': 7946.0.16 1821 | tslib: 2.8.1 1822 | 1823 | '@turf/line-arc@7.2.0': 1824 | dependencies: 1825 | '@turf/circle': 7.2.0 1826 | '@turf/destination': 7.2.0 1827 | '@turf/helpers': 7.2.0 1828 | '@types/geojson': 7946.0.16 1829 | tslib: 2.8.1 1830 | 1831 | '@turf/line-chunk@7.2.0': 1832 | dependencies: 1833 | '@turf/helpers': 7.2.0 1834 | '@turf/length': 7.2.0 1835 | '@turf/line-slice-along': 7.2.0 1836 | '@turf/meta': 7.2.0 1837 | '@types/geojson': 7946.0.16 1838 | 1839 | '@turf/line-intersect@7.2.0': 1840 | dependencies: 1841 | '@turf/helpers': 7.2.0 1842 | '@types/geojson': 7946.0.16 1843 | sweepline-intersections: 1.5.0 1844 | tslib: 2.8.1 1845 | 1846 | '@turf/line-offset@7.2.0': 1847 | dependencies: 1848 | '@turf/helpers': 7.2.0 1849 | '@turf/invariant': 7.2.0 1850 | '@turf/meta': 7.2.0 1851 | '@types/geojson': 7946.0.16 1852 | 1853 | '@turf/line-overlap@7.2.0': 1854 | dependencies: 1855 | '@turf/boolean-point-on-line': 7.2.0 1856 | '@turf/geojson-rbush': 7.2.0 1857 | '@turf/helpers': 7.2.0 1858 | '@turf/invariant': 7.2.0 1859 | '@turf/line-segment': 7.2.0 1860 | '@turf/meta': 7.2.0 1861 | '@turf/nearest-point-on-line': 7.2.0 1862 | '@types/geojson': 7946.0.16 1863 | fast-deep-equal: 3.1.3 1864 | tslib: 2.8.1 1865 | 1866 | '@turf/line-segment@7.2.0': 1867 | dependencies: 1868 | '@turf/helpers': 7.2.0 1869 | '@turf/invariant': 7.2.0 1870 | '@turf/meta': 7.2.0 1871 | '@types/geojson': 7946.0.16 1872 | tslib: 2.8.1 1873 | 1874 | '@turf/line-slice-along@7.2.0': 1875 | dependencies: 1876 | '@turf/bearing': 7.2.0 1877 | '@turf/destination': 7.2.0 1878 | '@turf/distance': 7.2.0 1879 | '@turf/helpers': 7.2.0 1880 | '@types/geojson': 7946.0.16 1881 | 1882 | '@turf/line-slice@7.2.0': 1883 | dependencies: 1884 | '@turf/helpers': 7.2.0 1885 | '@turf/invariant': 7.2.0 1886 | '@turf/nearest-point-on-line': 7.2.0 1887 | '@types/geojson': 7946.0.16 1888 | 1889 | '@turf/line-split@7.2.0': 1890 | dependencies: 1891 | '@turf/bbox': 7.2.0 1892 | '@turf/geojson-rbush': 7.2.0 1893 | '@turf/helpers': 7.2.0 1894 | '@turf/invariant': 7.2.0 1895 | '@turf/line-intersect': 7.2.0 1896 | '@turf/line-segment': 7.2.0 1897 | '@turf/meta': 7.2.0 1898 | '@turf/nearest-point-on-line': 7.2.0 1899 | '@turf/square': 7.2.0 1900 | '@turf/truncate': 7.2.0 1901 | '@types/geojson': 7946.0.16 1902 | 1903 | '@turf/line-to-polygon@7.2.0': 1904 | dependencies: 1905 | '@turf/bbox': 7.2.0 1906 | '@turf/clone': 7.2.0 1907 | '@turf/helpers': 7.2.0 1908 | '@turf/invariant': 7.2.0 1909 | '@types/geojson': 7946.0.16 1910 | tslib: 2.8.1 1911 | 1912 | '@turf/mask@7.2.0': 1913 | dependencies: 1914 | '@turf/clone': 7.2.0 1915 | '@turf/helpers': 7.2.0 1916 | '@types/geojson': 7946.0.16 1917 | polyclip-ts: 0.16.8 1918 | tslib: 2.8.1 1919 | 1920 | '@turf/meta@7.2.0': 1921 | dependencies: 1922 | '@turf/helpers': 7.2.0 1923 | '@types/geojson': 7946.0.16 1924 | 1925 | '@turf/midpoint@7.2.0': 1926 | dependencies: 1927 | '@turf/bearing': 7.2.0 1928 | '@turf/destination': 7.2.0 1929 | '@turf/distance': 7.2.0 1930 | '@turf/helpers': 7.2.0 1931 | '@types/geojson': 7946.0.16 1932 | tslib: 2.8.1 1933 | 1934 | '@turf/moran-index@7.2.0': 1935 | dependencies: 1936 | '@turf/distance-weight': 7.2.0 1937 | '@turf/helpers': 7.2.0 1938 | '@turf/meta': 7.2.0 1939 | '@types/geojson': 7946.0.16 1940 | tslib: 2.8.1 1941 | 1942 | '@turf/nearest-neighbor-analysis@7.2.0': 1943 | dependencies: 1944 | '@turf/area': 7.2.0 1945 | '@turf/bbox': 7.2.0 1946 | '@turf/bbox-polygon': 7.2.0 1947 | '@turf/centroid': 7.2.0 1948 | '@turf/distance': 7.2.0 1949 | '@turf/helpers': 7.2.0 1950 | '@turf/meta': 7.2.0 1951 | '@turf/nearest-point': 7.2.0 1952 | '@types/geojson': 7946.0.16 1953 | tslib: 2.8.1 1954 | 1955 | '@turf/nearest-point-on-line@7.2.0': 1956 | dependencies: 1957 | '@turf/distance': 7.2.0 1958 | '@turf/helpers': 7.2.0 1959 | '@turf/invariant': 7.2.0 1960 | '@turf/meta': 7.2.0 1961 | '@types/geojson': 7946.0.16 1962 | tslib: 2.8.1 1963 | 1964 | '@turf/nearest-point-to-line@7.2.0': 1965 | dependencies: 1966 | '@turf/helpers': 7.2.0 1967 | '@turf/invariant': 7.2.0 1968 | '@turf/meta': 7.2.0 1969 | '@turf/point-to-line-distance': 7.2.0 1970 | '@types/geojson': 7946.0.16 1971 | tslib: 2.8.1 1972 | 1973 | '@turf/nearest-point@7.2.0': 1974 | dependencies: 1975 | '@turf/clone': 7.2.0 1976 | '@turf/distance': 7.2.0 1977 | '@turf/helpers': 7.2.0 1978 | '@turf/meta': 7.2.0 1979 | '@types/geojson': 7946.0.16 1980 | tslib: 2.8.1 1981 | 1982 | '@turf/planepoint@7.2.0': 1983 | dependencies: 1984 | '@turf/helpers': 7.2.0 1985 | '@turf/invariant': 7.2.0 1986 | '@types/geojson': 7946.0.16 1987 | tslib: 2.8.1 1988 | 1989 | '@turf/point-grid@7.2.0': 1990 | dependencies: 1991 | '@turf/boolean-within': 7.2.0 1992 | '@turf/distance': 7.2.0 1993 | '@turf/helpers': 7.2.0 1994 | '@turf/invariant': 7.2.0 1995 | '@types/geojson': 7946.0.16 1996 | tslib: 2.8.1 1997 | 1998 | '@turf/point-on-feature@7.2.0': 1999 | dependencies: 2000 | '@turf/boolean-point-in-polygon': 7.2.0 2001 | '@turf/center': 7.2.0 2002 | '@turf/explode': 7.2.0 2003 | '@turf/helpers': 7.2.0 2004 | '@turf/nearest-point': 7.2.0 2005 | '@types/geojson': 7946.0.16 2006 | tslib: 2.8.1 2007 | 2008 | '@turf/point-to-line-distance@7.2.0': 2009 | dependencies: 2010 | '@turf/bearing': 7.2.0 2011 | '@turf/distance': 7.2.0 2012 | '@turf/helpers': 7.2.0 2013 | '@turf/invariant': 7.2.0 2014 | '@turf/meta': 7.2.0 2015 | '@turf/nearest-point-on-line': 7.2.0 2016 | '@turf/projection': 7.2.0 2017 | '@turf/rhumb-bearing': 7.2.0 2018 | '@turf/rhumb-distance': 7.2.0 2019 | '@types/geojson': 7946.0.16 2020 | tslib: 2.8.1 2021 | 2022 | '@turf/point-to-polygon-distance@7.2.0': 2023 | dependencies: 2024 | '@turf/boolean-point-in-polygon': 7.2.0 2025 | '@turf/helpers': 7.2.0 2026 | '@turf/invariant': 7.2.0 2027 | '@turf/meta': 7.2.0 2028 | '@turf/point-to-line-distance': 7.2.0 2029 | '@turf/polygon-to-line': 7.2.0 2030 | '@types/geojson': 7946.0.16 2031 | tslib: 2.8.1 2032 | 2033 | '@turf/points-within-polygon@7.2.0': 2034 | dependencies: 2035 | '@turf/boolean-point-in-polygon': 7.2.0 2036 | '@turf/helpers': 7.2.0 2037 | '@turf/meta': 7.2.0 2038 | '@types/geojson': 7946.0.16 2039 | tslib: 2.8.1 2040 | 2041 | '@turf/polygon-smooth@7.2.0': 2042 | dependencies: 2043 | '@turf/helpers': 7.2.0 2044 | '@turf/meta': 7.2.0 2045 | '@types/geojson': 7946.0.16 2046 | tslib: 2.8.1 2047 | 2048 | '@turf/polygon-tangents@7.2.0': 2049 | dependencies: 2050 | '@turf/bbox': 7.2.0 2051 | '@turf/boolean-within': 7.2.0 2052 | '@turf/explode': 7.2.0 2053 | '@turf/helpers': 7.2.0 2054 | '@turf/invariant': 7.2.0 2055 | '@turf/nearest-point': 7.2.0 2056 | '@types/geojson': 7946.0.16 2057 | tslib: 2.8.1 2058 | 2059 | '@turf/polygon-to-line@7.2.0': 2060 | dependencies: 2061 | '@turf/helpers': 7.2.0 2062 | '@turf/invariant': 7.2.0 2063 | '@types/geojson': 7946.0.16 2064 | tslib: 2.8.1 2065 | 2066 | '@turf/polygonize@7.2.0': 2067 | dependencies: 2068 | '@turf/boolean-point-in-polygon': 7.2.0 2069 | '@turf/envelope': 7.2.0 2070 | '@turf/helpers': 7.2.0 2071 | '@turf/invariant': 7.2.0 2072 | '@turf/meta': 7.2.0 2073 | '@types/geojson': 7946.0.16 2074 | tslib: 2.8.1 2075 | 2076 | '@turf/projection@7.2.0': 2077 | dependencies: 2078 | '@turf/clone': 7.2.0 2079 | '@turf/helpers': 7.2.0 2080 | '@turf/meta': 7.2.0 2081 | '@types/geojson': 7946.0.16 2082 | tslib: 2.8.1 2083 | 2084 | '@turf/quadrat-analysis@7.2.0': 2085 | dependencies: 2086 | '@turf/area': 7.2.0 2087 | '@turf/bbox': 7.2.0 2088 | '@turf/bbox-polygon': 7.2.0 2089 | '@turf/centroid': 7.2.0 2090 | '@turf/helpers': 7.2.0 2091 | '@turf/invariant': 7.2.0 2092 | '@turf/point-grid': 7.2.0 2093 | '@turf/random': 7.2.0 2094 | '@turf/square-grid': 7.2.0 2095 | '@types/geojson': 7946.0.16 2096 | tslib: 2.8.1 2097 | 2098 | '@turf/random@7.2.0': 2099 | dependencies: 2100 | '@turf/helpers': 7.2.0 2101 | '@types/geojson': 7946.0.16 2102 | tslib: 2.8.1 2103 | 2104 | '@turf/rectangle-grid@7.2.0': 2105 | dependencies: 2106 | '@turf/boolean-intersects': 7.2.0 2107 | '@turf/distance': 7.2.0 2108 | '@turf/helpers': 7.2.0 2109 | '@types/geojson': 7946.0.16 2110 | tslib: 2.8.1 2111 | 2112 | '@turf/rewind@7.2.0': 2113 | dependencies: 2114 | '@turf/boolean-clockwise': 7.2.0 2115 | '@turf/clone': 7.2.0 2116 | '@turf/helpers': 7.2.0 2117 | '@turf/invariant': 7.2.0 2118 | '@turf/meta': 7.2.0 2119 | '@types/geojson': 7946.0.16 2120 | tslib: 2.8.1 2121 | 2122 | '@turf/rhumb-bearing@7.2.0': 2123 | dependencies: 2124 | '@turf/helpers': 7.2.0 2125 | '@turf/invariant': 7.2.0 2126 | '@types/geojson': 7946.0.16 2127 | tslib: 2.8.1 2128 | 2129 | '@turf/rhumb-destination@7.2.0': 2130 | dependencies: 2131 | '@turf/helpers': 7.2.0 2132 | '@turf/invariant': 7.2.0 2133 | '@types/geojson': 7946.0.16 2134 | tslib: 2.8.1 2135 | 2136 | '@turf/rhumb-distance@7.2.0': 2137 | dependencies: 2138 | '@turf/helpers': 7.2.0 2139 | '@turf/invariant': 7.2.0 2140 | '@types/geojson': 7946.0.16 2141 | tslib: 2.8.1 2142 | 2143 | '@turf/sample@7.2.0': 2144 | dependencies: 2145 | '@turf/helpers': 7.2.0 2146 | '@types/geojson': 7946.0.16 2147 | tslib: 2.8.1 2148 | 2149 | '@turf/sector@7.2.0': 2150 | dependencies: 2151 | '@turf/circle': 7.2.0 2152 | '@turf/helpers': 7.2.0 2153 | '@turf/invariant': 7.2.0 2154 | '@turf/line-arc': 7.2.0 2155 | '@turf/meta': 7.2.0 2156 | '@types/geojson': 7946.0.16 2157 | tslib: 2.8.1 2158 | 2159 | '@turf/shortest-path@7.2.0': 2160 | dependencies: 2161 | '@turf/bbox': 7.2.0 2162 | '@turf/bbox-polygon': 7.2.0 2163 | '@turf/boolean-point-in-polygon': 7.2.0 2164 | '@turf/clean-coords': 7.2.0 2165 | '@turf/distance': 7.2.0 2166 | '@turf/helpers': 7.2.0 2167 | '@turf/invariant': 7.2.0 2168 | '@turf/meta': 7.2.0 2169 | '@turf/transform-scale': 7.2.0 2170 | '@types/geojson': 7946.0.16 2171 | tslib: 2.8.1 2172 | 2173 | '@turf/simplify@7.2.0': 2174 | dependencies: 2175 | '@turf/clean-coords': 7.2.0 2176 | '@turf/clone': 7.2.0 2177 | '@turf/helpers': 7.2.0 2178 | '@turf/meta': 7.2.0 2179 | '@types/geojson': 7946.0.16 2180 | tslib: 2.8.1 2181 | 2182 | '@turf/square-grid@7.2.0': 2183 | dependencies: 2184 | '@turf/helpers': 7.2.0 2185 | '@turf/rectangle-grid': 7.2.0 2186 | '@types/geojson': 7946.0.16 2187 | tslib: 2.8.1 2188 | 2189 | '@turf/square@7.2.0': 2190 | dependencies: 2191 | '@turf/distance': 7.2.0 2192 | '@turf/helpers': 7.2.0 2193 | '@types/geojson': 7946.0.16 2194 | tslib: 2.8.1 2195 | 2196 | '@turf/standard-deviational-ellipse@7.2.0': 2197 | dependencies: 2198 | '@turf/center-mean': 7.2.0 2199 | '@turf/ellipse': 7.2.0 2200 | '@turf/helpers': 7.2.0 2201 | '@turf/invariant': 7.2.0 2202 | '@turf/meta': 7.2.0 2203 | '@turf/points-within-polygon': 7.2.0 2204 | '@types/geojson': 7946.0.16 2205 | tslib: 2.8.1 2206 | 2207 | '@turf/tag@7.2.0': 2208 | dependencies: 2209 | '@turf/boolean-point-in-polygon': 7.2.0 2210 | '@turf/clone': 7.2.0 2211 | '@turf/helpers': 7.2.0 2212 | '@turf/meta': 7.2.0 2213 | '@types/geojson': 7946.0.16 2214 | tslib: 2.8.1 2215 | 2216 | '@turf/tesselate@7.2.0': 2217 | dependencies: 2218 | '@turf/helpers': 7.2.0 2219 | '@types/geojson': 7946.0.16 2220 | earcut: 2.2.4 2221 | tslib: 2.8.1 2222 | 2223 | '@turf/tin@7.2.0': 2224 | dependencies: 2225 | '@turf/helpers': 7.2.0 2226 | '@types/geojson': 7946.0.16 2227 | tslib: 2.8.1 2228 | 2229 | '@turf/transform-rotate@7.2.0': 2230 | dependencies: 2231 | '@turf/centroid': 7.2.0 2232 | '@turf/clone': 7.2.0 2233 | '@turf/helpers': 7.2.0 2234 | '@turf/invariant': 7.2.0 2235 | '@turf/meta': 7.2.0 2236 | '@turf/rhumb-bearing': 7.2.0 2237 | '@turf/rhumb-destination': 7.2.0 2238 | '@turf/rhumb-distance': 7.2.0 2239 | '@types/geojson': 7946.0.16 2240 | tslib: 2.8.1 2241 | 2242 | '@turf/transform-scale@7.2.0': 2243 | dependencies: 2244 | '@turf/bbox': 7.2.0 2245 | '@turf/center': 7.2.0 2246 | '@turf/centroid': 7.2.0 2247 | '@turf/clone': 7.2.0 2248 | '@turf/helpers': 7.2.0 2249 | '@turf/invariant': 7.2.0 2250 | '@turf/meta': 7.2.0 2251 | '@turf/rhumb-bearing': 7.2.0 2252 | '@turf/rhumb-destination': 7.2.0 2253 | '@turf/rhumb-distance': 7.2.0 2254 | '@types/geojson': 7946.0.16 2255 | tslib: 2.8.1 2256 | 2257 | '@turf/transform-translate@7.2.0': 2258 | dependencies: 2259 | '@turf/clone': 7.2.0 2260 | '@turf/helpers': 7.2.0 2261 | '@turf/invariant': 7.2.0 2262 | '@turf/meta': 7.2.0 2263 | '@turf/rhumb-destination': 7.2.0 2264 | '@types/geojson': 7946.0.16 2265 | tslib: 2.8.1 2266 | 2267 | '@turf/triangle-grid@7.2.0': 2268 | dependencies: 2269 | '@turf/distance': 7.2.0 2270 | '@turf/helpers': 7.2.0 2271 | '@turf/intersect': 7.2.0 2272 | '@types/geojson': 7946.0.16 2273 | tslib: 2.8.1 2274 | 2275 | '@turf/truncate@7.2.0': 2276 | dependencies: 2277 | '@turf/helpers': 7.2.0 2278 | '@turf/meta': 7.2.0 2279 | '@types/geojson': 7946.0.16 2280 | tslib: 2.8.1 2281 | 2282 | '@turf/turf@7.2.0': 2283 | dependencies: 2284 | '@turf/along': 7.2.0 2285 | '@turf/angle': 7.2.0 2286 | '@turf/area': 7.2.0 2287 | '@turf/bbox': 7.2.0 2288 | '@turf/bbox-clip': 7.2.0 2289 | '@turf/bbox-polygon': 7.2.0 2290 | '@turf/bearing': 7.2.0 2291 | '@turf/bezier-spline': 7.2.0 2292 | '@turf/boolean-clockwise': 7.2.0 2293 | '@turf/boolean-concave': 7.2.0 2294 | '@turf/boolean-contains': 7.2.0 2295 | '@turf/boolean-crosses': 7.2.0 2296 | '@turf/boolean-disjoint': 7.2.0 2297 | '@turf/boolean-equal': 7.2.0 2298 | '@turf/boolean-intersects': 7.2.0 2299 | '@turf/boolean-overlap': 7.2.0 2300 | '@turf/boolean-parallel': 7.2.0 2301 | '@turf/boolean-point-in-polygon': 7.2.0 2302 | '@turf/boolean-point-on-line': 7.2.0 2303 | '@turf/boolean-touches': 7.2.0 2304 | '@turf/boolean-valid': 7.2.0 2305 | '@turf/boolean-within': 7.2.0 2306 | '@turf/buffer': 7.2.0 2307 | '@turf/center': 7.2.0 2308 | '@turf/center-mean': 7.2.0 2309 | '@turf/center-median': 7.2.0 2310 | '@turf/center-of-mass': 7.2.0 2311 | '@turf/centroid': 7.2.0 2312 | '@turf/circle': 7.2.0 2313 | '@turf/clean-coords': 7.2.0 2314 | '@turf/clone': 7.2.0 2315 | '@turf/clusters': 7.2.0 2316 | '@turf/clusters-dbscan': 7.2.0 2317 | '@turf/clusters-kmeans': 7.2.0 2318 | '@turf/collect': 7.2.0 2319 | '@turf/combine': 7.2.0 2320 | '@turf/concave': 7.2.0 2321 | '@turf/convex': 7.2.0 2322 | '@turf/destination': 7.2.0 2323 | '@turf/difference': 7.2.0 2324 | '@turf/dissolve': 7.2.0 2325 | '@turf/distance': 7.2.0 2326 | '@turf/distance-weight': 7.2.0 2327 | '@turf/ellipse': 7.2.0 2328 | '@turf/envelope': 7.2.0 2329 | '@turf/explode': 7.2.0 2330 | '@turf/flatten': 7.2.0 2331 | '@turf/flip': 7.2.0 2332 | '@turf/geojson-rbush': 7.2.0 2333 | '@turf/great-circle': 7.2.0 2334 | '@turf/helpers': 7.2.0 2335 | '@turf/hex-grid': 7.2.0 2336 | '@turf/interpolate': 7.2.0 2337 | '@turf/intersect': 7.2.0 2338 | '@turf/invariant': 7.2.0 2339 | '@turf/isobands': 7.2.0 2340 | '@turf/isolines': 7.2.0 2341 | '@turf/kinks': 7.2.0 2342 | '@turf/length': 7.2.0 2343 | '@turf/line-arc': 7.2.0 2344 | '@turf/line-chunk': 7.2.0 2345 | '@turf/line-intersect': 7.2.0 2346 | '@turf/line-offset': 7.2.0 2347 | '@turf/line-overlap': 7.2.0 2348 | '@turf/line-segment': 7.2.0 2349 | '@turf/line-slice': 7.2.0 2350 | '@turf/line-slice-along': 7.2.0 2351 | '@turf/line-split': 7.2.0 2352 | '@turf/line-to-polygon': 7.2.0 2353 | '@turf/mask': 7.2.0 2354 | '@turf/meta': 7.2.0 2355 | '@turf/midpoint': 7.2.0 2356 | '@turf/moran-index': 7.2.0 2357 | '@turf/nearest-neighbor-analysis': 7.2.0 2358 | '@turf/nearest-point': 7.2.0 2359 | '@turf/nearest-point-on-line': 7.2.0 2360 | '@turf/nearest-point-to-line': 7.2.0 2361 | '@turf/planepoint': 7.2.0 2362 | '@turf/point-grid': 7.2.0 2363 | '@turf/point-on-feature': 7.2.0 2364 | '@turf/point-to-line-distance': 7.2.0 2365 | '@turf/point-to-polygon-distance': 7.2.0 2366 | '@turf/points-within-polygon': 7.2.0 2367 | '@turf/polygon-smooth': 7.2.0 2368 | '@turf/polygon-tangents': 7.2.0 2369 | '@turf/polygon-to-line': 7.2.0 2370 | '@turf/polygonize': 7.2.0 2371 | '@turf/projection': 7.2.0 2372 | '@turf/quadrat-analysis': 7.2.0 2373 | '@turf/random': 7.2.0 2374 | '@turf/rectangle-grid': 7.2.0 2375 | '@turf/rewind': 7.2.0 2376 | '@turf/rhumb-bearing': 7.2.0 2377 | '@turf/rhumb-destination': 7.2.0 2378 | '@turf/rhumb-distance': 7.2.0 2379 | '@turf/sample': 7.2.0 2380 | '@turf/sector': 7.2.0 2381 | '@turf/shortest-path': 7.2.0 2382 | '@turf/simplify': 7.2.0 2383 | '@turf/square': 7.2.0 2384 | '@turf/square-grid': 7.2.0 2385 | '@turf/standard-deviational-ellipse': 7.2.0 2386 | '@turf/tag': 7.2.0 2387 | '@turf/tesselate': 7.2.0 2388 | '@turf/tin': 7.2.0 2389 | '@turf/transform-rotate': 7.2.0 2390 | '@turf/transform-scale': 7.2.0 2391 | '@turf/transform-translate': 7.2.0 2392 | '@turf/triangle-grid': 7.2.0 2393 | '@turf/truncate': 7.2.0 2394 | '@turf/union': 7.2.0 2395 | '@turf/unkink-polygon': 7.2.0 2396 | '@turf/voronoi': 7.2.0 2397 | '@types/geojson': 7946.0.16 2398 | tslib: 2.8.1 2399 | 2400 | '@turf/union@7.2.0': 2401 | dependencies: 2402 | '@turf/helpers': 7.2.0 2403 | '@turf/meta': 7.2.0 2404 | '@types/geojson': 7946.0.16 2405 | polyclip-ts: 0.16.8 2406 | tslib: 2.8.1 2407 | 2408 | '@turf/unkink-polygon@7.2.0': 2409 | dependencies: 2410 | '@turf/area': 7.2.0 2411 | '@turf/boolean-point-in-polygon': 7.2.0 2412 | '@turf/helpers': 7.2.0 2413 | '@turf/meta': 7.2.0 2414 | '@types/geojson': 7946.0.16 2415 | rbush: 3.0.1 2416 | tslib: 2.8.1 2417 | 2418 | '@turf/voronoi@7.2.0': 2419 | dependencies: 2420 | '@turf/clone': 7.2.0 2421 | '@turf/helpers': 7.2.0 2422 | '@turf/invariant': 7.2.0 2423 | '@types/d3-voronoi': 1.1.12 2424 | '@types/geojson': 7946.0.16 2425 | d3-voronoi: 1.1.2 2426 | tslib: 2.8.1 2427 | 2428 | '@tweenjs/tween.js@23.1.3': {} 2429 | 2430 | '@types/d3-voronoi@1.1.12': {} 2431 | 2432 | '@types/estree@1.0.6': {} 2433 | 2434 | '@types/geojson@7946.0.16': {} 2435 | 2436 | '@types/linkify-it@5.0.0': {} 2437 | 2438 | '@types/markdown-it@14.1.2': 2439 | dependencies: 2440 | '@types/linkify-it': 5.0.0 2441 | '@types/mdurl': 2.0.0 2442 | 2443 | '@types/mdurl@2.0.0': {} 2444 | 2445 | '@types/node@22.13.0': 2446 | dependencies: 2447 | undici-types: 6.20.0 2448 | 2449 | '@types/stats.js@0.17.3': {} 2450 | 2451 | '@types/three@0.173.0': 2452 | dependencies: 2453 | '@tweenjs/tween.js': 23.1.3 2454 | '@types/stats.js': 0.17.3 2455 | '@types/webxr': 0.5.21 2456 | '@webgpu/types': 0.1.54 2457 | fflate: 0.8.2 2458 | meshoptimizer: 0.18.1 2459 | 2460 | '@types/webxr@0.5.21': {} 2461 | 2462 | '@webgpu/types@0.1.54': {} 2463 | 2464 | JSONStream@1.3.5: 2465 | dependencies: 2466 | jsonparse: 1.3.1 2467 | through: 2.3.8 2468 | 2469 | acorn-jsx@5.3.2(acorn@8.14.0): 2470 | dependencies: 2471 | acorn: 8.14.0 2472 | 2473 | acorn@8.14.0: {} 2474 | 2475 | ansi-styles@4.3.0: 2476 | dependencies: 2477 | color-convert: 2.0.1 2478 | 2479 | argparse@2.0.1: {} 2480 | 2481 | balanced-match@1.0.2: {} 2482 | 2483 | bignumber.js@9.1.2: {} 2484 | 2485 | bluebird@3.7.2: {} 2486 | 2487 | brace-expansion@2.0.1: 2488 | dependencies: 2489 | balanced-match: 1.0.2 2490 | 2491 | catharsis@0.9.0: 2492 | dependencies: 2493 | lodash: 4.17.21 2494 | 2495 | chalk@4.1.2: 2496 | dependencies: 2497 | ansi-styles: 4.3.0 2498 | supports-color: 7.2.0 2499 | 2500 | color-convert@2.0.1: 2501 | dependencies: 2502 | color-name: 1.1.4 2503 | 2504 | color-name@1.1.4: {} 2505 | 2506 | commander@2.20.3: {} 2507 | 2508 | concaveman@1.2.1: 2509 | dependencies: 2510 | point-in-polygon: 1.1.0 2511 | rbush: 3.0.1 2512 | robust-predicates: 2.0.4 2513 | tinyqueue: 2.0.3 2514 | 2515 | d3-array@1.2.4: {} 2516 | 2517 | d3-geo@1.7.1: 2518 | dependencies: 2519 | d3-array: 1.2.4 2520 | 2521 | d3-voronoi@1.1.2: {} 2522 | 2523 | deep-is@0.1.4: {} 2524 | 2525 | earcut@2.2.4: {} 2526 | 2527 | entities@4.5.0: {} 2528 | 2529 | esbuild@0.24.2: 2530 | optionalDependencies: 2531 | '@esbuild/aix-ppc64': 0.24.2 2532 | '@esbuild/android-arm': 0.24.2 2533 | '@esbuild/android-arm64': 0.24.2 2534 | '@esbuild/android-x64': 0.24.2 2535 | '@esbuild/darwin-arm64': 0.24.2 2536 | '@esbuild/darwin-x64': 0.24.2 2537 | '@esbuild/freebsd-arm64': 0.24.2 2538 | '@esbuild/freebsd-x64': 0.24.2 2539 | '@esbuild/linux-arm': 0.24.2 2540 | '@esbuild/linux-arm64': 0.24.2 2541 | '@esbuild/linux-ia32': 0.24.2 2542 | '@esbuild/linux-loong64': 0.24.2 2543 | '@esbuild/linux-mips64el': 0.24.2 2544 | '@esbuild/linux-ppc64': 0.24.2 2545 | '@esbuild/linux-riscv64': 0.24.2 2546 | '@esbuild/linux-s390x': 0.24.2 2547 | '@esbuild/linux-x64': 0.24.2 2548 | '@esbuild/netbsd-arm64': 0.24.2 2549 | '@esbuild/netbsd-x64': 0.24.2 2550 | '@esbuild/openbsd-arm64': 0.24.2 2551 | '@esbuild/openbsd-x64': 0.24.2 2552 | '@esbuild/sunos-x64': 0.24.2 2553 | '@esbuild/win32-arm64': 0.24.2 2554 | '@esbuild/win32-ia32': 0.24.2 2555 | '@esbuild/win32-x64': 0.24.2 2556 | 2557 | escape-string-regexp@2.0.0: {} 2558 | 2559 | escodegen@1.14.3: 2560 | dependencies: 2561 | esprima: 4.0.1 2562 | estraverse: 4.3.0 2563 | esutils: 2.0.3 2564 | optionator: 0.8.3 2565 | optionalDependencies: 2566 | source-map: 0.6.1 2567 | 2568 | eslint-visitor-keys@3.4.3: {} 2569 | 2570 | espree@9.6.1: 2571 | dependencies: 2572 | acorn: 8.14.0 2573 | acorn-jsx: 5.3.2(acorn@8.14.0) 2574 | eslint-visitor-keys: 3.4.3 2575 | 2576 | esprima@4.0.1: {} 2577 | 2578 | estraverse@4.3.0: {} 2579 | 2580 | estraverse@5.3.0: {} 2581 | 2582 | esutils@2.0.3: {} 2583 | 2584 | fast-deep-equal@3.1.3: {} 2585 | 2586 | fast-levenshtein@2.0.6: {} 2587 | 2588 | fflate@0.8.2: {} 2589 | 2590 | fs.realpath@1.0.0: {} 2591 | 2592 | fsevents@2.3.3: 2593 | optional: true 2594 | 2595 | geojson-equality-ts@1.0.2: 2596 | dependencies: 2597 | '@types/geojson': 7946.0.16 2598 | 2599 | geojson-polygon-self-intersections@1.2.1: 2600 | dependencies: 2601 | rbush: 2.0.2 2602 | 2603 | geojson-stream@0.1.0: 2604 | dependencies: 2605 | JSONStream: 1.3.5 2606 | through: 2.3.8 2607 | 2608 | glob@8.1.0: 2609 | dependencies: 2610 | fs.realpath: 1.0.0 2611 | inflight: 1.0.6 2612 | inherits: 2.0.4 2613 | minimatch: 5.1.6 2614 | once: 1.4.0 2615 | 2616 | graceful-fs@4.2.11: {} 2617 | 2618 | has-flag@4.0.0: {} 2619 | 2620 | inflight@1.0.6: 2621 | dependencies: 2622 | once: 1.4.0 2623 | wrappy: 1.0.2 2624 | 2625 | inherits@2.0.4: {} 2626 | 2627 | js2xmlparser@4.0.2: 2628 | dependencies: 2629 | xmlcreate: 2.0.4 2630 | 2631 | jsdoc@4.0.4: 2632 | dependencies: 2633 | '@babel/parser': 7.26.7 2634 | '@jsdoc/salty': 0.2.9 2635 | '@types/markdown-it': 14.1.2 2636 | bluebird: 3.7.2 2637 | catharsis: 0.9.0 2638 | escape-string-regexp: 2.0.0 2639 | js2xmlparser: 4.0.2 2640 | klaw: 3.0.0 2641 | markdown-it: 14.1.0 2642 | markdown-it-anchor: 8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0) 2643 | marked: 4.3.0 2644 | mkdirp: 1.0.4 2645 | requizzle: 0.2.4 2646 | strip-json-comments: 3.1.1 2647 | underscore: 1.13.7 2648 | 2649 | jsonparse@1.3.1: {} 2650 | 2651 | jsts@2.7.1: {} 2652 | 2653 | klaw@3.0.0: 2654 | dependencies: 2655 | graceful-fs: 4.2.11 2656 | 2657 | levn@0.3.0: 2658 | dependencies: 2659 | prelude-ls: 1.1.2 2660 | type-check: 0.3.2 2661 | 2662 | linkify-it@5.0.0: 2663 | dependencies: 2664 | uc.micro: 2.1.0 2665 | 2666 | lodash@4.17.21: {} 2667 | 2668 | long@5.2.4: {} 2669 | 2670 | marchingsquares@1.3.3: {} 2671 | 2672 | markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0): 2673 | dependencies: 2674 | '@types/markdown-it': 14.1.2 2675 | markdown-it: 14.1.0 2676 | 2677 | markdown-it@14.1.0: 2678 | dependencies: 2679 | argparse: 2.0.1 2680 | entities: 4.5.0 2681 | linkify-it: 5.0.0 2682 | mdurl: 2.0.0 2683 | punycode.js: 2.3.1 2684 | uc.micro: 2.1.0 2685 | 2686 | marked@4.3.0: {} 2687 | 2688 | mdurl@2.0.0: {} 2689 | 2690 | meshoptimizer@0.18.1: {} 2691 | 2692 | minimatch@5.1.6: 2693 | dependencies: 2694 | brace-expansion: 2.0.1 2695 | 2696 | minimist@1.2.8: {} 2697 | 2698 | mkdirp@1.0.4: {} 2699 | 2700 | nanoid@3.3.8: {} 2701 | 2702 | once@1.4.0: 2703 | dependencies: 2704 | wrappy: 1.0.2 2705 | 2706 | optionator@0.8.3: 2707 | dependencies: 2708 | deep-is: 0.1.4 2709 | fast-levenshtein: 2.0.6 2710 | levn: 0.3.0 2711 | prelude-ls: 1.1.2 2712 | type-check: 0.3.2 2713 | word-wrap: 1.2.5 2714 | 2715 | picocolors@1.1.1: {} 2716 | 2717 | point-in-polygon-hao@1.2.4: 2718 | dependencies: 2719 | robust-predicates: 3.0.2 2720 | 2721 | point-in-polygon@1.1.0: {} 2722 | 2723 | polyclip-ts@0.16.8: 2724 | dependencies: 2725 | bignumber.js: 9.1.2 2726 | splaytree-ts: 1.0.2 2727 | 2728 | postcss@8.5.1: 2729 | dependencies: 2730 | nanoid: 3.3.8 2731 | picocolors: 1.1.1 2732 | source-map-js: 1.2.1 2733 | 2734 | prelude-ls@1.1.2: {} 2735 | 2736 | protobufjs-cli@1.1.3(protobufjs@7.4.0): 2737 | dependencies: 2738 | chalk: 4.1.2 2739 | escodegen: 1.14.3 2740 | espree: 9.6.1 2741 | estraverse: 5.3.0 2742 | glob: 8.1.0 2743 | jsdoc: 4.0.4 2744 | minimist: 1.2.8 2745 | protobufjs: 7.4.0 2746 | semver: 7.7.0 2747 | tmp: 0.2.3 2748 | uglify-js: 3.19.3 2749 | 2750 | protobufjs@7.4.0: 2751 | dependencies: 2752 | '@protobufjs/aspromise': 1.1.2 2753 | '@protobufjs/base64': 1.1.2 2754 | '@protobufjs/codegen': 2.0.4 2755 | '@protobufjs/eventemitter': 1.1.0 2756 | '@protobufjs/fetch': 1.1.0 2757 | '@protobufjs/float': 1.0.2 2758 | '@protobufjs/inquire': 1.1.0 2759 | '@protobufjs/path': 1.1.2 2760 | '@protobufjs/pool': 1.1.0 2761 | '@protobufjs/utf8': 1.1.0 2762 | '@types/node': 22.13.0 2763 | long: 5.2.4 2764 | 2765 | punycode.js@2.3.1: {} 2766 | 2767 | quickselect@1.1.1: {} 2768 | 2769 | quickselect@2.0.0: {} 2770 | 2771 | rbush@2.0.2: 2772 | dependencies: 2773 | quickselect: 1.1.1 2774 | 2775 | rbush@3.0.1: 2776 | dependencies: 2777 | quickselect: 2.0.0 2778 | 2779 | requizzle@0.2.4: 2780 | dependencies: 2781 | lodash: 4.17.21 2782 | 2783 | robust-predicates@2.0.4: {} 2784 | 2785 | robust-predicates@3.0.2: {} 2786 | 2787 | rollup@4.34.0: 2788 | dependencies: 2789 | '@types/estree': 1.0.6 2790 | optionalDependencies: 2791 | '@rollup/rollup-android-arm-eabi': 4.34.0 2792 | '@rollup/rollup-android-arm64': 4.34.0 2793 | '@rollup/rollup-darwin-arm64': 4.34.0 2794 | '@rollup/rollup-darwin-x64': 4.34.0 2795 | '@rollup/rollup-freebsd-arm64': 4.34.0 2796 | '@rollup/rollup-freebsd-x64': 4.34.0 2797 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.0 2798 | '@rollup/rollup-linux-arm-musleabihf': 4.34.0 2799 | '@rollup/rollup-linux-arm64-gnu': 4.34.0 2800 | '@rollup/rollup-linux-arm64-musl': 4.34.0 2801 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.0 2802 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.0 2803 | '@rollup/rollup-linux-riscv64-gnu': 4.34.0 2804 | '@rollup/rollup-linux-s390x-gnu': 4.34.0 2805 | '@rollup/rollup-linux-x64-gnu': 4.34.0 2806 | '@rollup/rollup-linux-x64-musl': 4.34.0 2807 | '@rollup/rollup-win32-arm64-msvc': 4.34.0 2808 | '@rollup/rollup-win32-ia32-msvc': 4.34.0 2809 | '@rollup/rollup-win32-x64-msvc': 4.34.0 2810 | fsevents: 2.3.3 2811 | 2812 | semver@7.7.0: {} 2813 | 2814 | skmeans@0.9.7: {} 2815 | 2816 | source-map-js@1.2.1: {} 2817 | 2818 | source-map@0.6.1: 2819 | optional: true 2820 | 2821 | splaytree-ts@1.0.2: {} 2822 | 2823 | strip-json-comments@3.1.1: {} 2824 | 2825 | supports-color@7.2.0: 2826 | dependencies: 2827 | has-flag: 4.0.0 2828 | 2829 | sweepline-intersections@1.5.0: 2830 | dependencies: 2831 | tinyqueue: 2.0.3 2832 | 2833 | three@0.173.0: {} 2834 | 2835 | through@2.3.8: {} 2836 | 2837 | tinyqueue@2.0.3: {} 2838 | 2839 | tmp@0.2.3: {} 2840 | 2841 | topojson-client@3.1.0: 2842 | dependencies: 2843 | commander: 2.20.3 2844 | 2845 | topojson-server@3.0.1: 2846 | dependencies: 2847 | commander: 2.20.3 2848 | 2849 | tslib@2.8.1: {} 2850 | 2851 | type-check@0.3.2: 2852 | dependencies: 2853 | prelude-ls: 1.1.2 2854 | 2855 | typescript@5.7.3: {} 2856 | 2857 | uc.micro@2.1.0: {} 2858 | 2859 | uglify-js@3.19.3: {} 2860 | 2861 | underscore@1.13.7: {} 2862 | 2863 | undici-types@6.20.0: {} 2864 | 2865 | vite@6.0.11(@types/node@22.13.0): 2866 | dependencies: 2867 | esbuild: 0.24.2 2868 | postcss: 8.5.1 2869 | rollup: 4.34.0 2870 | optionalDependencies: 2871 | '@types/node': 22.13.0 2872 | fsevents: 2.3.3 2873 | 2874 | word-wrap@1.2.5: {} 2875 | 2876 | wrappy@1.0.2: {} 2877 | 2878 | xmlcreate@2.0.4: {} 2879 | -------------------------------------------------------------------------------- /src/core/Input.ts: -------------------------------------------------------------------------------- 1 | import { 2 | EventDispatcher, 3 | PerspectiveCamera, 4 | Vector2, 5 | Vector3, 6 | } from 'three'; 7 | 8 | export class Input extends EventDispatcher<{ button: { button: number }; }> { 9 | private readonly desktop: { 10 | isLocked: boolean; 11 | isRunning: boolean; 12 | look: Vector2; 13 | movement: Vector3; 14 | }; 15 | private readonly gamepad: { 16 | index: number; 17 | read: boolean[]; 18 | state: boolean[]; 19 | }; 20 | private isLocked: boolean; 21 | private readonly target: HTMLElement; 22 | private speed: number; 23 | 24 | constructor(target: HTMLElement) { 25 | super(); 26 | this.desktop = { 27 | isLocked: false, 28 | isRunning: false, 29 | look: new Vector2(), 30 | movement: new Vector3(), 31 | }; 32 | this.gamepad = { 33 | index: -1, 34 | read: [], 35 | state: [], 36 | }; 37 | this.isLocked = false; 38 | this.target = target; 39 | this.speed = 1000; 40 | window.addEventListener('gamepadconnected', this.gamepadconnected.bind(this)); 41 | window.addEventListener('gamepaddisconnected', this.gamepaddisconnected.bind(this)); 42 | target.addEventListener('pointerdown', this.pointerdown.bind(this)); 43 | document.addEventListener('pointermove', this.pointermove.bind(this)); 44 | document.addEventListener('keydown', this.keydown.bind(this)); 45 | document.addEventListener('keyup', this.keyup.bind(this)); 46 | document.addEventListener('pointerlockchange', this.pointerlock.bind(this)); 47 | document.addEventListener('wheel', this.wheel.bind(this)); 48 | } 49 | 50 | getLook(look: Vector2, delta: number) { 51 | const { desktop, gamepad } = this; 52 | look.set(0, 0); 53 | if (desktop.isLocked) { 54 | look.copy(desktop.look).multiplyScalar(0.003); 55 | desktop.look.set(0, 0); 56 | } 57 | if (gamepad.index !== -1) { 58 | const { axes } = navigator.getGamepads()[gamepad.index]!; 59 | if (Math.max(Math.abs(axes[2]), Math.abs(axes[3])) > 0.1) { 60 | look.set(-axes[2], axes[3]).multiplyScalar(delta * 1.5); 61 | this.setLock(true); 62 | } 63 | } 64 | } 65 | 66 | private static readonly _movement = new Vector3(); 67 | private static readonly _forward = new Vector3(); 68 | private static readonly _right = new Vector3(); 69 | private static readonly _worldUp = new Vector3(0, 1, 0); 70 | 71 | getMovement(camera: PerspectiveCamera, movement: Vector3) { 72 | const { desktop, gamepad } = this; 73 | const { _movement, _forward, _right, _worldUp } = Input; 74 | _movement.set(0, 0, 0); 75 | if (desktop.isLocked) { 76 | _movement.copy(desktop.movement); 77 | } 78 | if (gamepad.index !== -1) { 79 | const { axes, buttons } = navigator.getGamepads()[gamepad.index]!; 80 | [0, 3, 4, 5, 6, 7, 10].forEach((button) => { 81 | const pressed = buttons[button]?.pressed; 82 | if (gamepad.read[button] !== pressed) { 83 | gamepad.read[button] = pressed; 84 | gamepad.state[button] = pressed; 85 | // @hack 86 | if (pressed && (button === 3 || button === 6 || button === 7)) { 87 | this.dispatchEvent({ type: 'button', button: { 7: 1, 6: 2, 3: 4 }[button] }); 88 | } 89 | } 90 | }); 91 | if (Math.max(Math.abs(axes[0]), Math.abs(axes[1])) > 0.1 || gamepad.state[0]) { 92 | _movement.set( 93 | axes[0], 94 | gamepad.state[0] ? 1 : 0, 95 | -axes[1] 96 | ); 97 | this.setLock(true); 98 | } 99 | } 100 | camera.getWorldDirection(_forward); 101 | _forward.normalize(); 102 | _right.crossVectors(_forward, _worldUp).normalize(); 103 | movement 104 | .set(0, 0, 0) 105 | .addScaledVector(_right, _movement.x) 106 | .addScaledVector(_worldUp, _movement.y) 107 | .addScaledVector(_forward, _movement.z); 108 | const length = movement.length(); 109 | if (length > 1) { 110 | movement.divideScalar(length); 111 | } 112 | } 113 | 114 | getRunning() { 115 | const { desktop, gamepad } = this; 116 | return desktop.isRunning || (gamepad.index !== -1 && gamepad.state[10]); 117 | } 118 | 119 | private static readonly minSpeed = Math.log(100); 120 | private static readonly maxSpeed = Math.log(5000); 121 | private static readonly speedRange = Input.maxSpeed - Input.minSpeed; 122 | getSpeed() { 123 | return this.speed; 124 | } 125 | 126 | private gamepadconnected({ gamepad: { index } }: GamepadEvent) { 127 | const { gamepad } = this; 128 | gamepad.index = index; 129 | } 130 | 131 | private gamepaddisconnected({ gamepad: { index } }: GamepadEvent) { 132 | const { gamepad } = this; 133 | if (gamepad.index === index) { 134 | gamepad.index = -1; 135 | gamepad.read.length = 0; 136 | gamepad.state.length = 0; 137 | this.setLock(false); 138 | } 139 | } 140 | 141 | private keydown({ code, repeat }: KeyboardEvent) { 142 | const { desktop } = this; 143 | if (!desktop.isLocked || repeat) { 144 | return; 145 | } 146 | switch (code) { 147 | case 'KeyW': 148 | desktop.movement.z = 1; 149 | break; 150 | case 'KeyS': 151 | desktop.movement.z = -1; 152 | break; 153 | case 'KeyA': 154 | desktop.movement.x = -1; 155 | break; 156 | case 'KeyD': 157 | desktop.movement.x = 1; 158 | break; 159 | case 'Space': 160 | desktop.movement.y = 1; 161 | break; 162 | case 'ShiftLeft': 163 | case 'ShiftRight': 164 | desktop.isRunning = true; 165 | break; 166 | default: 167 | break; 168 | } 169 | } 170 | 171 | private keyup({ code }: KeyboardEvent) { 172 | const { desktop } = this; 173 | if (!desktop.isLocked) { 174 | return; 175 | } 176 | switch (code) { 177 | case 'KeyW': 178 | if (desktop.movement.z > 0) desktop.movement.z = 0; 179 | break; 180 | case 'KeyS': 181 | if (desktop.movement.z < 0) desktop.movement.z = 0; 182 | break; 183 | case 'KeyA': 184 | if (desktop.movement.x < 0) desktop.movement.x = 0; 185 | break; 186 | case 'KeyD': 187 | if (desktop.movement.x > 0) desktop.movement.x = 0; 188 | break; 189 | case 'Space': 190 | desktop.movement.y = 0; 191 | break; 192 | case 'ShiftLeft': 193 | case 'ShiftRight': 194 | desktop.isRunning = false; 195 | break; 196 | default: 197 | break; 198 | } 199 | } 200 | 201 | private pointerlock() { 202 | const { desktop } = this; 203 | desktop.isLocked = !!document.pointerLockElement; 204 | desktop.isRunning = false; 205 | desktop.look.set(0, 0); 206 | desktop.movement.set(0, 0, 0); 207 | this.setLock(desktop.isLocked); 208 | } 209 | 210 | private pointerdown(e: PointerEvent) { 211 | const { desktop, target } = this; 212 | if (!desktop.isLocked) { 213 | target.requestPointerLock(); 214 | return; 215 | } 216 | this.dispatchEvent({ type: 'button', button: e.buttons }); 217 | } 218 | 219 | private pointermove(e: PointerEvent) { 220 | const { desktop } = this; 221 | if (!desktop.isLocked) { 222 | this.setLock(false); 223 | return; 224 | } 225 | desktop.look.x -= e.movementX; 226 | desktop.look.y -= e.movementY; 227 | } 228 | 229 | private wheel({ deltaY }: WheelEvent) { 230 | const { speed, isLocked } = this; 231 | if (!isLocked) { 232 | return; 233 | } 234 | const { minSpeed, speedRange } = Input; 235 | const logSpeed = Math.min( 236 | Math.max( 237 | ((Math.log(speed) - minSpeed) / speedRange) - (-deltaY * 0.0003), 238 | 0 239 | ), 240 | 1 241 | ); 242 | this.speed = Math.exp(minSpeed + logSpeed * speedRange); 243 | } 244 | 245 | private setLock(locked: boolean) { 246 | if (this.isLocked === locked) { 247 | return; 248 | } 249 | this.isLocked = locked; 250 | document.body.classList[locked ? 'add' : 'remove']('inputlock'); 251 | } 252 | } 253 | -------------------------------------------------------------------------------- /src/core/Viewport.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Clock, 3 | PerspectiveCamera, 4 | ShaderChunk, 5 | Scene, 6 | WebGLRenderer, 7 | } from 'three'; 8 | 9 | ShaderChunk.fog_pars_vertex = /* glsl */` 10 | #ifdef USE_FOG 11 | varying vec3 vFogPosition; 12 | #endif 13 | `; 14 | ShaderChunk.fog_pars_fragment = /* glsl */` 15 | #ifdef USE_FOG 16 | uniform vec3 fogColor; 17 | varying vec3 vFogPosition; 18 | #ifdef FOG_EXP2 19 | uniform float fogDensity; 20 | #else 21 | uniform float fogNear; 22 | uniform float fogFar; 23 | #endif 24 | #endif 25 | `; 26 | ShaderChunk.fog_vertex = /* glsl */` 27 | #ifdef USE_FOG 28 | vFogPosition = mvPosition.xyz; 29 | #endif 30 | `; 31 | ShaderChunk.fog_fragment = /* glsl */` 32 | #ifdef USE_FOG 33 | float vFogDepth = length(vFogPosition); 34 | #ifdef FOG_EXP2 35 | float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); 36 | #else 37 | float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); 38 | #endif 39 | gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); 40 | #endif 41 | `; 42 | 43 | export const camera = new PerspectiveCamera(75, 1, 1, 100000); 44 | camera.rotation.order = 'YXZ'; 45 | export const clock = new Clock(); 46 | export const renderer = new WebGLRenderer({ antialias: true }); 47 | export const scene = new Scene(); 48 | 49 | const resize = () => { 50 | const { innerWidth: width, innerHeight: height } = window; 51 | const aspect = width / height; 52 | camera.aspect = aspect; 53 | camera.updateProjectionMatrix(); 54 | renderer.setSize(width, height); 55 | }; 56 | resize(); 57 | window.addEventListener('resize', resize); 58 | document.addEventListener('visibilitychange', () => ( 59 | document.visibilityState === 'visible' && clock.start() 60 | )); 61 | 62 | export const dom = document.getElementById('viewport')!; 63 | dom.appendChild(renderer.domElement); 64 | 65 | const prevent = (e: Event) => e.preventDefault(); 66 | window.addEventListener('contextmenu', prevent); 67 | window.addEventListener('keydown', (e) => ( 68 | e.key === ' ' 69 | && !['input', 'textarea', 'select'].includes((e.target as HTMLElement).tagName.toLowerCase()) 70 | && prevent(e) 71 | )); 72 | window.addEventListener('touchstart', prevent, { passive: false }); 73 | window.addEventListener('wheel', (e) => e.ctrlKey && prevent(e), { passive: false }); 74 | -------------------------------------------------------------------------------- /src/main.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-size: 16px; 3 | } 4 | 5 | body { 6 | margin: 0; 7 | background: #1a1a1a; 8 | color: #eee; 9 | cursor: default; 10 | font-family: monospace; 11 | font-size: 0.75rem; 12 | font-weight: 400; 13 | font-style: normal; 14 | line-height: 1.125rem; 15 | touch-action: none; 16 | overflow: hidden; 17 | overscroll-behavior: none; 18 | user-select: none; 19 | -webkit-tap-highlight-color: transparent; 20 | -webkit-text-size-adjust: none; 21 | -webkit-touch-callout: none; 22 | -webkit-user-select: none; 23 | -webkit-overflow-scrolling: auto; 24 | } 25 | 26 | :root, body, #viewport { 27 | width: 100%; 28 | height: 100%; 29 | } 30 | 31 | a { 32 | color: inherit; 33 | } 34 | 35 | #info { 36 | position: absolute; 37 | bottom: 1rem; 38 | right: 1rem; 39 | text-align: right; 40 | } 41 | 42 | #loading { 43 | position: absolute; 44 | bottom: 50%; 45 | left: 50%; 46 | transform: translate(-50%, -50%); 47 | text-align: center; 48 | } 49 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import './main.css'; 2 | import { 3 | Color, 4 | FogExp2, 5 | Vector2, 6 | Vector3, 7 | } from 'three'; 8 | import { Input } from 'core/Input'; 9 | import { camera, clock, dom, renderer, scene } from 'core/Viewport'; 10 | import BuildingsData from '../data/data.bin?no-inline'; 11 | import { Buildings as BuildingsProtocol } from '../data/protocol.js'; 12 | import { Buildings } from 'meshes/Buildings'; 13 | import { Grid } from 'meshes/Grid'; 14 | import { Starfield } from 'meshes/Starfield'; 15 | 16 | camera.position.set(0, 1000, 0); 17 | camera.lookAt(0, 0, -5000); 18 | 19 | scene.background = new Color('#001133'); 20 | scene.fog = new FogExp2(0x001133, 0.00005); 21 | 22 | const grid = new Grid(); 23 | scene.add(grid); 24 | const starfield = new Starfield(); 25 | scene.add(starfield); 26 | 27 | const input = new Input(dom); 28 | const look = new Vector2(); 29 | const movement = new Vector3(); 30 | 31 | renderer.setAnimationLoop(() => { 32 | const delta = Math.min(clock.getDelta(), 0.2); 33 | Buildings.setTime(clock.oldTime / 1000); 34 | input.getLook(look, delta); 35 | if (look.x !== 0 || look.y !== 0) { 36 | camera.rotation.y += look.x; 37 | camera.rotation.x += look.y; 38 | camera.rotation.x = Math.min(Math.max(camera.rotation.x, Math.PI * -0.5), Math.PI * 0.5); 39 | camera.updateMatrixWorld(); 40 | } 41 | input.getMovement(camera, movement); 42 | const step = input.getSpeed() * (input.getRunning() ? 2 : 1) * delta; 43 | camera.position.addScaledVector(movement, step); 44 | camera.position.y = Math.max(camera.position.y, 1); 45 | grid.position.set( 46 | camera.position.x, 47 | 0, 48 | camera.position.z 49 | ); 50 | starfield.position.copy(grid.position); 51 | renderer.render(scene, camera); 52 | }); 53 | 54 | fetch(BuildingsData).then((res) => res.arrayBuffer()).then((buf) => { 55 | const data = BuildingsProtocol.decode(new Uint8Array(buf)); 56 | scene.add(new Buildings(data.buildings)); 57 | document.body.removeChild(document.getElementById('loading')!); 58 | }); 59 | -------------------------------------------------------------------------------- /src/meshes/Buildings.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BufferGeometry, 3 | BufferAttribute, 4 | Color, 5 | DataTexture, 6 | FloatType, 7 | InstancedBufferAttribute, 8 | InstancedBufferGeometry, 9 | Mesh, 10 | MeshBasicMaterial, 11 | PlaneGeometry, 12 | RedFormat, 13 | RepeatWrapping, 14 | } from 'three'; 15 | import { SimplexNoise } from 'three/examples/jsm/math/SimplexNoise.js'; 16 | import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js'; 17 | import { type IBuilding } from '../../data/protocol.js'; 18 | 19 | export class Buildings extends Mesh { 20 | private static geometry?: BufferGeometry; 21 | 22 | private static getGeometry() { 23 | if (!Buildings.geometry) { 24 | const geometries: BufferGeometry[] = []; 25 | const plane = new PlaneGeometry(1, 1, 1, 1); 26 | plane.setAttribute('face', new BufferAttribute(new Int32Array(plane.getAttribute('position').count), 1)); 27 | const addFace = (x: number, y: number, z: number, rotationY?: number, rotationX?: number, zeroUV?: boolean) => { 28 | const index = geometries.length; 29 | const geometry = plane.clone(); 30 | const face = geometry.getAttribute('face'); 31 | const uv = geometry.getAttribute('uv'); 32 | for (let i = 0, l = geometry.getAttribute('position')!.count; i < l; i++) { 33 | face.setX(i, index); 34 | if (zeroUV) { 35 | uv.setXY(i, 0, 0); 36 | } 37 | } 38 | if (rotationY) { 39 | geometry.rotateY(rotationY); 40 | } 41 | if (rotationX) { 42 | geometry.rotateX(rotationX); 43 | } 44 | geometry.translate(x, y, z); 45 | geometries.push(geometry); 46 | }; 47 | addFace(0.5, 0.5, 0, Math.PI * 0.5); 48 | addFace(-0.5, 0.5, 0, Math.PI * -0.5); 49 | addFace(0, 0.5, 0.5); 50 | addFace(0, 0.5, -0.5, Math.PI); 51 | addFace(0, 1.0, 0, 0, Math.PI * -0.5, true); 52 | Buildings.geometry = mergeGeometries(geometries); 53 | } 54 | return Buildings.geometry; 55 | } 56 | 57 | private static material?: MeshBasicMaterial; 58 | 59 | private static getMaterial() { 60 | if (!Buildings.material) { 61 | const material = new MeshBasicMaterial({ vertexColors: true }); 62 | material.onBeforeCompile = (parameters) => { 63 | parameters.defines = { 64 | FLOOR_WIDTH: '5.0', 65 | FLOOR_HEIGHT: '10.0', 66 | }; 67 | parameters.uniforms.noise = { 68 | value: (() => { 69 | const size = 256; 70 | const data = new Float32Array(size * size); 71 | for (let i = 0; i < size * size; i++) { 72 | data[i] = Math.random(); 73 | } 74 | const texture = new DataTexture(data, size, size, RedFormat, FloatType); 75 | texture.needsUpdate = true; 76 | texture.wrapS = texture.wrapT = RepeatWrapping; 77 | return texture; 78 | })(), 79 | }; 80 | parameters.uniforms.time = Buildings.time; 81 | parameters.vertexShader = parameters.vertexShader 82 | .replace('#include ', 83 | /* glsl */ ` 84 | #include 85 | attribute int face; 86 | attribute vec2 offset; 87 | attribute vec3 scale; 88 | attribute float rotation; 89 | flat varying int vId; 90 | varying vec2 vUv; 91 | mat3 rotateY(float angle) { 92 | float s = sin(angle); 93 | float c = cos(angle); 94 | return mat3( 95 | c, 0.0, -s, 96 | 0.0, 1.0, 0.0, 97 | s, 0.0, c 98 | ); 99 | } 100 | ` 101 | ) 102 | .replace('#include ', 103 | /* glsl */ ` 104 | vec3 transformed = vec3(rotateY(rotation) * (position * scale) + vec3(offset.x, 0.0, offset.y)); 105 | vId = gl_InstanceID; 106 | ` 107 | ) 108 | .replace('#include ', 109 | /* glsl */ ` 110 | vec2 uvScale = vec2(face == 0 || face == 1 ? scale.z : scale.x, scale.y); 111 | vec2 floorSize = vec2(FLOOR_WIDTH + mod(float(gl_InstanceID), 5.0), FLOOR_HEIGHT); 112 | uvScale -= mod(uvScale, floorSize); 113 | uvScale = max(uvScale, floorSize * vec2(1.0, 3.0)); 114 | vUv = uv * uvScale / floorSize; 115 | ` 116 | ); 117 | parameters.fragmentShader = parameters.fragmentShader 118 | .replace('#include ', 119 | /* glsl */ ` 120 | #include 121 | flat varying int vId; 122 | varying vec2 vUv; 123 | uniform sampler2D noise; 124 | uniform float time; 125 | ` 126 | ) 127 | .replace('#include ', 128 | /* glsl */ ` 129 | #include 130 | float light = 0.2; 131 | bool isFirstFloor = vUv.y < 1.0; 132 | if (isFirstFloor) { 133 | light = 0.1 * max(vUv.y, 0.2); 134 | } else { 135 | vec2 uv = vec2(mod(vUv.x, 1.0), mod(vUv.y, 1.0)); 136 | bool isWindow = uv.x > 0.2 && uv.x < 0.8 && uv.y > 0.45 && uv.y < 0.55; 137 | bool isCornice = uv.y < 0.25 || uv.y > 0.75; 138 | if (isCornice) { 139 | light = 0.1; 140 | } else if (isWindow) { 141 | vec2 id = vec2(floor(vUv.x + float(vId)) + 0.5, floor(vUv.y) + 0.5); 142 | light = 0.5 + sin(time + texture(noise, id / vec2(256.0)).r * 10.0) * 0.4; 143 | } 144 | } 145 | diffuseColor *= light; 146 | ` 147 | ); 148 | }; 149 | Buildings.material = material; 150 | } 151 | return Buildings.material; 152 | } 153 | 154 | private static readonly time = { value: 0 }; 155 | 156 | static setTime(value: number) { 157 | Buildings.time.value = value; 158 | } 159 | 160 | constructor(data: IBuilding[]) { 161 | const building = Buildings.getGeometry(); 162 | const geometry = new InstancedBufferGeometry(); 163 | geometry.setAttribute('position', building.getAttribute('position')); 164 | geometry.setAttribute('normal', building.getAttribute('normal')); 165 | geometry.setAttribute('uv', building.getAttribute('uv')); 166 | geometry.setAttribute('face', building.getAttribute('face')); 167 | geometry.setIndex(building.getIndex()); 168 | geometry.instanceCount = data.length; 169 | const color = new Color(); 170 | const simplex = new SimplexNoise(); 171 | const colors = new Float32Array(geometry.instanceCount * 3); 172 | const offsets = new Float32Array(geometry.instanceCount * 2); 173 | const scales = new Float32Array(geometry.instanceCount * 3); 174 | const rotations = new Float32Array(geometry.instanceCount); 175 | data.forEach(({ position, scale, rotation }, i) => { 176 | color.setHSL( 177 | 0.5 + (simplex.noise(position!.y!, position!.x!) / 3), 178 | 0.5 + (simplex.noise(position!.x!, position!.y!) / 3), 179 | 0.5 + (simplex.noise(-position!.y!, position!.x!) / 3), 180 | ); 181 | colors[i * 3] = color.r; 182 | colors[i * 3 + 1] = color.g; 183 | colors[i * 3 + 2] = color.b; 184 | offsets[i * 2] = position!.x!; 185 | offsets[i * 2 + 1] = position!.y!; 186 | scales[i * 3] = scale!.x!; 187 | scales[i * 3 + 1] = scale!.y!; 188 | scales[i * 3 + 2] = scale!.z!; 189 | rotations[i] = rotation!; 190 | }); 191 | geometry.setAttribute('color', new InstancedBufferAttribute(colors, 3)); 192 | geometry.setAttribute('offset', new InstancedBufferAttribute(offsets, 2)); 193 | geometry.setAttribute('scale', new InstancedBufferAttribute(scales, 3)); 194 | geometry.setAttribute('rotation', new InstancedBufferAttribute(rotations, 1)); 195 | super(geometry, Buildings.getMaterial()); 196 | this.frustumCulled = false; 197 | this.matrixAutoUpdate = false; 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /src/meshes/Grid.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BufferGeometry, 3 | Color, 4 | Mesh, 5 | MeshBasicMaterial, 6 | PlaneGeometry, 7 | } from 'three'; 8 | 9 | export class Grid extends Mesh { 10 | private static geometry?: BufferGeometry; 11 | 12 | private static getGeometry() { 13 | if (!Grid.geometry) { 14 | const geometry = new PlaneGeometry(100000, 100000, 1, 1); 15 | geometry.rotateX(Math.PI * -0.5); 16 | geometry.computeBoundingSphere(); 17 | Grid.geometry = geometry; 18 | } 19 | return Grid.geometry; 20 | } 21 | 22 | private static material?: MeshBasicMaterial; 23 | 24 | private static getMaterial() { 25 | if (!Grid.material) { 26 | const material = new MeshBasicMaterial({ transparent: true }); 27 | material.customProgramCacheKey = () => 'grid'; 28 | material.onBeforeCompile = (parameters) => { 29 | parameters.uniforms.color = { value: new Color('#351645') }; 30 | parameters.vertexShader = parameters.vertexShader 31 | .replace( 32 | '#include ', 33 | /* glsl */` 34 | #include 35 | varying vec2 gridPos; 36 | ` 37 | ) 38 | .replace( 39 | '#include ', 40 | /* glsl */` 41 | vec4 worldPosition = vec4(transformed, 1.0); 42 | worldPosition = modelMatrix * worldPosition; 43 | gridPos = worldPosition.xz * 0.01; 44 | ` 45 | ); 46 | parameters.fragmentShader = parameters.fragmentShader 47 | .replace( 48 | '#include ', 49 | /* glsl */` 50 | #include 51 | varying vec2 gridPos; 52 | uniform vec3 color; 53 | float line(vec2 position) { 54 | vec2 coord = abs(fract(position - 0.5) - 0.5) / fwidth(position); 55 | return 1.0 - min(min(coord.x, coord.y), 1.0); 56 | } 57 | ` 58 | ) 59 | .replace( 60 | '#include ', 61 | /* glsl */` 62 | #include 63 | diffuseColor.rgb *= color * line(gridPos); 64 | ` 65 | ) 66 | .replace( 67 | '#include ', 68 | /* glsl */` 69 | float fDepth = length(vFogPosition); 70 | float fDensity = fogDensity * 2.0; 71 | float fFactor = 1.0 - exp( - fDensity * fDensity * fDepth * fDepth ); 72 | gl_FragColor.rgb = mix( gl_FragColor.rgb, vec3(0.0), fFactor ); 73 | #include 74 | ` 75 | ); 76 | }; 77 | Grid.material = material; 78 | } 79 | return Grid.material; 80 | } 81 | 82 | constructor() { 83 | super(Grid.getGeometry(), Grid.getMaterial()); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/meshes/Starfield.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BufferGeometry, 3 | Points, 4 | PointsMaterial, 5 | BufferAttribute, 6 | Vector3, 7 | } from 'three'; 8 | 9 | export class Starfield extends Points { 10 | private static readonly count = 10000; 11 | private static readonly radius = 100000; 12 | 13 | private static geometry?: BufferGeometry; 14 | 15 | static getGeometry() { 16 | if (!Starfield.geometry) { 17 | const { count, radius } = Starfield; 18 | const position = new Float32Array(count * 3); 19 | const color = new Float32Array(count * 3); 20 | const aux = new Vector3(); 21 | for (let i = 0; i < count; i += 1) { 22 | aux 23 | .set( 24 | Math.random() * 2 - 1, 25 | Math.random() * 1.25 - 0.625, 26 | Math.random() * 2 - 1, 27 | ) 28 | .normalize() 29 | .multiplyScalar(radius * (0.75 + Math.random() * 0.25)); 30 | position.set([ 31 | aux.x, 32 | aux.y, 33 | aux.z, 34 | ], i * 3); 35 | color.set([ 36 | 0.5 + Math.random() * 0.5, 37 | 0.5 + Math.random() * 0.5, 38 | 0.5 + Math.random() * 0.5 39 | ], i * 3); 40 | } 41 | const geometry = new BufferGeometry(); 42 | geometry.setAttribute('position', new BufferAttribute(position, 3)); 43 | geometry.setAttribute('color', new BufferAttribute(color, 3)); 44 | Starfield.geometry = geometry; 45 | } 46 | return Starfield.geometry; 47 | } 48 | 49 | private static material?: PointsMaterial; 50 | 51 | static getMaterial() { 52 | if (!Starfield.material) { 53 | Starfield.material = new PointsMaterial({ 54 | vertexColors: true, 55 | fog: false, 56 | }); 57 | } 58 | return Starfield.material; 59 | } 60 | 61 | constructor() { 62 | super(Starfield.getGeometry(), Starfield.getMaterial()); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./src", 4 | "esModuleInterop": true, 5 | "module": "esnext", 6 | "moduleResolution": "bundler", 7 | "noFallthroughCasesInSwitch": true, 8 | "noImplicitReturns": true, 9 | "noImplicitOverride": true, 10 | "noUnusedLocals": true, 11 | "noUnusedParameters": true, 12 | "skipLibCheck": true, 13 | "sourceMap": true, 14 | "strict": true, 15 | "target": "esnext", 16 | "verbatimModuleSyntax": true 17 | }, 18 | "exclude": ["dist", "node_modules"], 19 | "include": ["src"] 20 | } 21 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import { defineConfig } from 'vite'; 4 | 5 | export default defineConfig(({ mode }) => ({ 6 | assetsInclude: ['**/*.bin'], 7 | esbuild: mode === 'production' ? { 8 | drop: ['console', 'debugger'], 9 | legalComments: 'none', 10 | } : {}, 11 | resolve: { 12 | alias: fs.readdirSync(path.join(__dirname, 'src'), { withFileTypes: true }) 13 | .filter((f) => f.isDirectory()) 14 | .map(({ name }) => ( 15 | { find: name, replacement: path.join(__dirname, 'src', name) } 16 | )), 17 | }, 18 | server: { 19 | port: 8080, 20 | }, 21 | })); 22 | --------------------------------------------------------------------------------