From a2ea52335e120b61ef9bd7e408c591cd5c82aabc Mon Sep 17 00:00:00 2001 From: Florent MILLOT Date: Fri, 17 May 2024 16:36:08 +0200 Subject: [PATCH 01/10] Upgrade deck.gl to v9.0 Signed-off-by: Florent MILLOT (cherry picked from commit aea1e7383f3721abcd3143cf779aab328521f71f) --- package-lock.json | 3264 ++++++++++------- package.json | 5 +- .../network/layers/arrow-layer.js | 92 +- .../network/layers/fork-line-layer.js | 13 +- .../network/layers/parallel-path-layer.js | 7 +- .../network/layers/scatterplot-layer-ext.js | 7 +- 6 files changed, 2030 insertions(+), 1358 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7dc505d2..a3931100 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^8.9.35", + "deck.gl": "^9.0.14", "geolib": "^3.3.4", "mapbox-gl": "^3.2.0", "maplibre-gl": "^4.1.2", @@ -37,6 +37,7 @@ "@types/react": "^18.2.75", "@types/react-dom": "^18.2.24", "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react": "^4.2.1", "babel-jest": "^29.7.0", "eslint": "^7.32.0", @@ -67,15 +68,6 @@ "react-intl": "^6.6.4" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -89,6 +81,22 @@ "node": ">=6.0.0" } }, + "node_modules/@arcgis/core": { + "version": "4.29.10", + "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.29.10.tgz", + "integrity": "sha512-EMJOJkeXG7sYeKLrjEWvF3cKWCFB4CFEjcsfRi0j9UlULv9NV9IarVryG1oLCg17CtEzcKjl7EZXiPnZsX5M2Q==", + "peer": true, + "dependencies": { + "@esri/arcgis-html-sanitizer": "~3.0.1", + "@esri/calcite-colors": "~6.1.0", + "@esri/calcite-components": "^2.4.0", + "@popperjs/core": "~2.11.8", + "@vaadin/grid": "~24.3.6", + "@zip.js/zip.js": "~2.7.34", + "luxon": "~3.4.4", + "sortablejs": "~1.15.2" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -102,9 +110,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -141,12 +149,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -196,19 +204,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", - "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -236,9 +244,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -286,12 +294,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -309,16 +317,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -340,9 +348,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -383,12 +391,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -407,12 +415,12 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -427,9 +435,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -444,39 +452,39 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -486,9 +494,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -900,12 +908,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", - "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -931,12 +939,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", - "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-create-class-features-plugin": "^7.24.4", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -948,18 +956,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -986,12 +994,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1305,15 +1313,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1355,12 +1363,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1372,12 +1380,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1403,14 +1411,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1436,12 +1444,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", - "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz", + "integrity": "sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1558,12 +1566,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1573,14 +1581,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", - "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", + "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { @@ -1787,9 +1795,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1812,19 +1820,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1833,12 +1841,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1874,220 +1882,236 @@ } }, "node_modules/@deck.gl/aggregation-layers": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-8.9.35.tgz", - "integrity": "sha512-OjJhHt/ZXLIP3cs8yD2xwa9KACBOjfvJpdMkly704y6SuM0k+qSj81VwkpdOA54DCvAhQQTAYCJ4rvnwmtcPQQ==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "^8.5.21", - "@luma.gl/shadertools": "^8.5.21", - "@math.gl/web-mercator": "^3.6.2", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.14.tgz", + "integrity": "sha512-cmoCD1RZ3v91+lkfAOWZMmQc0BFjSiXwinmUvlBkXSkZLgL1j4vGXw/t2kFHseBJnFo/rLRXzeF3ckuPOGCPoQ==", + "dependencies": { + "@luma.gl/constants": "^9.0.11", + "@luma.gl/shadertools": "^9.0.11", + "@math.gl/web-mercator": "^4.0.0", "d3-hexbin": "^0.2.1" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@deck.gl/layers": "^8.0.0", - "@luma.gl/core": "^8.0.0" + "@deck.gl/core": "^9.0.0", + "@deck.gl/layers": "^9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" + } + }, + "node_modules/@deck.gl/arcgis": { + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.0.14.tgz", + "integrity": "sha512-3q0DCVRHAsk/0uNnllFtv089IS+/wgqjYX+DcYPMsmuEHa9MouL4MVIsGRT50RmLDd9TkBrbtMhFa8fuDT3x2w==", + "dependencies": { + "@luma.gl/constants": "^9.0.11", + "esri-loader": "^3.7.0" + }, + "peerDependencies": { + "@arcgis/core": "^4.0.0", + "@deck.gl/core": "^9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" } }, "node_modules/@deck.gl/carto": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-8.9.35.tgz", - "integrity": "sha512-Ln9yFQqagQ5Zpfl5SUJl/09lw0S9zkpSVeay976aSPnQt9U7L4ES5lxOZZBQvxHmKATmar5B5V36vXaW2bAezQ==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@loaders.gl/gis": "^3.4.13", - "@loaders.gl/loader-utils": "^3.4.13", - "@loaders.gl/mvt": "^3.4.13", - "@loaders.gl/tiles": "^3.4.13", - "@luma.gl/constants": "^8.5.21", - "@math.gl/web-mercator": "^3.6.2", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.14.tgz", + "integrity": "sha512-tbsKvo56TDXZ+HoA4XV9g1BIL/PrdvcemP/AYYABw/iOQNMP4ZmiRmGBLCIpa34q8NjR4aHLrYxMgBK1S4YMvQ==", + "dependencies": { + "@loaders.gl/gis": "^4.2.0", + "@loaders.gl/loader-utils": "^4.2.0", + "@loaders.gl/mvt": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@loaders.gl/tiles": "^4.2.0", + "@luma.gl/constants": "^9.0.11", + "@luma.gl/core": "^9.0.11", + "@luma.gl/shadertools": "^9.0.11", + "@math.gl/web-mercator": "^4.0.0", + "@types/d3-array": "^3.0.2", + "@types/d3-color": "^1.4.2", + "@types/d3-scale": "^3.0.0", "cartocolor": "^4.0.2", "d3-array": "^3.2.0", "d3-color": "^3.1.0", "d3-format": "^3.1.0", "d3-scale": "^4.0.0", - "h3-js": "^3.7.0", + "earcut": "^2.2.4", + "h3-js": "^4.1.0", "moment-timezone": "^0.5.33", "pbf": "^3.2.1", - "quadbin": "^0.1.9" + "quadbin": "^0.2.0" }, "peerDependencies": { - "@deck.gl/aggregation-layers": "^8.0.0", - "@deck.gl/core": "^8.0.0", - "@deck.gl/extensions": "^8.0.0", - "@deck.gl/geo-layers": "^8.0.0", - "@deck.gl/layers": "^8.0.0", - "@loaders.gl/core": "^3.4.13" + "@deck.gl/aggregation-layers": "^9.0.0", + "@deck.gl/core": "^9.0.0", + "@deck.gl/extensions": "^9.0.0", + "@deck.gl/geo-layers": "^9.0.0", + "@deck.gl/layers": "^9.0.0", + "@loaders.gl/core": "^4.2.0" } }, "node_modules/@deck.gl/core": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-8.9.35.tgz", - "integrity": "sha512-xOASWScUCB5fpfuSjPaJrwas8pCJpbKXNIfwQElhvnfP3Yk8GGkAcRbPgiPNCfpkbEno7eDpAWJt6+6UJsSp9g==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@loaders.gl/core": "^3.4.13", - "@loaders.gl/images": "^3.4.13", - "@luma.gl/constants": "^8.5.21", - "@luma.gl/core": "^8.5.21", - "@luma.gl/webgl": "^8.5.21", - "@math.gl/core": "^3.6.2", - "@math.gl/sun": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", - "@probe.gl/env": "^3.5.0", - "@probe.gl/log": "^3.5.0", - "@probe.gl/stats": "^3.5.0", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.14.tgz", + "integrity": "sha512-F3HtES5o5/hC6ouhiE+qmw9NeUiaY55UqQt+iODEwbfy4mtRV7TyNWJTC1jY+dw5qUTmwvAT66NYufI1GQYEnA==", + "dependencies": { + "@loaders.gl/core": "^4.2.0", + "@loaders.gl/images": "^4.2.0", + "@luma.gl/constants": "^9.0.11", + "@luma.gl/core": "^9.0.11", + "@luma.gl/engine": "^9.0.11", + "@luma.gl/shadertools": "^9.0.11", + "@luma.gl/webgl": "^9.0.11", + "@math.gl/core": "^4.0.0", + "@math.gl/sun": "^4.0.0", + "@math.gl/web-mercator": "^4.0.0", + "@probe.gl/env": "^4.0.9", + "@probe.gl/log": "^4.0.9", + "@probe.gl/stats": "^4.0.9", + "@types/offscreencanvas": "^2019.6.4", "gl-matrix": "^3.0.0", - "math.gl": "^3.6.2", "mjolnir.js": "^2.7.0" } }, "node_modules/@deck.gl/extensions": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-8.9.35.tgz", - "integrity": "sha512-qMZzeQpvtcw4zbh4HJJIF8Q73/u0Unwwe8aSC2r+apjuyUVPQInwlCil++LznBY3JA37M7SvW2TSK6IgCuaSyA==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.14.tgz", + "integrity": "sha512-tQM9frol9E48oV5OzNIIYf3aePUlPO2vCEdTcXxn7Y7d1hBf4xrTMlKeM+4nR+LP2iB/40gUrYYAMTkcRAsGPA==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/shadertools": "^8.5.21" + "@luma.gl/constants": "^9.0.11", + "@luma.gl/shadertools": "^9.0.11", + "@math.gl/core": "^4.0.0" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@luma.gl/constants": "^8.0.0", - "@luma.gl/core": "^8.0.0", - "@math.gl/core": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", - "gl-matrix": "^3.0.0" + "@deck.gl/core": "^9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" } }, "node_modules/@deck.gl/geo-layers": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-8.9.35.tgz", - "integrity": "sha512-7sczznSjC7GjpDxuXPvPN7/WbVgSYHnFNNyWr8hMGm/WlUMK4z9QpZo6UFvrHL5rQ5Uudd4vD56xB1fs3b2lMA==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@loaders.gl/3d-tiles": "^3.4.13", - "@loaders.gl/gis": "^3.4.13", - "@loaders.gl/loader-utils": "^3.4.13", - "@loaders.gl/mvt": "^3.4.13", - "@loaders.gl/schema": "^3.4.13", - "@loaders.gl/terrain": "^3.4.13", - "@loaders.gl/tiles": "^3.4.13", - "@loaders.gl/wms": "^3.4.13", - "@luma.gl/constants": "^8.5.21", - "@luma.gl/experimental": "^8.5.21", - "@math.gl/core": "^3.6.2", - "@math.gl/culling": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.14.tgz", + "integrity": "sha512-ldMghVE3dR4eXglZ4CA+zQJ+UQeQQCHlzaqiNsX2+fyNeJ+K4TuzNAPQaW/HKseJvanRAggD1OKrV0xsqQ81KA==", + "dependencies": { + "@loaders.gl/3d-tiles": "^4.2.0", + "@loaders.gl/gis": "^4.2.0", + "@loaders.gl/loader-utils": "^4.2.0", + "@loaders.gl/mvt": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@loaders.gl/terrain": "^4.2.0", + "@loaders.gl/tiles": "^4.2.0", + "@loaders.gl/wms": "^4.2.0", + "@luma.gl/gltf": "^9.0.11", + "@luma.gl/shadertools": "^9.0.11", + "@math.gl/core": "^4.0.0", + "@math.gl/culling": "^4.0.0", + "@math.gl/web-mercator": "^4.0.0", "@types/geojson": "^7946.0.8", - "h3-js": "^3.7.0", + "h3-js": "^4.1.0", "long": "^3.2.0" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@deck.gl/extensions": "^8.0.0", - "@deck.gl/layers": "^8.0.0", - "@deck.gl/mesh-layers": "^8.0.0", - "@loaders.gl/core": "^3.4.13", - "@luma.gl/core": "^8.0.0" + "@deck.gl/core": "^9.0.0", + "@deck.gl/extensions": "^9.0.0", + "@deck.gl/layers": "^9.0.0", + "@deck.gl/mesh-layers": "^9.0.0", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" } }, "node_modules/@deck.gl/google-maps": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-8.9.35.tgz", - "integrity": "sha512-btNCp3ZZngWq2Fsuapx6PL5BaGcLPXzaVDN65He/AkdkmU2cCnFK5oR1s33JgACnUejx28ttfoFuJgLKpmJ4Eg==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.14.tgz", + "integrity": "sha512-6k4zUQktHNaD1JvQO0KlkTKMRd7aEKOlaYSIbxnhq8vrJp3lSaIXdpppmbB/Z++p6U6xbcNFT/oMdKVnY4SwSw==", "dependencies": { - "@babel/runtime": "^7.0.0" + "@luma.gl/constants": "^9.0.11", + "@math.gl/core": "^4.0.0", + "@types/google.maps": "^3.48.6" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@luma.gl/constants": "^8.5.0", - "@luma.gl/core": "^8.5.0", - "@math.gl/core": "^3.6.0" + "@deck.gl/core": "^9.0.0", + "@luma.gl/core": "^9.0.0" } }, "node_modules/@deck.gl/json": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-8.9.35.tgz", - "integrity": "sha512-0mp4ckb1n0kRGPPFqtx6Q13uGNRBYGrpYN/NuibQZSW1EMNqmxTqSJekoqzXrlI1W6u35Tu9E5+DHpw9WJiJkg==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.14.tgz", + "integrity": "sha512-D03XvhZ4tv2RRb1CryBC0hFdZi8W7OLKiYySnLdvrR8SGh4POxCPK2fauU+vmNsQiCuSAw1ADaBWMj++o2o0tA==", "dependencies": { - "@babel/runtime": "^7.0.0", - "d3-dsv": "^1.0.8", - "expression-eval": "^2.0.0" + "expression-eval": "^5.0.0" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0" + "@deck.gl/core": "^9.0.0" } }, "node_modules/@deck.gl/layers": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-8.9.35.tgz", - "integrity": "sha512-4amaGO+tGvaCNi2KZ90twmajGh5xUAaQzBIyh42dnM10GRj/62sOIYD9uT032oV/KpjKY+TfOstx5ooXBGKDjg==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@loaders.gl/images": "^3.4.13", - "@loaders.gl/schema": "^3.4.13", - "@luma.gl/constants": "^8.5.21", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.14.tgz", + "integrity": "sha512-gnt6hrbwbru8uNyMGkruroa2+h/2KUAVLztXuYk9kPAsoIr4806ZfBM/pneQe6UTbHMDnVpVtaS2fTY8wW5Jcw==", + "dependencies": { + "@loaders.gl/images": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", "@mapbox/tiny-sdf": "^2.0.5", - "@math.gl/core": "^3.6.2", - "@math.gl/polygon": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", + "@math.gl/core": "^4.0.0", + "@math.gl/polygon": "^4.0.0", + "@math.gl/web-mercator": "^4.0.0", "earcut": "^2.2.4" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@loaders.gl/core": "^3.4.13", - "@luma.gl/core": "^8.0.0" + "@deck.gl/core": "^9.0.0", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" } }, "node_modules/@deck.gl/mapbox": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-8.9.35.tgz", - "integrity": "sha512-3GKbYkB6OF+65Al/F2g0DlGhiQAPnA7/l/9Tl9cFSaaLBUfw2zT/U0kgZe3/4ZyfwQMzmoW6D3Ybb/FB4FKlmg==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.14.tgz", + "integrity": "sha512-Lu4UuMh1klHvym4SN8pVs2mpQm16e5D4O8pCmGgLcepiQ6Ij4U6RwhnWVJ1FK0Pl01YcVonLeG25rJBcQ2S3zg==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@types/mapbox-gl": "^2.6.3" + "@luma.gl/constants": "^9.0.11", + "@math.gl/web-mercator": "^4.0.0" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0" - } - }, - "node_modules/@deck.gl/mapbox/node_modules/@types/mapbox-gl": { - "version": "2.7.21", - "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-2.7.21.tgz", - "integrity": "sha512-Dx9MuF2kKgT/N22LsMUB4b3acFZh9clVqz9zv1fomoiPoBrJolwYxpWA/9LPO/2N0xWbKi4V+pkjTaFkkx/4wA==", - "dependencies": { - "@types/geojson": "*" + "@deck.gl/core": "^9.0.0", + "@luma.gl/core": "^9.0.0" } }, "node_modules/@deck.gl/mesh-layers": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-8.9.35.tgz", - "integrity": "sha512-0l7+zi/6bkYVz7zZ0J4+WLoxOh+hFMPUQKCujTOcqYWbvJ2fEQze0Z1ZHCAG0RQOFJITEMamDigo9dN2BMxPBA==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.14.tgz", + "integrity": "sha512-2Zvn3nLrVCMBFMrYkHiI9QJXOvsTFLjaLNjcpjJJ5w8hoRCmhgDY8OJ3hVVPDUH1ADEOkg6WK7FNLy+nZbvULw==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@loaders.gl/gltf": "^3.4.13", - "@luma.gl/constants": "^8.5.21", - "@luma.gl/experimental": "^8.5.21", - "@luma.gl/shadertools": "^8.5.21" + "@loaders.gl/gltf": "^4.2.0", + "@luma.gl/gltf": "^9.0.11", + "@luma.gl/shadertools": "^9.0.11" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@luma.gl/core": "^8.0.0" + "@deck.gl/core": "^9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" } }, "node_modules/@deck.gl/react": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-8.9.35.tgz", - "integrity": "sha512-eDwYCeBBzHXIpgZbAxcAEnpjnAoMiWcec8rMgYot7VOB+RnBTPYUaO3GPPImlk1uiezNGQel0YK4OLI1f6cDHg==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.14.tgz", + "integrity": "sha512-wHw8XkRWaD30s+EC+S9ZRmRRkaMgxTdxMidIk6rBxhmTI+RX0A/HQPBEXp+WiNaPyuwN31td6LgG9SlEJJ6UFA==", + "peerDependencies": { + "@deck.gl/core": "^9.0.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/@deck.gl/widgets": { + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.14.tgz", + "integrity": "sha512-DoxESfwbQR1ffME4lbWSm/w5jOLPu/PGPXUAU4d/VQWhLX0axf6ZcOja+7HnpeD5ZbwWdQ5sNTcTckgzZs2RTQ==", "dependencies": { - "@babel/runtime": "^7.0.0" + "preact": "^10.17.0" }, "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@types/react": ">= 16.3", - "react": ">=16.3", - "react-dom": ">=16.3" + "@deck.gl/core": "^9.0.0" } }, "node_modules/@emotion/babel-plugin": { @@ -2115,6 +2139,18 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "peer": true }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@emotion/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -2695,31 +2731,80 @@ "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "node_modules/@esri/arcgis-html-sanitizer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-3.0.1.tgz", + "integrity": "sha512-cwZJwsYCJZwtBQU2AmaiIVFg5nZcVwInPYja1/OgC9iKYO+ytZRoc5h+0S9/ygbFNoS8Nd0RX9A85stLX/BgiA==", + "peer": true, + "dependencies": { + "xss": "1.0.13" + } + }, + "node_modules/@esri/calcite-colors": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@esri/calcite-colors/-/calcite-colors-6.1.0.tgz", + "integrity": "sha512-wHQYWFtDa6c328EraXEVZvgOiaQyYr0yuaaZ0G3cB4C3lSkWefW34L/e5TLAhtuG3zJ/wR6pl5X1YYNfBc0/4Q==", + "peer": true + }, + "node_modules/@esri/calcite-components": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-2.8.2.tgz", + "integrity": "sha512-eQvYWQVcT5+Wpm0xECnyw1oCSg36E6y0i5qBn7PjwrOtEbYQwlLqOmSzEk0JLbZxRvjJjegtqZhn5H75rnngIQ==", + "peer": true, + "dependencies": { + "@floating-ui/dom": "1.6.3", + "@stencil/core": "4.17.1", + "@types/color": "3.0.6", + "color": "4.2.3", + "composed-offset-position": "0.0.4", + "dayjs": "1.11.10", + "focus-trap": "7.5.4", + "lodash-es": "4.17.21", + "sortablejs": "1.15.1", + "timezone-groups": "0.8.0", + "type-fest": "4.18.2" + } + }, + "node_modules/@esri/calcite-components/node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "peer": true, + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@esri/calcite-components/node_modules/sortablejs": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.1.tgz", + "integrity": "sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ==", + "peer": true + }, + "node_modules/@esri/calcite-components/node_modules/type-fest": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "peer": true, "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dev": true, + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "dev": true, "dependencies": { "@floating-ui/core": "^1.0.0", @@ -2727,12 +2812,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2740,10 +2825,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", - "dev": true + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.18.2", @@ -2786,9 +2870,9 @@ } }, "node_modules/@formatjs/intl": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.1.tgz", - "integrity": "sha512-dsLG15U7xDi8yzKf4hcAWSsCaez3XrjTO2oaRHPyHtXLm1aEzYbDw6bClo/HMHu+iwS5GbDqT3DV+hYP2ylScg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.2.tgz", + "integrity": "sha512-raPGWr3JRv3neXV78SqPFrGC05fIbhhNzVghHNxFde27ls2KkXiMhtP7HBybjGpikVSjjhdhaZto+4p1vmm9bQ==", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.18.2", @@ -2796,7 +2880,7 @@ "@formatjs/icu-messageformat-parser": "2.7.6", "@formatjs/intl-displaynames": "6.6.6", "@formatjs/intl-listformat": "7.5.5", - "intl-messageformat": "10.5.11", + "intl-messageformat": "10.5.12", "tslib": "^2.4.0" }, "peerDependencies": { @@ -3299,26 +3383,11 @@ "node": ">=10" } }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -3338,12 +3407,6 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -3631,22 +3694,43 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", + "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==", + "peer": true + }, + "node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "peer": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, "node_modules/@loaders.gl/3d-tiles": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-3.4.15.tgz", - "integrity": "sha512-JR67bEfLrD7Lzb6pWyEIRg2L6W3n6y43DKcWofRLpwPqLA7qHuY7SlO7E72Lz7Tniye8VhawqY1wO8gCx8T72Q==", - "dependencies": { - "@loaders.gl/draco": "3.4.15", - "@loaders.gl/gltf": "3.4.15", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/math": "3.4.15", - "@loaders.gl/tiles": "3.4.15", - "@math.gl/core": "^3.5.1", - "@math.gl/geospatial": "^3.5.1", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.2.1.tgz", + "integrity": "sha512-rDzWmdyE6YSd/QiqOO8n3LeRLZEP2LYHr6DffAItRzg464xsRjE4992MVvdn6B7yvB9FMrGeb1vshm89G0f8mw==", + "dependencies": { + "@loaders.gl/compression": "4.2.1", + "@loaders.gl/crypto": "4.2.1", + "@loaders.gl/draco": "4.2.1", + "@loaders.gl/gltf": "4.2.1", + "@loaders.gl/images": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/math": "4.2.1", + "@loaders.gl/tiles": "4.2.1", + "@loaders.gl/zip": "4.2.1", + "@math.gl/core": "^4.0.1", + "@math.gl/culling": "^4.0.1", + "@math.gl/geospatial": "^4.0.1", + "@probe.gl/log": "^4.0.4", "long": "^5.2.1" }, "peerDependencies": { - "@loaders.gl/core": "^3.4.0" + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/3d-tiles/node_modules/long": { @@ -3654,260 +3738,329 @@ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, + "node_modules/@loaders.gl/compression": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.2.1.tgz", + "integrity": "sha512-GaeAW9Cn355ClsB0bCw28/YvCd+n7kTPE6QgwaMzblc9HCvzqTwvcl2FdFg6YBbKGMjwhNVbKYAw9XmnlNzf1Q==", + "dependencies": { + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/worker-utils": "4.2.1", + "@types/brotli": "^1.3.0", + "@types/pako": "^1.0.1", + "fflate": "0.7.4", + "lzo-wasm": "^0.0.4", + "pako": "1.0.11", + "snappyjs": "^0.6.1" + }, + "optionalDependencies": { + "brotli": "^1.3.2", + "lz4js": "^0.2.0", + "zstd-codec": "^0.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/core": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-3.4.15.tgz", - "integrity": "sha512-rPOOTuusWlRRNMWg7hymZBoFmPCXWThsA5ZYRfqqXnsgVeQIi8hzcAhJ7zDUIFAd/OSR8ravtqb0SH+3k6MOFQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.2.1.tgz", + "integrity": "sha512-VadjNJaH3oixqhUgu4SbmEALar7ELinXbIh6gxYPhFNdEicPXmFT3qrZG49p9x6KG/iP3vWR2jOHgebyFMeXPg==", + "dependencies": { + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", + "@loaders.gl/worker-utils": "4.2.1", + "@probe.gl/log": "^4.0.2" + } + }, + "node_modules/@loaders.gl/crypto": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.2.1.tgz", + "integrity": "sha512-t8X5BOQRmXveDK/4Gz4vXCDMA9NiFzAuTdyTTwdJKmenvCRN+E6IH1OYmCHjo19DtHG0fzmp4DgocqOAaCUHEQ==", "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/worker-utils": "3.4.15", - "@probe.gl/log": "^3.5.0" + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/worker-utils": "4.2.1", + "@types/crypto-js": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/draco": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-3.4.15.tgz", - "integrity": "sha512-SStmyP0ZnS4JbWZb2NhrfiHW65uy3pVTTzQDTgXfkR5cD9oDAEu4nCaHbQ8x38/m39FHliCPgS9b1xWvLKQo8w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.2.1.tgz", + "integrity": "sha512-Iw2rL6Qi08xoiXlP63DcWa0M5znULrZPzlus3cmgrx2cPazT7Cp5nRG78z/XvsnriwhBZWAdb6saG3NRtLpHWA==", "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/schema": "3.4.15", - "@loaders.gl/worker-utils": "3.4.15", - "draco3d": "1.5.5" + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", + "@loaders.gl/worker-utils": "4.2.1", + "draco3d": "1.5.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/gis": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-3.4.15.tgz", - "integrity": "sha512-h+LJI35P6ze8DFPSUylTKuml0l4HIfHMczML6u+ZXG6E2w5tbdM3Eh5AzHjXGQPuwUnaYPn3Mq/2t2N1rz98pg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.2.1.tgz", + "integrity": "sha512-TH4/OBgchIDGvKdy9Tg/g+5Ue5yid7XgVslDtUAs6ZdW1qpKCWFAcOAnrKgaF7bT2W3caMWakfhJRoNySz9KBA==", "dependencies": { - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/schema": "3.4.15", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", "@mapbox/vector-tile": "^1.3.1", - "@math.gl/polygon": "^3.5.1", + "@math.gl/polygon": "^4.0.0", "pbf": "^3.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/gltf": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-3.4.15.tgz", - "integrity": "sha512-Y6kMNPLiHQPr6aWQw/4BMTxgPHWx3fcib4LPpZCbhyfM8PRn6pOqATVngUXdoOf5XY0QtdKVld6N1kxlr4pJtw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.2.1.tgz", + "integrity": "sha512-EjEQv3ovOskLDSrCzYiE1S7i4gCvrqYmgVc5ThkpCuDFwBszOZjLFtPscj9ORI7jof4JFosvzWx1Cn5DvRVIhA==", "dependencies": { - "@loaders.gl/draco": "3.4.15", - "@loaders.gl/images": "3.4.15", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/textures": "3.4.15", - "@math.gl/core": "^3.5.1" + "@loaders.gl/draco": "4.2.1", + "@loaders.gl/images": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", + "@loaders.gl/textures": "4.2.1", + "@math.gl/core": "^4.0.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/images": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-3.4.15.tgz", - "integrity": "sha512-QpjYhEetHabY/z9mWZYJXZZp4XJAxa38f9Ii/DjPlnJErepzY5GLBUTDHMu4oZ6n99gGImtuGFicDnFV6mb60g==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.2.1.tgz", + "integrity": "sha512-w/CPNmnqu1eutOo3BJ30ad3CXHPs5vPa9ZzwAL6PQSMb+rqaCRVCfHlaDedzBh+KyPfC9C+q62ouQvzUT5XKDg==", "dependencies": { - "@loaders.gl/loader-utils": "3.4.15" + "@loaders.gl/loader-utils": "4.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/loader-utils": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-3.4.15.tgz", - "integrity": "sha512-uUx6tCaky6QgCRkqCNuuXiUfpTzKV+ZlJOf6C9bKp62lpvFOv9AwqoXmL23j8nfsENdlzsX3vPhc3en6QQyksA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.1.tgz", + "integrity": "sha512-8algFDeaEB+ceXJK9/s/d/YjBfCEXXGrsIyGF18APfWTldzEwYoL/D8VV8RnklR7ICJjYCotBoF96USkoB9tMQ==", "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/worker-utils": "3.4.15", - "@probe.gl/stats": "^3.5.0" + "@loaders.gl/schema": "4.2.1", + "@loaders.gl/worker-utils": "4.2.1", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/math": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-3.4.15.tgz", - "integrity": "sha512-zTN8BUU/1fcppyVc8WzvdZcCyNGVYmNinxcn/A+a7mi1ug4OBGwEsZOj09Wjg0/s52c/cAL3h9ylPIZdjntscQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.2.1.tgz", + "integrity": "sha512-7y8RadrhGYZB3IH2URkj7+KS7OIqq6p11pYY9BL71+3C8CQ5dx1iWOcVQghpm1e7kgoSMLRJ2L93pVkCfLc7mA==", "dependencies": { - "@loaders.gl/images": "3.4.15", - "@loaders.gl/loader-utils": "3.4.15", - "@math.gl/core": "^3.5.1" + "@loaders.gl/images": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "@math.gl/core": "^4.0.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/mvt": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-3.4.15.tgz", - "integrity": "sha512-Q8e1ZyfNkJtPF/C4WSZ2qhWDEbzOvquP7OyG1NzQ2cp8R6eUfbexu48IgcnL/oAu8VPql3zIxQ+bQUyDReyN5g==", - "dependencies": { - "@loaders.gl/gis": "3.4.15", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/schema": "3.4.15", - "@math.gl/polygon": "^3.5.1", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.2.1.tgz", + "integrity": "sha512-k6c6BDeezDrrd9JGy3C/O1QwYc1iB61AR2wlryBUDGiTmBdA4YNPByMnvgR7ZJClIWEJcUeE2yEdgH1PTPdixw==", + "dependencies": { + "@loaders.gl/gis": "4.2.1", + "@loaders.gl/images": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", + "@math.gl/polygon": "^4.0.0", "pbf": "^3.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/schema": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-3.4.15.tgz", - "integrity": "sha512-8oRtstz0IsqES7eZd2jQbmCnmExCMtL8T6jWd1+BfmnuyZnQ0B6TNccy++NHtffHdYuzEoQgSELwcdmhSApYew==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.1.tgz", + "integrity": "sha512-uhcQmeOJDmosWGlGRVEwx5zCTcME6Fy7QiR+IuEZaUyEkcFJZU8Ccit4d5ap9gHz1avANzan/+h2dECSpjd8wg==", "dependencies": { "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/terrain": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-3.4.15.tgz", - "integrity": "sha512-ouv41J84uOnLEtXLM+iPEPFfeq7aRgIOls6esdvhBx2/dXJRNkt8Mx0wShXAi8VNHz77D+gZFrKARa7wqjmftg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/images": "3.4.15", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/schema": "3.4.15", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.2.1.tgz", + "integrity": "sha512-/XDW+5zOoYoJR2JwoDC+aoR3j+mHDWJ8cOlu6Nb6sldQHd85pIOdmBmOzBRGAc0gv1v0/ItDGEoDd0wPV9eBeg==", + "dependencies": { + "@loaders.gl/images": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", "@mapbox/martini": "^0.2.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/textures": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-3.4.15.tgz", - "integrity": "sha512-QHnmxBYtLvTdG1uMz2KWcxVY8KPb1+XyPJUoZV9GMcQkulz+CwFB8BaX8nROfMDz9KKYoPfksCzjig0LZ0WBJQ==", - "dependencies": { - "@loaders.gl/images": "3.4.15", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/schema": "3.4.15", - "@loaders.gl/worker-utils": "3.4.15", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.2.1.tgz", + "integrity": "sha512-gNLbNgKaLHuD68+ILXCx0XhxnTFEzWsHJ/1EVk48TjZ83EEYWNMsTwJhGtsu8U4CX/4D5vQ1Fc9oIT7mDR1JsQ==", + "dependencies": { + "@loaders.gl/images": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", + "@loaders.gl/worker-utils": "4.2.1", + "@math.gl/types": "^4.0.1", "ktx-parse": "^0.0.4", "texture-compressor": "^1.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/tiles": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-3.4.15.tgz", - "integrity": "sha512-o85aRSXq+YeVSK2ndW9aBwTMi5FhEsQ7k18J4DG+T5Oc+zz3tKui5X1SuBDiKbQN+kYtFpj0oYO1QG3ndNI6jg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.2.1.tgz", + "integrity": "sha512-XqctpHvcrZVhedd2WevHyLrkCho3F3CgCFyENJK9seR10O3/hez5cGwCFbbsqsnol+hR6r4VkEUH7QDq7Imxkw==", "dependencies": { - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/math": "3.4.15", - "@math.gl/core": "^3.5.1", - "@math.gl/culling": "^3.5.1", - "@math.gl/geospatial": "^3.5.1", - "@math.gl/web-mercator": "^3.5.1", - "@probe.gl/stats": "^3.5.0" + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/math": "4.2.1", + "@math.gl/core": "^4.0.0", + "@math.gl/culling": "^4.0.0", + "@math.gl/geospatial": "^4.0.0", + "@math.gl/web-mercator": "^4.0.0", + "@probe.gl/stats": "^4.0.2" }, "peerDependencies": { - "@loaders.gl/core": "^3.4.0" + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/wms": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-3.4.15.tgz", - "integrity": "sha512-zY++Oxx+cNGF9ptuSTFxCmEnpRbR5VZYjvyLraylaRbuynZv+JiWrehymFzEfq3hJcQ/cGvIjaG6rSVtPuqCIA==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/images": "3.4.15", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/schema": "3.4.15", - "@loaders.gl/xml": "3.4.15", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.2.1.tgz", + "integrity": "sha512-fdU5EYdq8oTtw4xUvZnjrgieqbog5B++iAlVuZNAMN+ws17Gjjkp+aaQclQ3ZIGd/IfKQLQ9ciZxLmqw2BeygA==", + "dependencies": { + "@loaders.gl/images": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", + "@loaders.gl/xml": "4.2.1", "@turf/rewind": "^5.1.5", - "deep-strict-equal": "^0.2.0", - "lerc": "^4.0.1" + "deep-strict-equal": "^0.2.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/worker-utils": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-3.4.15.tgz", - "integrity": "sha512-zUUepOYRYmcYIcr/c4Mchox9h5fBFNkD81rsGnLlZyq19QvyHzN+93SVxrLc078gw93t2RKrVcOOZY13zT3t1w==", - "dependencies": { - "@babel/runtime": "^7.3.1" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.1.tgz", + "integrity": "sha512-+cZEgmyHQ3SPYX8Lzeqd7JZaMPbbnJuQs7fyMbfBeb7hmkO4XNwo/tnk/vKSmP24YMugAbWrxRlKNI0CMbkOhw==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/xml": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-3.4.15.tgz", - "integrity": "sha512-iMWHaDzYSe8JoS8W5k9IbxQ6S3VHPr7M+UBejIVeYGCp1jzWF0ri498olwJWWDRvg4kqAWolrkj8Pcgkg8Jf8A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.2.1.tgz", + "integrity": "sha512-J7/RBuyD7vrgsITP4iCkAFppEXaSpXUXBWKQPa1aMzLm8UUdS3RcWgEcfDNQ9SURxKF78NsHOqkIv9TZpg1mSQ==", "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.4.15", - "@loaders.gl/schema": "3.4.15", + "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/schema": "4.2.1", "fast-xml-parser": "^4.2.5" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/zip": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.2.1.tgz", + "integrity": "sha512-t1LL+LYrLWJGYy8Bnj+RZu73awIgVLhPIzdHZgaV9RH6BCMb15HIwx1ritF1ESHgxgI2AIFvpRil2+hqJZsnjg==", + "dependencies": { + "@loaders.gl/compression": "4.2.1", + "@loaders.gl/crypto": "4.2.1", + "@loaders.gl/loader-utils": "4.2.1", + "jszip": "^3.1.5", + "md5": "^2.3.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" } }, "node_modules/@luma.gl/constants": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-8.5.21.tgz", - "integrity": "sha512-aJxayGxTT+IRd1vfpcgD/cKSCiVJjBNiuiChS96VulrmCvkzUOLvYXr42y5qKB4RyR7vOIda5uQprNzoHrhQAA==" + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.14.tgz", + "integrity": "sha512-mCZ5Sr39EX8AjPVy3v5W/XamaU6dtA5CEHCYLPdyMXEQ2snqsFut2Y4cOO/ySuOUccjEm4Y6Vb45BJKNMN8NyQ==" }, "node_modules/@luma.gl/core": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-8.5.21.tgz", - "integrity": "sha512-11jQJQEMoR/IN2oIsd4zFxiQJk6FE+xgVIMUcsCTBuzafTtQZ8Po9df8mt+MVewpDyBlTVs6g8nxHRH4np1ukA==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.14.tgz", + "integrity": "sha512-XkgCpVWGtfmEVTRbkkBu1HksjD1+3ZFqamNlCNgeWqsCcy0UZ2+iTF9qyxnT9K0QhdhnPgox6890A49C2iSRnw==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.21", - "@luma.gl/engine": "8.5.21", - "@luma.gl/gltools": "8.5.21", - "@luma.gl/shadertools": "8.5.21", - "@luma.gl/webgl": "8.5.21" + "@math.gl/types": "^4.0.0", + "@probe.gl/env": "^4.0.2", + "@probe.gl/log": "^4.0.2", + "@probe.gl/stats": "^4.0.2", + "@types/offscreencanvas": "^2019.6.4" } }, "node_modules/@luma.gl/engine": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-8.5.21.tgz", - "integrity": "sha512-IG3WQSKXFNUEs8QG7ZjHtGiOtsakUu+BAxtJ6997A6/F06yynZ44tPe5NU70jG9Yfu3kV0LykPZg7hO3vXZDiA==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.14.tgz", + "integrity": "sha512-7PuvXbcovFfXgCWC4eAZAPMzNAf3rfFo7Cd9FB7AEKLIwdYYN6nmn/PNjsZREa8eXK5ExDC8jDJ6lqtWrTqlyg==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.21", - "@luma.gl/gltools": "8.5.21", - "@luma.gl/shadertools": "8.5.21", - "@luma.gl/webgl": "8.5.21", - "@math.gl/core": "^3.5.0", - "@probe.gl/env": "^3.5.0", - "@probe.gl/stats": "^3.5.0", - "@types/offscreencanvas": "^2019.7.0" - } - }, - "node_modules/@luma.gl/experimental": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@luma.gl/experimental/-/experimental-8.5.21.tgz", - "integrity": "sha512-uFKPChGofyihOKxtqJy78QCQCDFnuMTK4QHrUX/qiTnvFSO8BgtTUevKvWGN9lBvq+uDD0lSieeF9yBzhQfAzw==", - "dependencies": { - "@luma.gl/constants": "8.5.21", - "@math.gl/core": "^3.5.0", - "earcut": "^2.0.6" + "@luma.gl/shadertools": "9.0.14", + "@math.gl/core": "^4.0.0", + "@probe.gl/log": "^4.0.2", + "@probe.gl/stats": "^4.0.2" }, "peerDependencies": { - "@loaders.gl/gltf": "^3.0.0", - "@loaders.gl/images": "^3.0.0", - "@luma.gl/engine": "^8.4.0", - "@luma.gl/gltools": "^8.4.0", - "@luma.gl/shadertools": "^8.4.0", - "@luma.gl/webgl": "^8.4.0" + "@luma.gl/core": "^9.0.0" } }, - "node_modules/@luma.gl/gltools": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@luma.gl/gltools/-/gltools-8.5.21.tgz", - "integrity": "sha512-6qZ0LaT2Mxa4AJT5F44TFoaziokYiHUwO45vnM/NYUOIu9xevcmS6VtToawytMEACGL6PDeDyVqP3Y80SDzq5g==", + "node_modules/@luma.gl/gltf": { + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.14.tgz", + "integrity": "sha512-0C1AWEJ7xHN95cSNQXjA6NMCJZJLBlKl+eI65KXLtwIEdWnEopIr/+u4HX11P1lEzPMrpj3KFeCzo+scG+1hPA==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.21", - "@probe.gl/env": "^3.5.0", - "@probe.gl/log": "^3.5.0", - "@types/offscreencanvas": "^2019.7.0" + "@loaders.gl/textures": "^4.2.0", + "@luma.gl/shadertools": "9.0.14", + "@math.gl/core": "^4.0.0" + }, + "peerDependencies": { + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" } }, "node_modules/@luma.gl/shadertools": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-8.5.21.tgz", - "integrity": "sha512-WQah7yFDJ8cNCLPYpIm3r0wSlXLvjoA279fcknmATvvkW3/i8PcCJ/nYEBJO3hHEwwMQxD16+YZu/uwGiifLMg==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.14.tgz", + "integrity": "sha512-4UFh/oQ+sRwERzuPf2flgMhHIbENU1xnHvXUzpzE3Z/+/DNljb2oSeMkW74fgpVmM6MuyHZhU1hM5RRq/mW3Tw==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@math.gl/core": "^3.5.0" + "@math.gl/core": "^4.0.0", + "@math.gl/types": "^4.0.0" + }, + "peerDependencies": { + "@luma.gl/core": "^9.0.0" } }, "node_modules/@luma.gl/webgl": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-8.5.21.tgz", - "integrity": "sha512-ZVLO4W5UuaOlzZIwmFWhnmZ1gYoU97a+heMqxLrSSmCUAsSu3ZETUex9gOmzdM1WWxcdWaa3M68rvKCNEgwz0Q==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.14.tgz", + "integrity": "sha512-TcgXPWaKVEVbnzB6Cu49Ia70oZny/GNy57OLj82kW7+llrKY5bpfOaD5aSIDEV34nqmmlpML4agPJXEIzeP/BQ==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.21", - "@luma.gl/gltools": "8.5.21", - "@probe.gl/env": "^3.5.0", - "@probe.gl/stats": "^3.5.0" + "@luma.gl/constants": "9.0.14", + "@probe.gl/env": "^4.0.2" + }, + "peerDependencies": { + "@luma.gl/core": "^9.0.0" } }, "node_modules/@mapbox/extent": { @@ -3946,11 +4099,6 @@ "geojson-extent": "bin/geojson-extent" } }, - "node_modules/@mapbox/geojson-extent/node_modules/rw": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz", - "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" - }, "node_modules/@mapbox/geojson-normalize": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@mapbox/geojson-normalize/-/geojson-normalize-0.0.1.tgz", @@ -4043,16 +4191,18 @@ } }, "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.1.1.tgz", - "integrity": "sha512-z85ARNPCBI2Cs5cPOS3DSbraTN+ue8zrcYVoSWBuNrD/mA+2SKAJ+hIzI22uN7gac6jBMnCdpPKRxS/V0KSZVQ==", + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.2.0.tgz", + "integrity": "sha512-BTw6/3ysowky22QMtNDjElp+YLwwvBDh3xxnq1izDFjTtUERm5nYSihlNZ6QaxXb+6lX2T2t0hBEjheAI+kBEQ==", "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.8", + "quickselect": "^2.0.0", "rw": "^1.3.3", - "sort-object": "^3.0.3" + "sort-object": "^3.0.3", + "tinyqueue": "^2.0.3" }, "bin": { "gl-style-format": "dist/gl-style-format.mjs", @@ -4060,65 +4210,57 @@ "gl-style-validate": "dist/gl-style-validate.mjs" } }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/@math.gl/core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-3.6.3.tgz", - "integrity": "sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-4.0.1.tgz", + "integrity": "sha512-9IewNjR9V66o+gYIIq5agFoHy6ZT6DRpRGQBfsUpZz4glAqOjVt64he8GGzjpmqfT+kKT4qwQ7nQl/hZLF15qA==", "dependencies": { - "@babel/runtime": "^7.12.0", - "@math.gl/types": "3.6.3", - "gl-matrix": "^3.4.0" + "@math.gl/types": "4.0.1" } }, "node_modules/@math.gl/culling": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/culling/-/culling-3.6.3.tgz", - "integrity": "sha512-3UERXHbaPlM6pnTk2MI7LeQ5CoelDZzDzghTTcv+HdQCZsT/EOEuEdYimETHtSxiyiOmsX2Un65UBLYT/rbKZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@math.gl/culling/-/culling-4.0.1.tgz", + "integrity": "sha512-lv83sMKp0n1HjORhuNtWgX9ylYyj+/zHEPF0xxRXZvcpurB85fhgFLhvR81KLjmSbhQmFgzl0fZe7Ei3WxEP5Q==", "dependencies": { - "@babel/runtime": "^7.12.0", - "@math.gl/core": "3.6.3", - "gl-matrix": "^3.4.0" + "@math.gl/core": "4.0.1" } }, "node_modules/@math.gl/geospatial": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/geospatial/-/geospatial-3.6.3.tgz", - "integrity": "sha512-6xf657lJnaecSarSzn02t0cnsCSkWb+39m4+im96v20dZTrLCWZ2glDQVzfuL91meDnDXjH4oyvynp12Mj5MFg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@math.gl/geospatial/-/geospatial-4.0.1.tgz", + "integrity": "sha512-FfTUMk8uRlBa4W3dMSFwPjRgdEBnOeVjBr3mcGqb3lHA/PPMvKuE+o7OJfA61Wj6ItuZqCEZHbLbA3WRAENoqQ==", "dependencies": { - "@babel/runtime": "^7.12.0", - "@math.gl/core": "3.6.3", - "gl-matrix": "^3.4.0" + "@math.gl/core": "4.0.1" } }, "node_modules/@math.gl/polygon": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-3.6.3.tgz", - "integrity": "sha512-FivQ1ZnYcAss1wVifOkHP/ZnlfQy1IL/769uzNtiHxwUbW0kZG3yyOZ9I7fwyzR5Hvqt3ErJKHjSYZr0uVlz5g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-4.0.1.tgz", + "integrity": "sha512-pwtEbwW3N5qy09K/1FwRYW7M2u9XMPBfIe8BNpkbJh8uH3DPXQdT4uCNFiwrQPPQUQTDdlQyLu/0mRHm2R/fbg==", "dependencies": { - "@math.gl/core": "3.6.3" + "@math.gl/core": "4.0.1" } }, "node_modules/@math.gl/sun": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-3.6.3.tgz", - "integrity": "sha512-mrx6CGYYeTNSQttvcw0KVUy+35YDmnjMqpO/o0t06Vcghrt0HNruB/ScRgUSbJrgkbOg1Vcqm23HBd++clzQzw==", - "dependencies": { - "@babel/runtime": "^7.12.0" - } + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-4.0.1.tgz", + "integrity": "sha512-nDkQZ9PKd5iMySRM1j01hYG6MwA/MkKXZe4JvArggWUtPXL6nCcPSeiifPXQGIvE9eZdQkbn81StNY9q5l0cFg==" }, "node_modules/@math.gl/types": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-3.6.3.tgz", - "integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-4.0.1.tgz", + "integrity": "sha512-E9qBKAjVBiZD8Is7TbygiLGtYBP3GSLus6RUJSuzFQegdYXeVagvrs4UkBJxhrRAxw4crfH0Tq7IhTMKuuJNQw==" }, "node_modules/@math.gl/web-mercator": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-3.6.3.tgz", - "integrity": "sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw==", - "dependencies": { - "@babel/runtime": "^7.12.0", - "gl-matrix": "^3.4.0" - } + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-4.0.1.tgz", + "integrity": "sha512-eJ0nDw8140kJorf8ASyKRC53rI+UG6vPxpsKJiGRD6lXsoKTeKYebeEAXiGDWTvi2AMe6+xngxTqqwm58fL3Fw==" }, "node_modules/@microsoft/api-extractor": { "version": "7.43.0", @@ -4296,9 +4438,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", - "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", + "version": "5.15.17", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.17.tgz", + "integrity": "sha512-DVAejDQkjNnIac7MfP8sLzuo7fyrBPxNdXe+6bYqOqg1z2OPTlfFAejSNzWe7UenRMuFu9/AyFXj/X2vN2w6dA==", "dev": true, "funding": { "type": "opencollective", @@ -4552,40 +4694,47 @@ "node": ">= 8" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "dev": true, + "node_modules/@open-wc/dedupe-mixin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", + "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", + "peer": true + }, + "node_modules/@polymer/polymer": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.5.1.tgz", + "integrity": "sha512-JlAHuy+1qIC6hL1ojEUfIVD58fzTpJAoCxFwV5yr0mYTXV1H8bz5zy0+rC963Cgr9iNXQ4T9ncSjC2fkF9BQfw==", + "peer": true, + "dependencies": { + "@webcomponents/shadycss": "^1.9.1" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@probe.gl/env": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.6.0.tgz", - "integrity": "sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==", - "dependencies": { - "@babel/runtime": "^7.0.0" - } + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.0.9.tgz", + "integrity": "sha512-AOmVMD0/j78mX+k4+qX7ZhE0sY9H+EaJgIO6trik0BwV6VcrwxTGCGFAeuRsIGhETDnye06tkLXccYatYxAYwQ==" }, "node_modules/@probe.gl/log": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.6.0.tgz", - "integrity": "sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-4.0.9.tgz", + "integrity": "sha512-ebuZaodSRE9aC+3bVC7cKRHT8garXeT1jTbj1R5tQRqQYc9iGeT3iemVOHx5bN9Q6gAs/0j54iPI+1DvWMAW4A==", "dependencies": { - "@babel/runtime": "^7.0.0", - "@probe.gl/env": "3.6.0" + "@probe.gl/env": "4.0.9" } }, "node_modules/@probe.gl/stats": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.6.0.tgz", - "integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==", - "dependencies": { - "@babel/runtime": "^7.0.0" - } + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-4.0.9.tgz", + "integrity": "sha512-Q9Xt/sJUQaMsbjRKjOscv2t7wXIymTrOEJ4a3da4FTCn7bkKvcdxdyFAQySCrtPxE+YZ5I5lXpWPgv9BwmpE1g==" }, "node_modules/@rollup/pluginutils": { "version": "5.1.0", @@ -4610,9 +4759,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", "cpu": [ "arm" ], @@ -4623,9 +4772,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", "cpu": [ "arm64" ], @@ -4636,9 +4785,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", "cpu": [ "arm64" ], @@ -4649,9 +4798,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", "cpu": [ "x64" ], @@ -4662,9 +4811,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", "cpu": [ "arm" ], @@ -4675,9 +4837,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", "cpu": [ "arm64" ], @@ -4688,9 +4850,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", "cpu": [ "arm64" ], @@ -4701,11 +4863,11 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", "cpu": [ - "ppc64le" + "ppc64" ], "dev": true, "optional": true, @@ -4714,9 +4876,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", "cpu": [ "riscv64" ], @@ -4727,9 +4889,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", "cpu": [ "s390x" ], @@ -4740,9 +4902,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", "cpu": [ "x64" ], @@ -4753,9 +4915,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", "cpu": [ "x64" ], @@ -4766,9 +4928,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", "cpu": [ "arm64" ], @@ -4779,9 +4941,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", "cpu": [ "ia32" ], @@ -4792,9 +4954,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", "cpu": [ "x64" ], @@ -4947,6 +5109,19 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@stencil/core": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.17.1.tgz", + "integrity": "sha512-nlARe1QtK5abnCG8kPQKJMWiELg39vKabvf3ebm6YEhQA35CgrxC1pVYTsYq3yktJKoY+k+VzGRnATLKyaLbvA==", + "peer": true, + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + } + }, "node_modules/@svgdotjs/svg.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.0.tgz", @@ -5006,6 +5181,19 @@ "@turf/invariant": "^5.1.5" } }, + "node_modules/@turf/boolean-clockwise/node_modules/@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==" + }, + "node_modules/@turf/boolean-clockwise/node_modules/@turf/invariant": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", + "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, "node_modules/@turf/boolean-point-in-polygon": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", @@ -5018,7 +5206,20 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-point-in-polygon/node_modules/@turf/helpers": { + "node_modules/@turf/clone": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz", + "integrity": "sha512-//pITsQ8xUdcQ9pVb4JqXiSqG4dos5Q9N4sYFoWghX21tfOV2dhc5TGqYOhnHrQS7RiKQL1vQ48kIK34gQ5oRg==", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@turf/clone/node_modules/@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==" + }, + "node_modules/@turf/helpers": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", @@ -5026,7 +5227,7 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-point-in-polygon/node_modules/@turf/invariant": { + "node_modules/@turf/invariant": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", @@ -5037,27 +5238,6 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/clone": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz", - "integrity": "sha512-//pITsQ8xUdcQ9pVb4JqXiSqG4dos5Q9N4sYFoWghX21tfOV2dhc5TGqYOhnHrQS7RiKQL1vQ48kIK34gQ5oRg==", - "dependencies": { - "@turf/helpers": "^5.1.5" - } - }, - "node_modules/@turf/helpers": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", - "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==" - }, - "node_modules/@turf/invariant": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", - "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", - "dependencies": { - "@turf/helpers": "^5.1.5" - } - }, "node_modules/@turf/meta": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", @@ -5066,6 +5246,11 @@ "@turf/helpers": "^5.1.5" } }, + "node_modules/@turf/meta/node_modules/@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==" + }, "node_modules/@turf/rewind": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-5.1.5.tgz", @@ -5078,6 +5263,19 @@ "@turf/meta": "^5.1.5" } }, + "node_modules/@turf/rewind/node_modules/@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==" + }, + "node_modules/@turf/rewind/node_modules/@turf/invariant": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", + "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -5125,6 +5323,66 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/brotli": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.4.tgz", + "integrity": "sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/color": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz", + "integrity": "sha512-NMiNcZFRUAiUUCCf7zkAelY8eV3aKqfbzyFQlXpPIEeoNDbsEHGpb854V3gzTsGKYj830I5zPuOwU/TP5/cW6A==", + "peer": true, + "dependencies": { + "@types/color-convert": "*" + } + }, + "node_modules/@types/color-convert": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.3.tgz", + "integrity": "sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==", + "peer": true, + "dependencies": { + "@types/color-name": "*" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==", + "peer": true + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==" + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-color": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.5.tgz", + "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==" + }, + "node_modules/@types/d3-scale": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.5.tgz", + "integrity": "sha512-YOpKj0kIEusRf7ofeJcSZQsvKbnTwpe1DUF+P2qsotqG53kEsjm7EzzliqQxMkAWdkZcHrg5rRhB4JiDOQPX+A==", + "dependencies": { + "@types/d3-time": "^2" + } + }, + "node_modules/@types/d3-time": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.4.tgz", + "integrity": "sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw==" + }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -5160,6 +5418,11 @@ "@types/geojson": "*" } }, + "node_modules/@types/google.maps": { + "version": "3.55.8", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.55.8.tgz", + "integrity": "sha512-aSyvlCRXzF9Jtjqq4zmA24sczKZ0QWJnn4zRrkufCoohHulS6LCf4KsF22eAlnHBuVYwEhQoMXIufUS7kXF5uA==" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -5235,6 +5498,11 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/junit-report-builder": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/junit-report-builder/-/junit-report-builder-3.0.2.tgz", + "integrity": "sha512-R5M+SYhMbwBeQcNXYWNCZkl09vkVfAtcPIaCGdzIkkbeaTrVbGQ7HVgi4s+EmM/M1K4ZuWQH0jGcvMvNePfxYA==" + }, "node_modules/@types/license-checker": { "version": "25.0.6", "resolved": "https://registry.npmjs.org/@types/license-checker/-/license-checker-25.0.6.tgz", @@ -5278,7 +5546,6 @@ "version": "18.19.31", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -5288,6 +5555,11 @@ "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" }, + "node_modules/@types/pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A==" + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -5357,6 +5629,12 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "peer": true + }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", @@ -5407,26 +5685,11 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5434,18 +5697,11 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", @@ -5554,26 +5810,11 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5581,12 +5822,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", @@ -5612,26 +5847,11 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5639,12 +5859,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", @@ -5662,6 +5876,186 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vaadin/a11y-base": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.13.tgz", + "integrity": "sha512-7iEbJiJM/+YIC/D7HzQUuU3OX27MhcNoX8k3mWLBQu8SCVGDerCZUlHCHfeFpbJc76aWDNUrvEhAzBVrM/mn+A==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.3.13", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/checkbox": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.13.tgz", + "integrity": "sha512-YT67/M31Dq7UKwtZ+hEUjOrVHnje+7wpf4aBYAeKoEqa57uw2Q9+lGTwoWgviVzXKtXhoQd/oLiNUaxeOVcNzA==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/component-base": "~24.3.13", + "@vaadin/field-base": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/component-base": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.13.tgz", + "integrity": "sha512-UjokKlcs3NVnUATmv03Av55dZGCqvRXEaY2N1PO0C5OYATNekF5wlnz2nQ1+j1Tvk9eI+bzZKN28Yu0S3kvl0A==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/vaadin-development-mode-detector": "^2.0.0", + "@vaadin/vaadin-usage-statistics": "^2.1.0", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/field-base": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.13.tgz", + "integrity": "sha512-Qc2OUaBDGbskBnnSlDNhQd682tL8QlpqFfoS9lrZhRV286OlkfEiQ06kMZc75Q9fIeVIz3S2BPhtdoxd/8Tc4w==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/component-base": "~24.3.13", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/grid": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.13.tgz", + "integrity": "sha512-oRNP9V6d7khFlB49wDfPfHG1fHFImc9dagX9Tlatpo3j1TLJ9JlfkrdWsuYY1aYtYnx5huvH3iOAV93fV1CFFg==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/checkbox": "~24.3.13", + "@vaadin/component-base": "~24.3.13", + "@vaadin/lit-renderer": "~24.3.13", + "@vaadin/text-field": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13" + } + }, + "node_modules/@vaadin/icon": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.13.tgz", + "integrity": "sha512-uH28N3fYJO6FObz+WLNfqHLm2VPbL1hNkmoU/yDiMldfIyTqpbSO2DlwNMXbsm3T8xkJRlHM+LWATheMsIynOw==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/input-container": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.13.tgz", + "integrity": "sha512-Rg77JYKwxMdnTqxTIQWkaiNCZGiI4sIP3V6sxYJxqn0v1Nwwy80OQ5nzGQj+KyNk4B6SajmAwgHbu+IcFthN1A==", + "peer": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/lit-renderer": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.13.tgz", + "integrity": "sha512-5/qtyj6YfdM7BjwH9cpA1y0rPRdKQYr2s6Ze/Ocgfb26DUR6n4daXzilB3TceUanvAFFScGx16CqlA/my1cozQ==", + "peer": true, + "dependencies": { + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/text-field": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.13.tgz", + "integrity": "sha512-+f0DGrD+KmVw6s75Gdprugb01LYhsCdLgc2QLTrNjmyx/kvNfw76jTHZEeUuYYjxTMVyKXVstcWxG/oWt/sZSQ==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/component-base": "~24.3.13", + "@vaadin/field-base": "~24.3.13", + "@vaadin/input-container": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/vaadin-development-mode-detector": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", + "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==", + "peer": true + }, + "node_modules/@vaadin/vaadin-lumo-styles": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.13.tgz", + "integrity": "sha512-43h6sKTVdNJ2Gv3mTcD1oVHjrNKj28Zs+VqcTUS5Vn2bxmGsIm3V5qLMdSe5GWNeZPbl+5dFa1VjFUjQWElMYw==", + "peer": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.3.13", + "@vaadin/icon": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13" + } + }, + "node_modules/@vaadin/vaadin-material-styles": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.13.tgz", + "integrity": "sha512-TG+y/YPI4M2rXkkyzbb6EzLl2dFaf+sNEH7tZXz4RLAUciKC7QHgpEESwQ0mfdonov2xP9Op48eBhkWalhKxDA==", + "peer": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13" + } + }, + "node_modules/@vaadin/vaadin-themable-mixin": { + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.13.tgz", + "integrity": "sha512-OmDLX92U1tefwgnmlP/OBsf/z/GGjy3IOoEUqEPCgf01+xB6wM6uCRaY1dBU8NgHQeaJq80YzQjP0z5D+SqTkA==", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/vaadin-usage-statistics": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.2.tgz", + "integrity": "sha512-xKs1PvRfTXsG0eWWcImLXWjv7D+f1vfoIvovppv6pZ5QX8xgcxWUdNgERlOOdGt3CTuxQXukTBW3+Qfva+OXSg==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@vaadin/vaadin-development-mode-detector": "^2.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", @@ -5710,26 +6104,26 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", + "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", + "@babel/parser": "^7.24.4", + "@vue/shared": "3.4.27", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", + "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-core": "3.4.27", + "@vue/shared": "3.4.27" } }, "node_modules/@vue/language-core": { @@ -5758,11 +6152,28 @@ } }, "node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", + "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==", "dev": true }, + "node_modules/@webcomponents/shadycss": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", + "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", + "peer": true + }, + "node_modules/@zip.js/zip.js": { + "version": "2.7.44", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.44.tgz", + "integrity": "sha512-ZzMhAcAyRAYi1FZELsvKaw8I4ADxNTqbiVIjyo/syBe4HGWop9+OADnuBnHpm2TxgXPogxxhhPffOhDD40jUdA==", + "peer": true, + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -5880,6 +6291,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5939,7 +6362,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -6074,7 +6496,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -6125,7 +6546,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -6274,13 +6694,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -6301,12 +6721,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6357,6 +6777,26 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -6378,6 +6818,15 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "optional": true, + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", @@ -6466,7 +6915,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6499,9 +6947,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001605", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", - "integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", + "version": "1.0.30001620", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", + "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", "dev": true, "funding": [ { @@ -6539,14 +6987,6 @@ "node": ">=4" } }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -6556,6 +6996,14 @@ "node": ">=10" } }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, "node_modules/cheap-ruler": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/cheap-ruler/-/cheap-ruler-3.0.2.tgz", @@ -6577,9 +7025,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, "node_modules/cliui": { @@ -6597,9 +7045,9 @@ } }, "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "dev": true, "engines": { "node": ">=6" @@ -6621,6 +7069,19 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -6634,6 +7095,34 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "peer": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, "node_modules/colorbrewer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.0.0.tgz", @@ -6652,9 +7141,20 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/composed-offset-position": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.4.tgz", + "integrity": "sha512-vMlvu1RuNegVE0YsCDSV/X4X10j56mq7PCIyOKK74FxkXzGLwhOUmdkJLSdOBOMwWycobGUMgft2lp+YgTe8hw==", + "peer": true }, "node_modules/computeds": { "version": "0.0.1", @@ -6687,9 +7187,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -6699,6 +7199,11 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -6826,11 +7331,25 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, "node_modules/csscolorparser": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "peer": true + }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -6879,27 +7398,6 @@ "node": ">=12" } }, - "node_modules/d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, "node_modules/d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", @@ -6979,7 +7477,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -6996,7 +7493,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -7013,7 +7509,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -7026,6 +7521,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "peer": true + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -7066,28 +7567,48 @@ "dev": true }, "node_modules/deck.gl": { - "version": "8.9.35", - "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-8.9.35.tgz", - "integrity": "sha512-qP5A/Q2I7hRKrVagbSifiAg4tTe0IdMhc3pgDt0XMm1xV5P+aKa6GQMljXFSRRQyQ5UEN2uCHEiL18g/ZiqChQ==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@deck.gl/aggregation-layers": "8.9.35", - "@deck.gl/carto": "8.9.35", - "@deck.gl/core": "8.9.35", - "@deck.gl/extensions": "8.9.35", - "@deck.gl/geo-layers": "8.9.35", - "@deck.gl/google-maps": "8.9.35", - "@deck.gl/json": "8.9.35", - "@deck.gl/layers": "8.9.35", - "@deck.gl/mapbox": "8.9.35", - "@deck.gl/mesh-layers": "8.9.35", - "@deck.gl/react": "8.9.35" + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.14.tgz", + "integrity": "sha512-xjNLOT1WB5iAZ1Rtui1g9yXALiCQQW7IbEVSYRb+UTgLFtr/c0FZDksn1sT1S7IstAuzOXTmgq3fpXSvKdDrsA==", + "dependencies": { + "@deck.gl/aggregation-layers": "9.0.14", + "@deck.gl/arcgis": "9.0.14", + "@deck.gl/carto": "9.0.14", + "@deck.gl/core": "9.0.14", + "@deck.gl/extensions": "9.0.14", + "@deck.gl/geo-layers": "9.0.14", + "@deck.gl/google-maps": "9.0.14", + "@deck.gl/json": "9.0.14", + "@deck.gl/layers": "9.0.14", + "@deck.gl/mapbox": "9.0.14", + "@deck.gl/mesh-layers": "9.0.14", + "@deck.gl/react": "9.0.14", + "@deck.gl/widgets": "9.0.14", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "^9.0.11", + "@luma.gl/engine": "^9.0.11" + }, + "peerDependencies": { + "@arcgis/core": "^4.0.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + }, + "peerDependenciesMeta": { + "@arcgis/core": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -7128,7 +7649,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -7145,7 +7665,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -7252,9 +7771,9 @@ } }, "node_modules/draco3d": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.5.tgz", - "integrity": "sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q==" + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" }, "node_modules/earcut": { "version": "2.2.4", @@ -7262,9 +7781,9 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "node_modules/electron-to-chromium": { - "version": "1.4.723", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz", - "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==", + "version": "1.4.772", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.772.tgz", + "integrity": "sha512-jFfEbxR/abTTJA3ci+2ok1NTuOBBtB4jH+UT6PUmRN+DY3WSD4FFRsgoVQ+QNIJ0T7wrXwzsWCI2WKC46b++2A==", "dev": true }, "node_modules/emittery": { @@ -7322,7 +7841,6 @@ "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -7382,7 +7900,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -7394,20 +7911,19 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", @@ -7428,7 +7944,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -7440,7 +7955,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -7463,7 +7977,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -7524,14 +8037,11 @@ } }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/escodegen": { @@ -7555,6 +8065,15 @@ "source-map": "~0.6.1" } }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7730,6 +8249,15 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint-plugin-react/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7772,15 +8300,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -7885,6 +8404,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -7927,18 +8458,6 @@ "node": ">= 4" } }, - "node_modules/eslint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7952,13 +8471,10 @@ } }, "node_modules/eslint/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -7978,24 +8494,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -8044,6 +8542,15 @@ "node": ">=0.10" } }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -8056,7 +8563,7 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { + "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -8065,6 +8572,21 @@ "node": ">=4.0" } }, + "node_modules/esri-loader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/esri-loader/-/esri-loader-3.7.0.tgz", + "integrity": "sha512-cB1Sw9EQjtW4mtT7eFBjn/6VaaIWNTjmTd2asnnEyuZk1xVSFRMCfLZSBSjZM7ZarDcVu5WIjOP0t0MYVu4hVQ==", + "deprecated": "Use @arcgis/core instead." + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -8129,9 +8651,9 @@ } }, "node_modules/expression-eval": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/expression-eval/-/expression-eval-2.1.0.tgz", - "integrity": "sha512-FUJO/Akvl/JOWkvlqZaqbkhsEWlCJWDeZG4tzX96UH68D9FeRgYgtb55C2qtqbORC0Q6x5419EDjWu4IT9kQfg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/expression-eval/-/expression-eval-5.0.1.tgz", + "integrity": "sha512-7SL4miKp19lI834/F6y156xlNg+i9Q41tteuGNCq9C06S78f1bm3BXuvf0+QpQxv369Pv/P2R7Hb17hzxLpbDA==", "deprecated": "The expression-eval npm package is no longer maintained. The package was originally published as part of a now-completed personal project, and I do not have incentives to continue maintenance.", "dependencies": { "jsep": "^0.3.0" @@ -8227,6 +8749,11 @@ "bser": "2.1.1" } }, + "node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8290,11 +8817,19 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "peer": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -8368,7 +8903,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -8392,7 +8926,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8434,7 +8967,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -8473,7 +9005,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -8590,7 +9121,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -8625,7 +9155,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -8651,9 +9180,9 @@ "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" }, "node_modules/h3-js": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-3.7.2.tgz", - "integrity": "sha512-LPjlHSwB9zQZrMqKloCZmmmt3yZzIK7nqPcXqwU93zT3TtYG6jP4tZBzAPouxut7lLjdFbMQ75wRBiKfpsnY7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.1.0.tgz", + "integrity": "sha512-LQhmMl1dRQQjMXPzJc7MpZ/CqPOWWuAvVEoVJM9n/s7vHypj+c3Pd5rLQCkAsOgAoAYKbNCsYFE++LF7MvSfCQ==", "engines": { "node": ">=4", "npm": ">=3", @@ -8672,7 +9201,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8689,7 +9217,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -8701,7 +9228,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8713,7 +9239,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8725,7 +9250,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -8840,11 +9364,12 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -8889,6 +9414,11 @@ "node": ">=6.9.0" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -8962,8 +9492,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -8974,7 +9503,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -8993,9 +9521,9 @@ } }, "node_modules/intl-messageformat": { - "version": "10.5.11", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", - "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", + "version": "10.5.12", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.12.tgz", + "integrity": "sha512-izl0uxhy/melhw8gP2r8pGiVieviZmM4v5Oqx3c1/R7g9cwER2smmGfSjcIsp8Y3Q53bfciL/gkxacJRx/dUvg==", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.18.2", @@ -9008,7 +9536,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -9044,7 +9571,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -9056,7 +9582,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9068,11 +9593,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -9095,7 +9624,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, "dependencies": { "is-typed-array": "^1.1.13" }, @@ -9110,7 +9638,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9216,7 +9743,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -9237,7 +9763,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9269,7 +9794,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9297,7 +9821,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, "dependencies": { "call-bind": "^1.0.7" }, @@ -9324,7 +9847,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9339,7 +9861,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -9354,7 +9875,6 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, "dependencies": { "which-typed-array": "^1.1.14" }, @@ -9381,7 +9901,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -9408,8 +9927,7 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", @@ -9570,7 +10088,22 @@ "p-limit": "^3.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-circus": { @@ -9662,110 +10195,22 @@ "node": ">=8" } }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-circus/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-cli/node_modules/supports-color": { + "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -10574,6 +11019,21 @@ "node": ">=8" } }, + "node_modules/jest-runner/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10778,26 +11238,11 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -10817,12 +11262,6 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -11137,6 +11576,109 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -11302,6 +11844,17 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/kdbush": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", @@ -11344,11 +11897,6 @@ "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.0.4.tgz", "integrity": "sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A==" }, - "node_modules/lerc": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lerc/-/lerc-4.0.4.tgz", - "integrity": "sha512-nHZH+ffiGPkgKUQtiZrljGUGV2GddvPcVTV5E345ZFncbKz+/rBIjDPrSxkiqW0EAtg1Jw7qAgRdaCwV+95Fow==" - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -11410,11 +11958,50 @@ "semver": "bin/semver" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/lit": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.3.tgz", + "integrity": "sha512-l4slfspEsnCcHVRTvaP7YnkTZEZggNFywLEIhQaGhYDczG+tu/vlgm/KaWIEjIp+ZyV20r2JnZctMb8LeLCG7Q==", + "peer": true, + "dependencies": { + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-element": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", + "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", + "peer": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-html": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", + "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", + "peer": true, + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -11433,6 +12020,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "peer": true + }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -11501,16 +12094,33 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/lz4js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/lz4js/-/lz4js-0.2.0.tgz", + "integrity": "sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==", + "optional": true + }, + "node_modules/lzo-wasm": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/lzo-wasm/-/lzo-wasm-0.0.4.tgz", + "integrity": "sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw==" + }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, "node_modules/make-dir": { @@ -11528,26 +12138,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -11555,12 +12150,6 @@ "node": ">=10" } }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -11577,9 +12166,9 @@ } }, "node_modules/mapbox-gl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.2.0.tgz", - "integrity": "sha512-v8S7x+wTr35kJ9nqzgn/VPiSFZxBkyQhwCk9bdyiFHVwCukNGG3LXt03FoaHHTsOuB9JWenWE96k0Uw+HGMZ8w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.3.0.tgz", + "integrity": "sha512-cVeAu9PxPTx113AnJAzcSKbBtL5F5EpJ6/NuYgNib9zNduNSoDG2oVX6xK0bAP/VwwVwRh9SEhcyM7nh4GThvQ==", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", @@ -11592,6 +12181,7 @@ "cheap-ruler": "^3.0.1", "csscolorparser": "~1.0.3", "earcut": "^2.2.4", + "fflate": "^0.8.1", "geojson-vt": "^3.2.1", "gl-matrix": "^3.4.3", "grid-index": "^1.1.0", @@ -11604,15 +12194,26 @@ "rw": "^1.3.3", "serialize-to-js": "^3.1.2", "supercluster": "^8.0.0", + "tiny-lru": "^11.2.5", "tinyqueue": "^2.0.3", "tweakpane": "^4.0.3", "vt-pbf": "^3.1.3" } }, + "node_modules/mapbox-gl/node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, + "node_modules/mapbox-gl/node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/maplibre-gl": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.1.2.tgz", - "integrity": "sha512-98T+3BesL4w/N39q/rgs9q6HzHLG6pgbS9UaTqg6fMISfzy2WGKokjK205ENFDDmEljj54/LTfdXgqg2XfYU4A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.3.0.tgz", + "integrity": "sha512-lmv1iUJAWYde6KyGk0ln2WIJbQ/S3Fu3HZTQ9sCgVxPaB3X0aXJbFDsIer+kGrh2+ArhyuM7NzF1dB2nPl4bGQ==", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", @@ -11621,9 +12222,10 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.1.1", + "@maplibre/maplibre-gl-style-spec": "^20.2.0", "@types/geojson": "^7946.0.14", "@types/geojson-vt": "3.2.5", + "@types/junit-report-builder": "^3.0.2", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", "@types/pbf": "^3.0.5", @@ -11649,12 +12251,14 @@ "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" } }, - "node_modules/math.gl": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/math.gl/-/math.gl-3.6.3.tgz", - "integrity": "sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==", + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "dependencies": { - "@math.gl/core": "3.6.3" + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, "node_modules/merge-stream": { @@ -11897,9 +12501,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", "dev": true }, "node_modules/object-assign": { @@ -11915,7 +12519,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11924,7 +12527,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -11933,7 +12535,6 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -12038,17 +12639,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -12083,15 +12684,15 @@ } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12109,21 +12710,6 @@ "node": ">=8" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -12133,6 +12719,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -12232,9 +12823,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -12273,7 +12864,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -12311,6 +12901,15 @@ "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" }, + "node_modules/preact": { + "version": "10.22.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", + "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -12373,6 +12972,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -12449,9 +13053,9 @@ ] }, "node_modules/quadbin": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/quadbin/-/quadbin-0.1.9.tgz", - "integrity": "sha512-5V6m6+cL/6+uBl3hYL+CWF06rRvlHkIepYKGQjTLYaHhu9InPppql0+0ROiCaOQdz8gPNlgge3glk5Qg1mWOYw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/quadbin/-/quadbin-0.2.0.tgz", + "integrity": "sha512-bPgyRreIsFVwKxHRY+GFdaXatNmfQ1LzaQZj7aKEz07/gL893uWREhmRZpG6UuvlGHdTOPw/NGvqLsJica2goA==", "dependencies": { "@mapbox/tile-cover": "3.0.1" }, @@ -12491,9 +13095,9 @@ "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "peer": true, "dependencies": { "loose-envify": "^1.1.0" @@ -12503,33 +13107,33 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "peer": true, "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-intl": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.6.4.tgz", - "integrity": "sha512-bD+7hVTX3zBFI3z/ffIVZrNkCVK0/sQguQ/DqW5uZ6JFWsuiwOieVcLnmtFiUgMQZLdmwNl2Ur5c10RaO7NWBQ==", + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.6.6.tgz", + "integrity": "sha512-dKXQNUrhZTlCp8uelYW8PHiM4saNKyLmHCfsJYWK0N/kZ/Ien35wjPHB8x9yQcTJbeN/hBOmb4x16iKUrdL9MA==", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.18.2", "@formatjs/icu-messageformat-parser": "2.7.6", - "@formatjs/intl": "2.10.1", + "@formatjs/intl": "2.10.2", "@formatjs/intl-displaynames": "6.6.6", "@formatjs/intl-listformat": "7.5.5", "@types/hoist-non-react-statics": "^3.3.1", "@types/react": "16 || 17 || 18", "hoist-non-react-statics": "^3.3.2", - "intl-messageformat": "10.5.11", + "intl-messageformat": "10.5.12", "tslib": "^2.4.0" }, "peerDependencies": { @@ -12543,9 +13147,9 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/react-map-gl": { @@ -12594,10 +13198,15 @@ "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==" }, + "node_modules/react-map-gl/node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12657,6 +13266,25 @@ "npm-normalize-package-bin": "^1.0.0" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/readdir-scoped-modules": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", @@ -12727,7 +13355,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -12895,9 +13522,9 @@ } }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -12910,21 +13537,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", "fsevents": "~2.3.2" } }, @@ -12952,15 +13580,14 @@ } }, "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz", + "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -12974,11 +13601,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -12994,7 +13625,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/saxes": { "version": "6.0.0", @@ -13009,9 +13641,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "peer": true, "dependencies": { "loose-envify": "^1.1.0" @@ -13038,7 +13670,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -13055,7 +13686,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -13080,6 +13710,11 @@ "node": ">=0.10.0" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -13105,7 +13740,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -13125,6 +13759,21 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "peer": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "peer": true + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -13199,6 +13848,11 @@ "node": "*" } }, + "node_modules/snappyjs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", + "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==" + }, "node_modules/sort-asc": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", @@ -13231,6 +13885,12 @@ "node": ">=0.10.0" } }, + "node_modules/sortablejs": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz", + "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==", + "peer": true + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -13388,6 +14048,14 @@ "node": ">=8" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -13454,7 +14122,6 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13472,7 +14139,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13486,7 +14152,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13587,6 +14252,12 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "peer": true + }, "node_modules/table": { "version": "6.8.2", "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", @@ -13604,15 +14275,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -13685,6 +14356,23 @@ "integrity": "sha512-cxHzpa5JgsugY9NUVRH43gPaGJw/29LecAn4X7UGOP64+kB8pU4VQ3bIhSyfb5Mk4jDxwl3yk330L/EIhbJ5aw==", "deprecated": "This module is now under the @mapbox namespace: install @mapbox/tilebelt instead" }, + "node_modules/timezone-groups": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/timezone-groups/-/timezone-groups-0.8.0.tgz", + "integrity": "sha512-t7E/9sPfCU0m0ZbS7Cqw52D6CB/UyeaiIBmyJCokI1SyOyOgA/ESiQ/fbreeFaUG9QSenGlZSSk/7rEbkipbOA==", + "peer": true, + "bin": { + "timezone-groups": "dist/cli.cjs" + } + }, + "node_modules/tiny-lru": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.2.6.tgz", + "integrity": "sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA==", + "engines": { + "node": ">=12" + } + }, "node_modules/tinyqueue": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", @@ -13717,9 +14405,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -13744,9 +14432,14 @@ } }, "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", + "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==", + "dependencies": { + "gopd": "^1.0.1", + "typedarray.prototype.slice": "^1.0.3", + "which-typed-array": "^1.1.15" + }, "engines": { "node": ">= 0.4" }, @@ -13818,26 +14511,11 @@ } } }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -13845,12 +14523,6 @@ "node": ">=10" } }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -13942,9 +14614,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" @@ -13957,7 +14629,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -13971,7 +14642,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -13990,7 +14660,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -14010,7 +14679,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -14026,6 +14694,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", + "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-offset": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", @@ -14056,7 +14743,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -14070,8 +14756,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -14137,9 +14822,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -14156,8 +14841,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -14185,6 +14870,11 @@ "requires-port": "^1.0.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/util-extend": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", @@ -14228,9 +14918,9 @@ } }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "dev": true, "engines": { "node": ">= 0.10" @@ -14347,9 +15037,9 @@ } }, "node_modules/vite-plugin-eslint/node_modules/@types/eslint": { - "version": "8.56.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz", - "integrity": "sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -14420,26 +15110,11 @@ "typescript": "*" } }, - "node_modules/vue-tsc/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/vue-tsc/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -14447,12 +15122,6 @@ "node": ">=10" } }, - "node_modules/vue-tsc/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -14500,18 +15169,6 @@ "node": ">=12" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", @@ -14553,7 +15210,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -14613,7 +15269,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -14628,6 +15283,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -14698,9 +15362,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" @@ -14733,6 +15397,28 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xss": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz", + "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", + "peer": true, + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -14833,15 +15519,11 @@ "commander": "^9.4.1" } }, - "node_modules/z-schema/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } + "node_modules/zstd-codec": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.4.tgz", + "integrity": "sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A==", + "optional": true } } } diff --git a/package.json b/package.json index 22093f3b..2703a72d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^8.9.35", + "deck.gl": "^9.0.14", "geolib": "^3.3.4", "mapbox-gl": "^3.2.0", "maplibre-gl": "^4.1.2", @@ -59,12 +59,13 @@ "@types/eslint-config-prettier": "^6.11.3", "@types/jest": "^29.5.12", "@types/license-checker": "^25.0.6", - "@types/mapbox-gl": "^3.1.0", "@types/mapbox__mapbox-gl-draw": "^1.4.6", + "@types/mapbox-gl": "^3.1.0", "@types/node": "^18.19.31", "@types/react": "^18.2.75", "@types/react-dom": "^18.2.24", "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react": "^4.2.1", "babel-jest": "^29.7.0", "eslint": "^7.32.0", diff --git a/src/components/network-map-viewer/network/layers/arrow-layer.js b/src/components/network-map-viewer/network/layers/arrow-layer.js index e9af855a..5d8b9e42 100644 --- a/src/components/network-map-viewer/network/layers/arrow-layer.js +++ b/src/components/network-map-viewer/network/layers/arrow-layer.js @@ -5,15 +5,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { Layer, project32, picking } from '@deck.gl/core'; -import GL from '@luma.gl/constants'; -import { - Model, - Geometry, - Texture2D, - FEATURES, - hasFeatures, - isWebGL2, -} from '@luma.gl/core'; +import { GL } from '@luma.gl/constants'; +import { Model, Geometry } from '@luma.gl/engine'; import vs from './arrow-layer-vertex.glsl'; import fs from './arrow-layer-fragment.glsl'; @@ -76,17 +69,16 @@ export class ArrowLayer extends Layer { return attributes; } - initializeState() { - const { gl } = this.context; + initializeState(context) { + const { device } = context; - if (!hasFeatures(gl, [FEATURES.TEXTURE_FLOAT])) { + if (!device.features.has('texture-blend-float-webgl')) { throw new Error('Arrow layer not supported on this browser'); } - const maxTextureSize = gl.getParameter(GL.MAX_TEXTURE_SIZE); + const maxTextureSize = device.getParametersWebGL(GL.MAX_TEXTURE_SIZE); this.state = { maxTextureSize, - webgl2: isWebGL2(gl), }; this.getAttributeManager().addInstanced({ @@ -114,7 +106,7 @@ export class ArrowLayer extends Layer { size: 1, transition: true, accessor: 'getDistance', - type: GL.FLOAT, + type: 'float32', defaultValue: 0, }, instanceArrowDirection: { @@ -181,13 +173,13 @@ export class ArrowLayer extends Layer { }); } - finalizeState() { - super.finalizeState(); + finalizeState(context) { + super.finalizeState(context); // we do not use setState to avoid a redraw, it is just used to stop the animation this.state.stop = true; } - createTexture2D(gl, data, elementSize, format, dataFormat) { + createTexture2D(device, data, elementSize, format, dataFormat) { const start = performance.now(); // we calculate the smallest square texture that is a power of 2 but less or equals to MAX_TEXTURE_SIZE @@ -210,7 +202,7 @@ export class ArrowLayer extends Layer { data.fill(0, oldLength, textureSize * textureSize * elementSize); } - const texture2d = new Texture2D(gl, { + const texture2d = device.createTexture({ width: textureSize, height: textureSize, format: format, @@ -303,7 +295,7 @@ export class ArrowLayer extends Layer { changeFlags.updateTriggersChanged.getLinePositions)); if (geometryChanged) { - const { gl } = this.context; + const { device } = this.context; const { linePositionsTextureData, @@ -312,14 +304,14 @@ export class ArrowLayer extends Layer { } = this.createTexturesStructure(props); const linePositionsTexture = this.createTexture2D( - gl, + device, linePositionsTextureData, 2, this.state.webgl2 ? GL.RG32F : GL.LUMINANCE_ALPHA, this.state.webgl2 ? GL.RG : GL.LUMINANCE_ALPHA ); const lineDistancesTexture = this.createTexture2D( - gl, + device, lineDistancesTextureData, 1, this.state.webgl2 ? GL.R32F : GL.LUMINANCE, @@ -339,8 +331,8 @@ export class ArrowLayer extends Layer { } updateModel({ changeFlags }) { - if (changeFlags.extensionsChanged) { - const { gl } = this.context; + if (changeFlags.somethingChanged) { + const { device } = this.context; const { model } = this.state; if (model) { @@ -348,7 +340,7 @@ export class ArrowLayer extends Layer { } this.setState({ - model: this._getModel(gl), + model: this._getModel(device), }); this.getAttributeManager().invalidateAll(); @@ -392,47 +384,47 @@ export class ArrowLayer extends Layer { const { sizeMinPixels, sizeMaxPixels } = this.props; const { + model, linePositionsTexture, lineDistancesTexture, timestamp, webgl2, } = this.state; - this.state.model - .setUniforms(uniforms) - .setUniforms({ - sizeMinPixels, - sizeMaxPixels, - linePositionsTexture, - lineDistancesTexture, - linePositionsTextureSize: [ - linePositionsTexture.width, - linePositionsTexture.height, - ], - lineDistancesTextureSize: [ - lineDistancesTexture.width, - lineDistancesTexture.height, - ], - timestamp, - webgl2, - distanceBetweenLines: this.props.getDistanceBetweenLines, - maxParallelOffset: this.props.maxParallelOffset, - minParallelOffset: this.props.minParallelOffset, - }) - .draw(); + model.setUniforms({ + ...uniforms, + sizeMinPixels, + sizeMaxPixels, + linePositionsTexture, + lineDistancesTexture, + linePositionsTextureSize: [ + linePositionsTexture.width, + linePositionsTexture.height, + ], + lineDistancesTextureSize: [ + lineDistancesTexture.width, + lineDistancesTexture.height, + ], + timestamp, + webgl2, + distanceBetweenLines: this.props.getDistanceBetweenLines, + maxParallelOffset: this.props.maxParallelOffset, + minParallelOffset: this.props.minParallelOffset, + }); + model.draw(); } - _getModel(gl) { + _getModel(device) { const positions = [ -1, -1, 0, 0, 1, 0, 0, -0.6, 0, 1, -1, 0, 0, 1, 0, 0, -0.6, 0, ]; return new Model( - gl, + device, Object.assign(this.getShaders(), { id: this.props.id, geometry: new Geometry({ - drawMode: GL.TRIANGLES, + topology: 'triangle-list', vertexCount: 6, attributes: { positions: { diff --git a/src/components/network-map-viewer/network/layers/fork-line-layer.js b/src/components/network-map-viewer/network/layers/fork-line-layer.js index 8e48c935..2945c312 100644 --- a/src/components/network-map-viewer/network/layers/fork-line-layer.js +++ b/src/components/network-map-viewer/network/layers/fork-line-layer.js @@ -6,7 +6,6 @@ */ import { LineLayer } from 'deck.gl'; -import GL from '@luma.gl/constants'; const defaultProps = { getLineParallelIndex: { type: 'accessor', value: 0 }, @@ -71,29 +70,29 @@ uniform float minSubstationRadiusPixel; return shaders; } - initializeState(params) { - super.initializeState(params); + initializeState() { + super.initializeState(); const attributeManager = this.getAttributeManager(); attributeManager.addInstanced({ instanceLineParallelIndex: { size: 1, - type: GL.FLOAT, + type: 'float32', accessor: 'getLineParallelIndex', }, instanceLineAngle: { size: 1, - type: GL.FLOAT, + type: 'float32', accessor: 'getLineAngle', }, instanceOffsetStart: { size: 1, - type: GL.FLOAT, + type: 'float32', accessor: 'getSubstationOffset', }, instanceProximityFactor: { size: 1, - type: GL.FLOAT, + type: 'float32', accessor: 'getProximityFactor', }, }); diff --git a/src/components/network-map-viewer/network/layers/parallel-path-layer.js b/src/components/network-map-viewer/network/layers/parallel-path-layer.js index e100f378..7d9d9480 100644 --- a/src/components/network-map-viewer/network/layers/parallel-path-layer.js +++ b/src/components/network-map-viewer/network/layers/parallel-path-layer.js @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { PathLayer } from 'deck.gl'; -import GL from '@luma.gl/constants'; const defaultProps = { getLineParallelIndex: { type: 'accessor', value: 0 }, @@ -101,15 +100,15 @@ gl_Position += project_common_position_to_clipspace(trans) - project_uCenter; return shaders; } - initializeState(params) { - super.initializeState(params); + initializeState() { + super.initializeState(); const attributeManager = this.getAttributeManager(); attributeManager.addInstanced({ // too much instances variables need to compact some... instanceExtraAttributes: { size: 4, - type: GL.FLOAT, + type: 'float32', accessor: 'getExtraAttributes', }, }); diff --git a/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.js b/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.js index 62ada661..d68c5aa0 100644 --- a/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.js +++ b/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.js @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { ScatterplotLayer } from 'deck.gl'; -import GL from '@luma.gl/constants'; const defaultProps = { getRadiusMaxPixels: { type: 'accessor', value: 1 }, @@ -30,8 +29,8 @@ attribute float instanceRadiusMaxPixels; }); } - initializeState(params) { - super.initializeState(params); + initializeState() { + super.initializeState(); const attributeManager = this.getAttributeManager(); attributeManager.addInstanced({ @@ -39,7 +38,7 @@ attribute float instanceRadiusMaxPixels; size: 1, transition: true, accessor: 'getRadiusMaxPixels', - type: GL.FLOAT, + type: 'float32', defaultValue: 0, }, }); From 5c04d02abecb91b00f2d86ac9ae75c7e2a8c78f0 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Mon, 8 Jul 2024 22:44:38 +0200 Subject: [PATCH 02/10] update to deck.glb9 and migrate to typescript --- demo/src/{App.jsx => App.tsx} | 21 +- .../{add-diagrams.js => add-diagrams.ts} | 48 +- .../data/sld-sub-example-meta.json | 4571 ++++++++--------- ...p-equipments.js => demo-map-equipments.ts} | 10 +- package-lock.json | 2176 ++++---- package.json | 38 +- .../network/{constants.js => constants.ts} | 0 .../network/draw-control.ts | 48 +- .../network/{geo-data.js => geo-data.ts} | 118 +- ...t.glsl.js => arrow-layer-fragment.glsl.ts} | 11 +- ...tex.glsl.js => arrow-layer-vertex.glsl.ts} | 98 +- .../layers/{arrow-layer.js => arrow-layer.ts} | 274 +- ...{fork-line-layer.js => fork-line-layer.ts} | 57 +- ...l-path-layer.js => parallel-path-layer.ts} | 40 +- ...-layer-ext.js => scatterplot-layer-ext.ts} | 26 +- .../network/{line-layer.js => line-layer.ts} | 525 +- .../{map-equipments.js => map-equipments.ts} | 98 +- .../network/network-map.jsx | 841 --- .../network/network-map.tsx | 915 ++++ ...ubstation-layer.js => substation-layer.ts} | 128 +- .../utils/equipment-types.js | 34 - .../utils/equipment-types.ts | 117 + ...fosHandler.js => equipmentInfosHandler.ts} | 5 +- ...th-overlay.jsx => loader-with-overlay.tsx} | 12 +- .../single-line-diagram-viewer.ts | 80 +- src/index.d.ts | 8 - src/{index.js => index.ts} | 0 src/types/glsl.d.ts | 4 + src/types/svg.d.ts | 4 + src/utils/{colors.js => colors.ts} | 4 +- tsconfig.json | 38 +- vite.config.ts | 22 +- 32 files changed, 5508 insertions(+), 4863 deletions(-) rename demo/src/{App.jsx => App.tsx} (93%) rename demo/src/diagram-viewers/{add-diagrams.js => add-diagrams.ts} (85%) rename demo/src/map-viewer/{demo-map-equipments.js => demo-map-equipments.ts} (65%) rename src/components/network-map-viewer/network/{constants.js => constants.ts} (100%) rename src/components/network-map-viewer/network/{geo-data.js => geo-data.ts} (80%) rename src/components/network-map-viewer/network/layers/{arrow-layer-fragment.glsl.js => arrow-layer-fragment.glsl.ts} (79%) rename src/components/network-map-viewer/network/layers/{arrow-layer-vertex.glsl.js => arrow-layer-vertex.glsl.ts} (75%) rename src/components/network-map-viewer/network/layers/{arrow-layer.js => arrow-layer.ts} (65%) rename src/components/network-map-viewer/network/layers/{fork-line-layer.js => fork-line-layer.ts} (73%) rename src/components/network-map-viewer/network/layers/{parallel-path-layer.js => parallel-path-layer.ts} (84%) rename src/components/network-map-viewer/network/layers/{scatterplot-layer-ext.js => scatterplot-layer-ext.ts} (61%) rename src/components/network-map-viewer/network/{line-layer.js => line-layer.ts} (73%) rename src/components/network-map-viewer/network/{map-equipments.js => map-equipments.ts} (77%) delete mode 100644 src/components/network-map-viewer/network/network-map.jsx create mode 100644 src/components/network-map-viewer/network/network-map.tsx rename src/components/network-map-viewer/network/{substation-layer.js => substation-layer.ts} (69%) delete mode 100644 src/components/network-map-viewer/utils/equipment-types.js create mode 100644 src/components/network-map-viewer/utils/equipment-types.ts rename src/components/network-map-viewer/utils/{equipmentInfosHandler.js => equipmentInfosHandler.ts} (83%) rename src/components/network-map-viewer/utils/{loader-with-overlay.jsx => loader-with-overlay.tsx} (85%) delete mode 100644 src/index.d.ts rename src/{index.js => index.ts} (100%) create mode 100644 src/types/glsl.d.ts create mode 100644 src/types/svg.d.ts rename src/utils/{colors.js => colors.ts} (89%) diff --git a/demo/src/App.jsx b/demo/src/App.tsx similarity index 93% rename from demo/src/App.jsx rename to demo/src/App.tsx index 52730f2f..848a171e 100644 --- a/demo/src/App.jsx +++ b/demo/src/App.tsx @@ -5,21 +5,22 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import React, { useEffect, useRef } from 'react'; -import { NetworkMap, GeoData } from '../../src/'; import { - createTheme, - ThemeProvider, StyledEngineProvider, + ThemeProvider, + createTheme, } from '@mui/material/styles'; +import { useEffect, useRef } from 'react'; +import { GeoData, NetworkMap } from '../../src'; import DemoMapEquipments from './map-viewer/demo-map-equipments'; -import sposdata from './map-viewer/data/spos.json'; +import { NetworkMapRef } from '@/components/network-map-viewer/network/network-map'; +import { addNadToDemo, addSldToDemo } from './diagram-viewers/add-diagrams'; +import lmapdata from './map-viewer/data/lmap.json'; import lposdata from './map-viewer/data/lpos.json'; import smapdata from './map-viewer/data/smap.json'; -import lmapdata from './map-viewer/data/lmap.json'; -import { addNadToDemo, addSldToDemo } from './diagram-viewers/add-diagrams'; +import sposdata from './map-viewer/data/spos.json'; function App() { const INITIAL_ZOOM = 9; @@ -78,7 +79,7 @@ function App() { }; }, []); - const networkMapRef = useRef(); + const networkMapRef = useRef(null); const filteredNominalVoltages = [380.0, 225.0, 110.0]; return ( @@ -138,12 +139,12 @@ function App() { onPolygonChanged={() => { console.log( 'Selected Substations: ', - networkMapRef.current.getSelectedSubstations() + networkMapRef.current!.getSelectedSubstations() .length ); console.log( 'Selected Lines: ', - networkMapRef.current.getSelectedLines() + networkMapRef.current!.getSelectedLines() .length ); }} diff --git a/demo/src/diagram-viewers/add-diagrams.js b/demo/src/diagram-viewers/add-diagrams.ts similarity index 85% rename from demo/src/diagram-viewers/add-diagrams.js rename to demo/src/diagram-viewers/add-diagrams.ts index 41c68430..c72b38b4 100644 --- a/demo/src/diagram-viewers/add-diagrams.js +++ b/demo/src/diagram-viewers/add-diagrams.ts @@ -6,10 +6,10 @@ */ import NadSvgExample from './data/nad-example.svg'; +import SldSvgExampleMeta from './data/sld-example-meta.json' assert { type: 'json' }; import SldSvgExample from './data/sld-example.svg'; -import SldSvgExampleMeta from './data/sld-example-meta.json'; +import SldSvgSubExampleMeta from './data/sld-sub-example-meta.json' assert { type: 'json' }; import SldSvgSubExample from './data/sld-sub-example.svg'; -import SldSvgSubExampleMeta from './data/sld-sub-example-meta.json'; import { NetworkAreaDiagramViewer } from '../../../src/components/network-area-diagram-viewer/network-area-diagram-viewer'; import { SingleLineDiagramViewer } from '../../../src/components/single-line-diagram-viewer/single-line-diagram-viewer'; @@ -19,7 +19,7 @@ export const addNadToDemo = () => { .then((response) => response.text()) .then((svgContent) => { new NetworkAreaDiagramViewer( - document.getElementById('svg-container'), + document.getElementById('svg-container')!, svgContent, 500, 600, @@ -28,7 +28,7 @@ export const addNadToDemo = () => { ); document - .getElementById('svg-container') + .getElementById('svg-container')! .getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); @@ -39,7 +39,7 @@ export const addSldToDemo = () => { .then((response) => response.text()) .then((svgContent) => { new SingleLineDiagramViewer( - document.getElementById('svg-container-sld'), + document.getElementById('svg-container-sld')!, svgContent, //svg content null, //svg metadata 'voltage-level', @@ -56,7 +56,7 @@ export const addSldToDemo = () => { ); document - .getElementById('svg-container-sld') + .getElementById('svg-container-sld')! .getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); @@ -65,7 +65,7 @@ export const addSldToDemo = () => { .then((response) => response.text()) .then((svgContent) => { new SingleLineDiagramViewer( - document.getElementById('svg-container-sld-with-callbacks'), + document.getElementById('svg-container-sld-with-callbacks')!, svgContent, //svg content SldSvgExampleMeta, //svg metadata 'voltage-level', @@ -82,7 +82,7 @@ export const addSldToDemo = () => { ); document - .getElementById('svg-container-sld-with-callbacks') + .getElementById('svg-container-sld-with-callbacks')! .getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); @@ -91,7 +91,7 @@ export const addSldToDemo = () => { .then((response) => response.text()) .then((svgContent) => { new SingleLineDiagramViewer( - document.getElementById('svg-container-sldsub-with-callbacks'), + document.getElementById('svg-container-sldsub-with-callbacks')!, svgContent, //svg content SldSvgSubExampleMeta, //svg metadata 'substation', @@ -108,29 +108,39 @@ export const addSldToDemo = () => { ); document - .getElementById('svg-container-sldsub-with-callbacks') + .getElementById('svg-container-sldsub-with-callbacks')! .getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); }; -const handleNextVL = (id) => { +const handleNextVL = (id: string) => { const msg = 'Clicked on navigation arrow, dest VL is ' + id; console.log(msg); }; -const handleSwitch = (id, switch_status, element) => { +const handleSwitch = ( + id: string, + switch_status: boolean, + element: EventTarget | null +) => { const msg = 'Clicked on switch: ' + id + ', switch_status: ' + (switch_status ? 'close' : 'open') + '. elementId: ' + - element.id; + element!.id; console.log(msg); }; -const handleFeeder = (id, feederType, svgId, x, y) => { +const handleFeeder = ( + id: string, + feederType: string | null, + svgId: string, + x: number, + y: number +) => { const msg = 'Clicked on feeder: ' + id + @@ -145,17 +155,17 @@ const handleFeeder = (id, feederType, svgId, x, y) => { console.log(msg); }; -const handleBus = (id, svgId, x, y) => { +const handleBus = (id: string, svgId: string, x: number, y: number) => { const msg = 'Clicked on bus: ' + id + ', svgId: ' + svgId + 'x: ' + x + ', y: ' + y; console.log(msg); }; const handleTogglePopover = ( - shouldDisplay, - anchorEl, - equipmentId, - equipmentType + shouldDisplay: boolean, + anchorEl: EventTarget | null, + equipmentId: string, + equipmentType: string ) => { if (shouldDisplay) { const msg = diff --git a/demo/src/diagram-viewers/data/sld-sub-example-meta.json b/demo/src/diagram-viewers/data/sld-sub-example-meta.json index ca7766de..4b81447f 100644 --- a/demo/src/diagram-viewers/data/sld-sub-example-meta.json +++ b/demo/src/diagram-viewers/data/sld-sub-example-meta.json @@ -1,2301 +1,2298 @@ { - "components": [ - { - "type": "BUSBAR_SECTION", - "size": { - "width": 0, - "height": 0 - }, - "styleClass": "sld-busbar-section" - }, - { - "type": "GENERATOR", - "anchorPoints": [ + "components": [ { - "x": 0, - "y": -6, - "orientation": "VERTICAL" + "type": "BUSBAR_SECTION", + "size": { + "width": 0, + "height": 0 + }, + "styleClass": "sld-busbar-section" }, { - "x": 0, - "y": 6, - "orientation": "VERTICAL" + "type": "GENERATOR", + "anchorPoints": [ + { + "x": 0, + "y": -6, + "orientation": "VERTICAL" + }, + { + "x": 0, + "y": 6, + "orientation": "VERTICAL" + }, + { + "x": -6, + "y": 0, + "orientation": "HORIZONTAL" + }, + { + "x": 6, + "y": 0, + "orientation": "HORIZONTAL" + } + ], + "size": { + "width": 12, + "height": 12 + }, + "styleClass": "sld-generator" }, { - "x": -6, - "y": 0, - "orientation": "HORIZONTAL" + "type": "PHASE_SHIFT_TRANSFORMER", + "anchorPoints": [ + { + "x": 0, + "y": -7.5, + "orientation": "VERTICAL" + }, + { + "x": 0, + "y": 7.5, + "orientation": "VERTICAL" + } + ], + "size": { + "width": 14, + "height": 15 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION", + "DOWN": "ROTATION" + }, + "styleClass": "sld-pst" }, { - "x": 6, - "y": 0, - "orientation": "HORIZONTAL" - } - ], - "size": { - "width": 12, - "height": 12 - }, - "styleClass": "sld-generator" - }, - { - "type": "PHASE_SHIFT_TRANSFORMER", - "anchorPoints": [ - { - "x": 0, - "y": -7.5, - "orientation": "VERTICAL" - }, - { - "x": 0, - "y": 7.5, - "orientation": "VERTICAL" - } - ], - "size": { - "width": 14, - "height": 15 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION", - "DOWN": "ROTATION" - }, - "styleClass": "sld-pst" - }, - { - "type": "ARROW_REACTIVE", - "size": { - "width": 10, - "height": 10 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION" - }, - "styleClass": "sld-arrow-q" - }, - { - "type": "ARROW_ACTIVE", - "size": { - "width": 10, - "height": 10 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION" - }, - "styleClass": "sld-arrow-p" - }, - { - "type": "LOAD", - "anchorPoints": [ - { - "x": 0, - "y": -4.5, - "orientation": "VERTICAL" - }, - { - "x": 0, - "y": 4.5, - "orientation": "VERTICAL" - } - ], - "size": { - "width": 16, - "height": 9 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION" - }, - "styleClass": "sld-load" - }, - { - "type": "NODE", - "anchorPoints": [ - { - "x": 0, - "y": 0, - "orientation": "NONE" - } - ], - "size": { - "width": 8, - "height": 8 - }, - "styleClass": "sld-node" - }, - { - "type": "PHASE_SHIFT_TRANSFORMER_LEG", - "anchorPoints": [ - { - "x": 0, - "y": 0, - "orientation": "NONE" - } - ], - "size": { - "width": 0, - "height": 0 - } - }, - { - "type": "CAPACITOR", - "anchorPoints": [ - { - "x": 0, - "y": -6, - "orientation": "VERTICAL" - }, - { - "x": 0, - "y": 6, - "orientation": "VERTICAL" - } - ], - "size": { - "width": 12, - "height": 12 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION" - }, - "styleClass": "sld-capacitor" - }, - { - "type": "BUS_CONNECTION", - "anchorPoints": [ - { - "x": 0, - "y": 0, - "orientation": "VERTICAL" - } - ], - "size": { - "width": 8, - "height": 8 - }, - "styleClass": "sld-bus-connection" - }, - { - "type": "THREE_WINDINGS_TRANSFORMER_LEG", - "anchorPoints": [ - { - "x": 0, - "y": 0, - "orientation": "NONE" - } - ], - "size": { - "width": 0, - "height": 0 - } - }, - { - "type": "TWO_WINDINGS_TRANSFORMER_LEG", - "anchorPoints": [ - { - "x": 0, - "y": 0, - "orientation": "NONE" - } - ], - "size": { - "width": 0, - "height": 0 - } - }, - { - "type": "TWO_WINDINGS_TRANSFORMER", - "anchorPoints": [ - { - "x": 0, - "y": -8, - "orientation": "VERTICAL" - }, - { - "x": 0, - "y": 8, - "orientation": "VERTICAL" - } - ], - "size": { - "width": 10, - "height": 15 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION", - "DOWN": "ROTATION" - }, - "styleClass": "sld-two-wt" - }, - { - "type": "THREE_WINDINGS_TRANSFORMER", - "anchorPoints": [ - { - "x": -7, - "y": 0, - "orientation": "HORIZONTAL" - }, - { - "x": 7, - "y": 0, - "orientation": "HORIZONTAL" - }, - { - "x": 0, - "y": 12, - "orientation": "VERTICAL" - } - ], - "size": { - "width": 16, - "height": 24 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION", - "DOWN": "FLIP" - }, - "styleClass": "sld-three-wt" - }, - { - "type": "DANGLING_LINE", - "anchorPoints": [ - { - "x": 0, - "y": 0, - "orientation": "NONE" - } - ], - "size": { - "width": 0, - "height": 0 - } - }, - { - "type": "LINE", - "anchorPoints": [ - { - "x": 0, - "y": 0, - "orientation": "NONE" - } - ], - "size": { - "width": 0, - "height": 0 - } - }, - { - "type": "BREAKER", - "anchorPoints": [ - { - "x": 0, - "y": -10, - "orientation": "VERTICAL" - }, - { - "x": 0, - "y": 10, - "orientation": "VERTICAL" - } - ], - "size": { - "width": 20, - "height": 20 - }, - "transformations": { - "LEFT": "ROTATION", - "RIGHT": "ROTATION" - }, - "styleClass": "sld-breaker" - } - ], - "nodes": [ - { - "id": "LABEL_VL_469df5f7-058f-4451-a998-57a48e8a56fe", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "open": false, - "vlabel": true, - "labels": [] - }, - { - "id": "id3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "3b394dab-ab47-4022-98be-8123c6dfe7d4", - "labels": [] - }, - { - "id": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "CAPACITOR", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "d771118f-36e9-4115-a128-cc3d9ce3e3da", - "labels": [ - { - "id": "d771118f-36e9-4115-a128-cc3d9ce3e3da_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "0e8cd279-ad5d-485a-b3a9-093ae8714b72", - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "nextVId": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "THREE_WINDINGS_TRANSFORMER_LEG", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "labels": [ - { - "id": "84ed55f4-61f5-4d9d-8755-bba7b877a246_TWO_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "96c2b5c8-8e28-4b08-96d2-ca9b09cdbd83", - "labels": [] - }, - { - "id": "idBUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "BUSBAR_SECTION", - "open": false, - "vlabel": false, - "equipmentId": "INTERNAL_929ba893-c9dc-44d7-b1fd-30834bd3ab85_0FictitiousBus", - "labels": [] - }, - { - "id": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUSBAR_SECTION", - "open": false, - "vlabel": false, - "equipmentId": "5caf27ed-d2f8-458a-834a-6b3193a982e6", - "labels": [ - { - "id": "5caf27ed-d2f8-458a-834a-6b3193a982e6_NW_LABEL", - "positionName": "NW_LABEL" - } - ] - }, - { - "id": "id63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUSBAR_SECTION", - "open": false, - "vlabel": false, - "equipmentId": "63f25be7-7592-4cf1-8401-5772046ef2ae", - "labels": [ - { - "id": "63f25be7-7592-4cf1-8401-5772046ef2ae_NW_LABEL", - "positionName": "NW_LABEL" - } - ] - }, - { - "id": "idfd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "componentType": "BUSBAR_SECTION", - "open": false, - "vlabel": false, - "equipmentId": "fd649fe1-bdf5-4062-98ea-bbb66f50402d", - "labels": [ - { - "id": "fd649fe1-bdf5-4062-98ea-bbb66f50402d_NW_LABEL", - "positionName": "NW_LABEL" - } - ] - }, - { - "id": "id969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "969470b9-e74c-40d2-b3f7-bcfd88400fd1", - "labels": [] - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "nextVId": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "THREE_WINDINGS_TRANSFORMER_LEG", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "labels": [ - { - "id": "84ed55f4-61f5-4d9d-8755-bba7b877a246_ONE_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "LOAD", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8", - "labels": [ - { - "id": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8_S_LABEL", - "positionName": "S_LABEL" - } - ] - }, - { - "id": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "componentType": "GENERATOR", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "3a3b27be-b18b-4385-b557-6735d733baf0", - "labels": [ - { - "id": "3a3b27be-b18b-4385-b557-6735d733baf0_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "idBUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BUSBAR_SECTION", - "open": false, - "vlabel": false, - "equipmentId": "364c9ca2-0d1d-4363-8f46-e586f8f66a8c", - "labels": [ - { - "id": "364c9ca2-0d1d-4363-8f46-e586f8f66a8c_NW_LABEL", - "positionName": "NW_LABEL" - } - ] - }, - { - "id": "idddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "ddc148fc-3abd-459d-aec1-396283e0def6", - "labels": [] - }, - { - "id": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "LOAD", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "cb459405-cc14-4215-a45c-416789205904", - "labels": [ - { - "id": "cb459405-cc14-4215-a45c-416789205904_S_LABEL", - "positionName": "S_LABEL" - } - ] - }, - { - "id": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BUSBAR_SECTION", - "open": false, - "vlabel": false, - "equipmentId": "64901aec-5a8a-4bcb-8ca7-a3ddbfcd0e6c", - "labels": [ - { - "id": "64901aec-5a8a-4bcb-8ca7-a3ddbfcd0e6c_NW_LABEL", - "positionName": "NW_LABEL" - } - ] - }, - { - "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "DANGLING_LINE", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "78736387-5f60-4832-b3fe-d50daf81b0a6", - "labels": [ - { - "id": "78736387-5f60-4832-b3fe-d50daf81b0a6_S_LABEL", - "positionName": "S_LABEL" - } - ] - }, - { - "id": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "DANGLING_LINE", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "b18cd1aa-7808-49b9-a7cf-605eaf07b006", - "labels": [ - { - "id": "b18cd1aa-7808-49b9-a7cf-605eaf07b006_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "ida603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "a603d890-5d9d-42ef-98d0-acf47d121c0e", - "labels": [] - }, - { - "id": "idBUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "38dfcc80-600f-44e2-8f71-fb595b4f00ac", - "labels": [] - }, - { - "id": "idBUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "nextVId": "69ef0dbd-da79-4eef-a02f-690cb8a28361", - "componentType": "LINE", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "ffbabc27-1ccd-4fdc-b037-e341706c8d29", - "labels": [ - { - "id": "ffbabc27-1ccd-4fdc-b037-e341706c8d29_ONE_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "idBUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "nextVId": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", - "labels": [ - { - "id": "b94318f6-6d24-4f56-96b9-df2531ad6543_ONE_S_LABEL", - "positionName": "S_LABEL" - } - ] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "6b564930-b5e2-49d3-9d06-e1de28d6fd65", - "labels": [] - }, - { - "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "LABEL_VL_4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "open": false, - "vlabel": true, - "labels": [] - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", - "vid": "", - "componentType": "THREE_WINDINGS_TRANSFORMER", - "open": false, - "vlabel": false, - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "labels": [] - }, - { - "id": "idc8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUSBAR_SECTION", - "open": false, - "vlabel": false, - "equipmentId": "c8ce5e08-5ee3-42d9-aa44-5792db252d9f", - "labels": [ - { - "id": "c8ce5e08-5ee3-42d9-aa44-5792db252d9f_NW_LABEL", - "positionName": "NW_LABEL" - } - ] - }, - { - "id": "id2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BREAKER", - "open": true, - "vlabel": false, - "equipmentId": "2922c1dd-4113-466e-8cad-002572f3f557", - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "DANGLING_LINE", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "ed0c5d75-4a54-43c8-b782-b20d7431630b", - "labels": [ - { - "id": "ed0c5d75-4a54-43c8-b782-b20d7431630b_S_LABEL", - "positionName": "S_LABEL" - } - ] - }, - { - "id": "LABEL_VL_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "open": false, - "vlabel": true, - "labels": [] - }, - { - "id": "idBUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "GENERATOR", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "550ebe0d-f2b2-48c1-991f-cebea43a21aa", - "labels": [ - { - "id": "550ebe0d-f2b2-48c1-991f-cebea43a21aa_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "LABEL_VL_8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "open": false, - "vlabel": true, - "labels": [] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "nextVId": "69ef0dbd-da79-4eef-a02f-690cb8a28361", - "componentType": "LINE", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "b58bf21a-096a-4dae-9a01-3f03b60c24c7", - "labels": [ - { - "id": "b58bf21a-096a-4dae-9a01-3f03b60c24c7_ONE_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "nextVId": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "TWO_WINDINGS_TRANSFORMER_LEG", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", - "labels": [ - { - "id": "e482b89a-fa84-4ea9-8e70-a83d44790957_ONE_N_LABEL", - "positionName": "N_LABEL" - } - ] - }, - { - "id": "id14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "14d55344-c118-4f54-a430-72f16d12bf7b", - "labels": [] - }, - { - "id": "LABEL_VL_929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "open": false, - "vlabel": true, - "labels": [] - }, - { - "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "nextVId": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", - "labels": [ - { - "id": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0_ONE_S_LABEL", - "positionName": "S_LABEL" - } - ] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "nextVId": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", - "labels": [ - { - "id": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0_TWO_S_LABEL", - "positionName": "S_LABEL" - } - ] - }, - { - "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "nextVId": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", - "componentType": "TWO_WINDINGS_TRANSFORMER_LEG", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", - "labels": [ - { - "id": "e482b89a-fa84-4ea9-8e70-a83d44790957_TWO_S_LABEL", - "positionName": "S_LABEL" + "type": "ARROW_REACTIVE", + "size": { + "width": 10, + "height": 10 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION" + }, + "styleClass": "sld-arrow-q" + }, + { + "type": "ARROW_ACTIVE", + "size": { + "width": 10, + "height": 10 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION" + }, + "styleClass": "sld-arrow-p" + }, + { + "type": "LOAD", + "anchorPoints": [ + { + "x": 0, + "y": -4.5, + "orientation": "VERTICAL" + }, + { + "x": 0, + "y": 4.5, + "orientation": "VERTICAL" + } + ], + "size": { + "width": 16, + "height": 9 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION" + }, + "styleClass": "sld-load" + }, + { + "type": "NODE", + "anchorPoints": [ + { + "x": 0, + "y": 0, + "orientation": "NONE" + } + ], + "size": { + "width": 8, + "height": 8 + }, + "styleClass": "sld-node" + }, + { + "type": "PHASE_SHIFT_TRANSFORMER_LEG", + "anchorPoints": [ + { + "x": 0, + "y": 0, + "orientation": "NONE" + } + ], + "size": { + "width": 0, + "height": 0 + } + }, + { + "type": "CAPACITOR", + "anchorPoints": [ + { + "x": 0, + "y": -6, + "orientation": "VERTICAL" + }, + { + "x": 0, + "y": 6, + "orientation": "VERTICAL" + } + ], + "size": { + "width": 12, + "height": 12 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION" + }, + "styleClass": "sld-capacitor" + }, + { + "type": "BUS_CONNECTION", + "anchorPoints": [ + { + "x": 0, + "y": 0, + "orientation": "VERTICAL" + } + ], + "size": { + "width": 8, + "height": 8 + }, + "styleClass": "sld-bus-connection" + }, + { + "type": "THREE_WINDINGS_TRANSFORMER_LEG", + "anchorPoints": [ + { + "x": 0, + "y": 0, + "orientation": "NONE" + } + ], + "size": { + "width": 0, + "height": 0 + } + }, + { + "type": "TWO_WINDINGS_TRANSFORMER_LEG", + "anchorPoints": [ + { + "x": 0, + "y": 0, + "orientation": "NONE" + } + ], + "size": { + "width": 0, + "height": 0 + } + }, + { + "type": "TWO_WINDINGS_TRANSFORMER", + "anchorPoints": [ + { + "x": 0, + "y": -8, + "orientation": "VERTICAL" + }, + { + "x": 0, + "y": 8, + "orientation": "VERTICAL" + } + ], + "size": { + "width": 10, + "height": 15 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION", + "DOWN": "ROTATION" + }, + "styleClass": "sld-two-wt" + }, + { + "type": "THREE_WINDINGS_TRANSFORMER", + "anchorPoints": [ + { + "x": -7, + "y": 0, + "orientation": "HORIZONTAL" + }, + { + "x": 7, + "y": 0, + "orientation": "HORIZONTAL" + }, + { + "x": 0, + "y": 12, + "orientation": "VERTICAL" + } + ], + "size": { + "width": 16, + "height": 24 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION", + "DOWN": "FLIP" + }, + "styleClass": "sld-three-wt" + }, + { + "type": "DANGLING_LINE", + "anchorPoints": [ + { + "x": 0, + "y": 0, + "orientation": "NONE" + } + ], + "size": { + "width": 0, + "height": 0 + } + }, + { + "type": "LINE", + "anchorPoints": [ + { + "x": 0, + "y": 0, + "orientation": "NONE" + } + ], + "size": { + "width": 0, + "height": 0 + } + }, + { + "type": "BREAKER", + "anchorPoints": [ + { + "x": 0, + "y": -10, + "orientation": "VERTICAL" + }, + { + "x": 0, + "y": 10, + "orientation": "VERTICAL" + } + ], + "size": { + "width": 20, + "height": 20 + }, + "transformations": { + "LEFT": "ROTATION", + "RIGHT": "ROTATION" + }, + "styleClass": "sld-breaker" } - ] - }, - { - "id": "idBUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0", - "vid": "", - "componentType": "PHASE_SHIFT_TRANSFORMER", - "open": false, - "vlabel": false, - "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", - "labels": [] - }, - { - "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957", - "vid": "", - "componentType": "TWO_WINDINGS_TRANSFORMER", - "open": false, - "vlabel": false, - "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", - "labels": [] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "CAPACITOR", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "002b0a40-3957-46db-b84a-30420083558f", - "labels": [ - { - "id": "002b0a40-3957-46db-b84a-30420083558f_N_LABEL", - "positionName": "N_LABEL" + ], + "nodes": [ + { + "id": "LABEL_VL_469df5f7-058f-4451-a998-57a48e8a56fe", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "open": false, + "vlabel": true, + "labels": [] + }, + { + "id": "id3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "3b394dab-ab47-4022-98be-8123c6dfe7d4", + "labels": [] + }, + { + "id": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "CAPACITOR", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "d771118f-36e9-4115-a128-cc3d9ce3e3da", + "labels": [ + { + "id": "d771118f-36e9-4115-a128-cc3d9ce3e3da_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "0e8cd279-ad5d-485a-b3a9-093ae8714b72", + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "nextVId": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "THREE_WINDINGS_TRANSFORMER_LEG", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "labels": [ + { + "id": "84ed55f4-61f5-4d9d-8755-bba7b877a246_TWO_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "96c2b5c8-8e28-4b08-96d2-ca9b09cdbd83", + "labels": [] + }, + { + "id": "idBUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "BUSBAR_SECTION", + "open": false, + "vlabel": false, + "equipmentId": "INTERNAL_929ba893-c9dc-44d7-b1fd-30834bd3ab85_0FictitiousBus", + "labels": [] + }, + { + "id": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUSBAR_SECTION", + "open": false, + "vlabel": false, + "equipmentId": "5caf27ed-d2f8-458a-834a-6b3193a982e6", + "labels": [ + { + "id": "5caf27ed-d2f8-458a-834a-6b3193a982e6_NW_LABEL", + "positionName": "NW_LABEL" + } + ] + }, + { + "id": "id63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUSBAR_SECTION", + "open": false, + "vlabel": false, + "equipmentId": "63f25be7-7592-4cf1-8401-5772046ef2ae", + "labels": [ + { + "id": "63f25be7-7592-4cf1-8401-5772046ef2ae_NW_LABEL", + "positionName": "NW_LABEL" + } + ] + }, + { + "id": "idfd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "componentType": "BUSBAR_SECTION", + "open": false, + "vlabel": false, + "equipmentId": "fd649fe1-bdf5-4062-98ea-bbb66f50402d", + "labels": [ + { + "id": "fd649fe1-bdf5-4062-98ea-bbb66f50402d_NW_LABEL", + "positionName": "NW_LABEL" + } + ] + }, + { + "id": "id969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "969470b9-e74c-40d2-b3f7-bcfd88400fd1", + "labels": [] + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "nextVId": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "THREE_WINDINGS_TRANSFORMER_LEG", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "labels": [ + { + "id": "84ed55f4-61f5-4d9d-8755-bba7b877a246_ONE_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "LOAD", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8", + "labels": [ + { + "id": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "componentType": "GENERATOR", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "3a3b27be-b18b-4385-b557-6735d733baf0", + "labels": [ + { + "id": "3a3b27be-b18b-4385-b557-6735d733baf0_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "idBUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BUSBAR_SECTION", + "open": false, + "vlabel": false, + "equipmentId": "364c9ca2-0d1d-4363-8f46-e586f8f66a8c", + "labels": [ + { + "id": "364c9ca2-0d1d-4363-8f46-e586f8f66a8c_NW_LABEL", + "positionName": "NW_LABEL" + } + ] + }, + { + "id": "idddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "ddc148fc-3abd-459d-aec1-396283e0def6", + "labels": [] + }, + { + "id": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "LOAD", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "cb459405-cc14-4215-a45c-416789205904", + "labels": [ + { + "id": "cb459405-cc14-4215-a45c-416789205904_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BUSBAR_SECTION", + "open": false, + "vlabel": false, + "equipmentId": "64901aec-5a8a-4bcb-8ca7-a3ddbfcd0e6c", + "labels": [ + { + "id": "64901aec-5a8a-4bcb-8ca7-a3ddbfcd0e6c_NW_LABEL", + "positionName": "NW_LABEL" + } + ] + }, + { + "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "DANGLING_LINE", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "78736387-5f60-4832-b3fe-d50daf81b0a6", + "labels": [ + { + "id": "78736387-5f60-4832-b3fe-d50daf81b0a6_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "DANGLING_LINE", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "b18cd1aa-7808-49b9-a7cf-605eaf07b006", + "labels": [ + { + "id": "b18cd1aa-7808-49b9-a7cf-605eaf07b006_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "ida603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "a603d890-5d9d-42ef-98d0-acf47d121c0e", + "labels": [] + }, + { + "id": "idBUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "38dfcc80-600f-44e2-8f71-fb595b4f00ac", + "labels": [] + }, + { + "id": "idBUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "nextVId": "69ef0dbd-da79-4eef-a02f-690cb8a28361", + "componentType": "LINE", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "ffbabc27-1ccd-4fdc-b037-e341706c8d29", + "labels": [ + { + "id": "ffbabc27-1ccd-4fdc-b037-e341706c8d29_ONE_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "idBUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "nextVId": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", + "labels": [ + { + "id": "b94318f6-6d24-4f56-96b9-df2531ad6543_ONE_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "6b564930-b5e2-49d3-9d06-e1de28d6fd65", + "labels": [] + }, + { + "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "LABEL_VL_4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "open": false, + "vlabel": true, + "labels": [] + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", + "vid": "", + "componentType": "THREE_WINDINGS_TRANSFORMER", + "open": false, + "vlabel": false, + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "labels": [] + }, + { + "id": "idc8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUSBAR_SECTION", + "open": false, + "vlabel": false, + "equipmentId": "c8ce5e08-5ee3-42d9-aa44-5792db252d9f", + "labels": [ + { + "id": "c8ce5e08-5ee3-42d9-aa44-5792db252d9f_NW_LABEL", + "positionName": "NW_LABEL" + } + ] + }, + { + "id": "id2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BREAKER", + "open": true, + "vlabel": false, + "equipmentId": "2922c1dd-4113-466e-8cad-002572f3f557", + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "DANGLING_LINE", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "ed0c5d75-4a54-43c8-b782-b20d7431630b", + "labels": [ + { + "id": "ed0c5d75-4a54-43c8-b782-b20d7431630b_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "LABEL_VL_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "open": false, + "vlabel": true, + "labels": [] + }, + { + "id": "idBUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "GENERATOR", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "550ebe0d-f2b2-48c1-991f-cebea43a21aa", + "labels": [ + { + "id": "550ebe0d-f2b2-48c1-991f-cebea43a21aa_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "LABEL_VL_8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "open": false, + "vlabel": true, + "labels": [] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "nextVId": "69ef0dbd-da79-4eef-a02f-690cb8a28361", + "componentType": "LINE", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "b58bf21a-096a-4dae-9a01-3f03b60c24c7", + "labels": [ + { + "id": "b58bf21a-096a-4dae-9a01-3f03b60c24c7_ONE_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "nextVId": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "TWO_WINDINGS_TRANSFORMER_LEG", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", + "labels": [ + { + "id": "e482b89a-fa84-4ea9-8e70-a83d44790957_ONE_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "id14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "14d55344-c118-4f54-a430-72f16d12bf7b", + "labels": [] + }, + { + "id": "LABEL_VL_929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "open": false, + "vlabel": true, + "labels": [] + }, + { + "id": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "nextVId": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", + "labels": [ + { + "id": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0_ONE_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "nextVId": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", + "labels": [ + { + "id": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0_TWO_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "vid": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "nextVId": "4ba71b59-ee2f-450b-9f7d-cc2f1cc5e386", + "componentType": "TWO_WINDINGS_TRANSFORMER_LEG", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", + "labels": [ + { + "id": "e482b89a-fa84-4ea9-8e70-a83d44790957_TWO_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "idBUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0", + "vid": "", + "componentType": "PHASE_SHIFT_TRANSFORMER", + "open": false, + "vlabel": false, + "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", + "labels": [] + }, + { + "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957", + "vid": "", + "componentType": "TWO_WINDINGS_TRANSFORMER", + "open": false, + "vlabel": false, + "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", + "labels": [] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "CAPACITOR", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "002b0a40-3957-46db-b84a-30420083558f", + "labels": [ + { + "id": "002b0a40-3957-46db-b84a-30420083558f_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "nextVId": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", + "open": false, + "direction": "TOP", + "vlabel": false, + "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", + "labels": [ + { + "id": "b94318f6-6d24-4f56-96b9-df2531ad6543_TWO_N_LABEL", + "positionName": "N_LABEL" + } + ] + }, + { + "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", + "componentType": "NODE", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", + "componentType": "BREAKER", + "open": false, + "vlabel": false, + "equipmentId": "6e86cd52-4594-435e-92ce-6dc673288ab4", + "labels": [] + }, + { + "id": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "idBUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "nextVId": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "THREE_WINDINGS_TRANSFORMER_LEG", + "open": false, + "direction": "BOTTOM", + "vlabel": false, + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "labels": [ + { + "id": "84ed55f4-61f5-4d9d-8755-bba7b877a246_THREE_S_LABEL", + "positionName": "S_LABEL" + } + ] + }, + { + "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543", + "vid": "", + "componentType": "PHASE_SHIFT_TRANSFORMER", + "open": false, + "vlabel": false, + "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", + "labels": [] + }, + { + "id": "idBUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", + "componentType": "BUS_CONNECTION", + "open": false, + "vlabel": false, + "labels": [] } - ] - }, - { - "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "nextVId": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "PHASE_SHIFT_TRANSFORMER_LEG", - "open": false, - "direction": "TOP", - "vlabel": false, - "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", - "labels": [ - { - "id": "b94318f6-6d24-4f56-96b9-df2531ad6543_TWO_N_LABEL", - "positionName": "N_LABEL" + ], + "wires": [ + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_BUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "nodeId2": "idBUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "nodeId2": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "nodeId2": "id38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_BUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "nodeId2": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_BUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "nodeId2": "idBUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1_95_BUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "nodeId2": "idBUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", + "nodeId1": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", + "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", + "nodeId1": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_BUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "nodeId2": "idBUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_BUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", + "nodeId1": "idBUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "nodeId2": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_BUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_fd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", + "nodeId1": "idBUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId2": "idfd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "nodeId1": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "nodeId2": "id2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72_95_BUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "nodeId2": "idBUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", + "nodeId2": "id969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "nodeId1": "idBUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_BUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "nodeId2": "idBUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "nodeId1": "id969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "nodeId1": "id3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "nodeId1": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "nodeId1": "id6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId2": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65_95_BUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "nodeId2": "idBUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "nodeId1": "idddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", + "nodeId1": "idBUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "nodeId2": "id63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "nodeId1": "id38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac_95_BUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "nodeId2": "idBUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "nodeId1": "idBUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", + "nodeId1": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "nodeId1": "idBUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_BUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "nodeId2": "idBUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_BUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_fd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", + "nodeId1": "idBUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "nodeId2": "idfd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", + "nodeId2": "id0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "nodeId1": "idBUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "nodeId1": "idBUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b_95_BUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "nodeId2": "idBUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "nodeId2": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "nodeId1": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "nodeId2": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "nodeId2": "id96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "nodeId1": "id14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "nodeId1": "id6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", + "nodeId1": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_c8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", + "nodeId1": "idBUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", + "nodeId2": "idc8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "nodeId1": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", + "nodeId2": "id14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "nodeId1": "ida603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", + "nodeId2": "id6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId2": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "nodeId1": "idBUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", + "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "nodeId2": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "nodeId1": "id2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId1": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId2": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", + "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "nodeId2": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "nodeId2": "ida603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "nodeId2": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "nodeId2": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0", + "straight": false, + "snakeLine": true + }, + { + "id": "idEDGE_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", + "nodeId2": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", + "nodeId1": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", + "nodeId2": "id63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_BUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "nodeId2": "idBUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_BUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "nodeId2": "idBUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "nodeId1": "id96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", + "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557_95_BUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "nodeId2": "idBUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_BUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "nodeId2": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "nodeId1": "idBUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", + "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "nodeId1": "idBUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", + "nodeId2": "id6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_BUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "nodeId2": "idBUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_c8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", + "nodeId1": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", + "nodeId2": "idc8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4_95_BUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "nodeId2": "idBUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "nodeId1": "idBUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", + "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "nodeId1": "id0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "nodeId1": "idBUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", + "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83_95_BUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "nodeId2": "idBUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e_95_BUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "nodeId2": "idBUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", + "nodeId2": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "nodeId2": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId2": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "nodeId1": "idBUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", + "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId2": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "nodeId1": "idBUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", + "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "nodeId2": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", + "straight": false, + "snakeLine": false + }, + { + "id": "idEDGE_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", + "nodeId2": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543", + "straight": false, + "snakeLine": true + }, + { + "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "nodeId1": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", + "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "nodeId1": "idBUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", + "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "nodeId2": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", + "straight": false, + "snakeLine": false + }, + { + "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_BUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "nodeId2": "idBUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", + "straight": false, + "snakeLine": false } - ] - }, - { - "id": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "vid": "b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c", - "componentType": "NODE", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "vid": "8bbd7e74-ae20-4dce-8780-c20f8e18c2e0", - "componentType": "BREAKER", - "open": false, - "vlabel": false, - "equipmentId": "6e86cd52-4594-435e-92ce-6dc673288ab4", - "labels": [] - }, - { - "id": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "idBUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "vid": "469df5f7-058f-4451-a998-57a48e8a56fe", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "nextVId": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "THREE_WINDINGS_TRANSFORMER_LEG", - "open": false, - "direction": "BOTTOM", - "vlabel": false, - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "labels": [ - { - "id": "84ed55f4-61f5-4d9d-8755-bba7b877a246_THREE_S_LABEL", - "positionName": "S_LABEL" + ], + "lines": [], + "feederInfos": [ + { + "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_ARROW_REACTIVE", + "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", + "side": "TWO" + }, + { + "id": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_ARROW_ACTIVE", + "equipmentId": "ed0c5d75-4a54-43c8-b782-b20d7431630b" + }, + { + "id": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_ARROW_REACTIVE", + "equipmentId": "3a3b27be-b18b-4385-b557-6735d733baf0" + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_ARROW_ACTIVE", + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "side": "ONE" + }, + { + "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_ARROW_ACTIVE", + "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", + "side": "TWO" + }, + { + "id": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_ARROW_ACTIVE", + "equipmentId": "b58bf21a-096a-4dae-9a01-3f03b60c24c7", + "side": "ONE" + }, + { + "id": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_ARROW_REACTIVE", + "equipmentId": "78736387-5f60-4832-b3fe-d50daf81b0a6" + }, + { + "id": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_ARROW_REACTIVE", + "equipmentId": "ffbabc27-1ccd-4fdc-b037-e341706c8d29", + "side": "ONE" + }, + { + "id": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_ARROW_REACTIVE", + "equipmentId": "b58bf21a-096a-4dae-9a01-3f03b60c24c7", + "side": "ONE" + }, + { + "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_ARROW_REACTIVE", + "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", + "side": "TWO" + }, + { + "id": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_ARROW_ACTIVE", + "equipmentId": "3a3b27be-b18b-4385-b557-6735d733baf0" + }, + { + "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_ARROW_ACTIVE", + "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", + "side": "ONE" + }, + { + "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_ARROW_ACTIVE", + "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", + "side": "TWO" + }, + { + "id": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_ARROW_ACTIVE", + "equipmentId": "78736387-5f60-4832-b3fe-d50daf81b0a6" + }, + { + "id": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_ARROW_ACTIVE", + "equipmentId": "d771118f-36e9-4115-a128-cc3d9ce3e3da" + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_ARROW_REACTIVE", + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "side": "TWO" + }, + { + "id": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_ARROW_REACTIVE", + "equipmentId": "550ebe0d-f2b2-48c1-991f-cebea43a21aa" + }, + { + "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_ARROW_REACTIVE", + "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", + "side": "ONE" + }, + { + "id": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_ARROW_REACTIVE", + "equipmentId": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8" + }, + { + "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_ARROW_ACTIVE", + "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", + "side": "TWO" + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_ARROW_REACTIVE", + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "side": "THREE" + }, + { + "id": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_ARROW_ACTIVE", + "equipmentId": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8" + }, + { + "id": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_ARROW_ACTIVE", + "equipmentId": "ffbabc27-1ccd-4fdc-b037-e341706c8d29", + "side": "ONE" + }, + { + "id": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_ARROW_ACTIVE", + "equipmentId": "550ebe0d-f2b2-48c1-991f-cebea43a21aa" + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_ARROW_ACTIVE", + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "side": "TWO" + }, + { + "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_ARROW_ACTIVE", + "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", + "side": "ONE" + }, + { + "id": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_ARROW_REACTIVE", + "equipmentId": "d771118f-36e9-4115-a128-cc3d9ce3e3da" + }, + { + "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_ARROW_REACTIVE", + "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", + "side": "ONE" + }, + { + "id": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_ARROW_REACTIVE", + "equipmentId": "ed0c5d75-4a54-43c8-b782-b20d7431630b" + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_ARROW_ACTIVE", + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "side": "THREE" + }, + { + "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_ARROW_ACTIVE", + "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", + "side": "ONE" + }, + { + "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_ARROW_REACTIVE", + "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", + "side": "ONE" + }, + { + "id": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_ARROW_REACTIVE", + "equipmentId": "002b0a40-3957-46db-b84a-30420083558f" + }, + { + "id": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_ARROW_REACTIVE", + "equipmentId": "b18cd1aa-7808-49b9-a7cf-605eaf07b006" + }, + { + "id": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_ARROW_ACTIVE", + "equipmentId": "002b0a40-3957-46db-b84a-30420083558f" + }, + { + "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_ARROW_REACTIVE", + "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", + "side": "ONE" + }, + { + "id": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904_ARROW_ACTIVE", + "equipmentId": "cb459405-cc14-4215-a45c-416789205904" + }, + { + "id": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904_ARROW_REACTIVE", + "equipmentId": "cb459405-cc14-4215-a45c-416789205904" + }, + { + "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_ARROW_REACTIVE", + "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", + "side": "TWO" + }, + { + "id": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_ARROW_ACTIVE", + "equipmentId": "b18cd1aa-7808-49b9-a7cf-605eaf07b006" } - ] - }, - { - "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543", - "vid": "", - "componentType": "PHASE_SHIFT_TRANSFORMER", - "open": false, - "vlabel": false, - "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", - "labels": [] - }, - { - "id": "idBUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "vid": "929ba893-c9dc-44d7-b1fd-30834bd3ab85", - "componentType": "BUS_CONNECTION", - "open": false, - "vlabel": false, - "labels": [] - } - ], - "wires": [ - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_BUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "nodeId2": "idBUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "nodeId2": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "nodeId2": "id38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_BUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "nodeId2": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_BUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "nodeId2": "idBUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1_95_BUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "nodeId2": "idBUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", - "nodeId1": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", - "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", - "nodeId1": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_BUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "nodeId2": "idBUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_BUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", - "nodeId1": "idBUSCO_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "nodeId2": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_BUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_fd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", - "nodeId1": "idBUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId2": "idfd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "nodeId1": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "nodeId2": "id2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72_95_BUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "nodeId2": "idBUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa", - "nodeId2": "id969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "nodeId1": "idBUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_BUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "nodeId2": "idBUSCO_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "nodeId1": "id969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_969470b9_45_e74c_45_40d2_45_b3f7_45_bcfd88400fd1", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "nodeId1": "id3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "nodeId1": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "nodeId1": "id6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId2": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65_95_BUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "nodeId2": "idBUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "nodeId1": "idddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", - "nodeId1": "idBUSCO_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "nodeId2": "id63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "nodeId1": "id38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac_95_BUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "nodeId2": "idBUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "nodeId1": "idBUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", - "nodeId1": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "nodeId1": "idBUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_BUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "nodeId2": "idBUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_BUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_fd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", - "nodeId1": "idBUSCO_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "nodeId2": "idfd649fe1_45_bdf5_45_4062_45_98ea_45_bbb66f50402d", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6", - "nodeId2": "id0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "nodeId1": "idBUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "nodeId1": "idBUSCO_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b_95_BUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "nodeId2": "idBUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "nodeId2": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "nodeId1": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "nodeId2": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "nodeId2": "id96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "nodeId1": "id14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "nodeId1": "id6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", - "nodeId1": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_0FictitiousBus", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_95_c8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", - "nodeId1": "idBUSCO_95_ffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE", - "nodeId2": "idc8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "nodeId1": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_b18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006", - "nodeId2": "id14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "nodeId1": "ida603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "nodeId2": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE", - "nodeId2": "id6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId2": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "nodeId1": "idBUSCO_95_14d55344_45_c118_45_4f54_45_a430_45_72f16d12bf7b", - "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "nodeId2": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "nodeId1": "id2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_95_INTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId1": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId2": "idINTERNAL_95_929ba893_45_c9dc_45_44d7_45_b1fd_45_30834bd3ab85_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId1": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId2": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE", - "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "nodeId2": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "nodeId2": "ida603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "nodeId2": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "nodeId2": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0", - "straight": false, - "snakeLine": true - }, - { - "id": "idEDGE_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO", - "nodeId2": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4_95_63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", - "nodeId1": "idBUSCO_95_3b394dab_45_ab47_45_4022_45_98be_45_8123c6dfe7d4", - "nodeId2": "id63f25be7_45_7592_45_4cf1_45_8401_45_5772046ef2ae", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_BUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "nodeId2": "idBUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_BUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "nodeId2": "idBUSCO_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "nodeId1": "id96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId1": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE", - "nodeId2": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557_95_BUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "nodeId2": "idBUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_BUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "nodeId2": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "nodeId1": "idBUSCO_95_1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8", - "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "nodeId1": "idBUSCO_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "nodeId1": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_a708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE", - "nodeId2": "id6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_BUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "nodeId2": "idBUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6_95_c8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", - "nodeId1": "idBUSCO_95_ddc148fc_45_3abd_45_459d_45_aec1_45_396283e0def6", - "nodeId2": "idc8ce5e08_45_5ee3_45_42d9_45_aa44_45_5792db252d9f", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4_95_BUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "nodeId2": "idBUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "nodeId1": "idBUSCO_95_6e86cd52_45_4594_45_435e_45_92ce_45_6dc673288ab4", - "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "nodeId1": "id0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "nodeId2": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_0e8cd279_45_ad5d_45_485a_45_b3a9_45_093ae8714b72", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "nodeId1": "idBUSCO_95_6b564930_45_b5e2_45_49d3_45_9d06_45_e1de28d6fd65", - "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83_95_BUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "nodeId2": "idBUSCO_95_96c2b5c8_45_8e28_45_4b08_45_96d2_45_ca9b09cdbd83", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e_95_BUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "nodeId2": "idBUSCO_95_a603d890_45_5d9d_45_42ef_45_98d0_45_acf47d121c0e", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE", - "nodeId2": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_d771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "nodeId2": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId2": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_BUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_95_64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "nodeId1": "idBUSCO_95_ed0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b", - "nodeId2": "id64901aec_45_5a8a_45_4bcb_45_8ca7_45_a3ddbfcd0e6c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId2": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "nodeId1": "idBUSCO_95_38dfcc80_45_600f_45_44e2_45_8f71_45_fb595b4f00ac", - "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_INTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "nodeId1": "idINTERNAL_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_b58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "nodeId2": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE", - "straight": false, - "snakeLine": false - }, - { - "id": "idEDGE_95_b94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "nodeId1": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO", - "nodeId2": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543", - "straight": false, - "snakeLine": true - }, - { - "id": "_95_b10b171b_45_3bc5_45_4849_45_bb1f_45_61ed9ea1ec7c_95_BUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_95_5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "nodeId1": "idBUSCO_95_84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO", - "nodeId2": "id5caf27ed_45_d2f8_45_458a_45_834a_45_6b3193a982e6", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_BUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557_95_364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "nodeId1": "idBUSCO_95_2922c1dd_45_4113_45_466e_45_8cad_45_002572f3f557", - "nodeId2": "id364c9ca2_45_0d1d_45_4363_45_8f46_45_e586f8f66a8c", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904_95_INTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "nodeId1": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "nodeId2": "idINTERNAL_95_8bbd7e74_45_ae20_45_4dce_45_8780_45_c20f8e18c2e0_95_cb459405_45_cc14_45_4215_45_a45c_45_416789205904", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_INTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "nodeId1": "idINTERNAL_95_469df5f7_45_058f_45_4451_45_a998_45_57a48e8a56fe_95_002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "nodeId2": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f", - "straight": false, - "snakeLine": false - }, - { - "id": "_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_INTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_95_BUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId1": "idINTERNAL_95_4ba71b59_45_ee2f_45_450b_45_9f7d_45_cc2f1cc5e386_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "nodeId2": "idBUSCO_95_e482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO", - "straight": false, - "snakeLine": false - } - ], - "lines": [], - "feederInfos": [ - { - "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_ARROW_REACTIVE", - "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", - "side": "TWO" - }, - { - "id": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_ARROW_ACTIVE", - "equipmentId": "ed0c5d75-4a54-43c8-b782-b20d7431630b" - }, - { - "id": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_ARROW_REACTIVE", - "equipmentId": "3a3b27be-b18b-4385-b557-6735d733baf0" - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_ARROW_ACTIVE", - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "side": "ONE" - }, - { - "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_TWO_ARROW_ACTIVE", - "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", - "side": "TWO" - }, - { - "id": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_ARROW_ACTIVE", - "equipmentId": "b58bf21a-096a-4dae-9a01-3f03b60c24c7", - "side": "ONE" - }, - { - "id": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_ARROW_REACTIVE", - "equipmentId": "78736387-5f60-4832-b3fe-d50daf81b0a6" - }, - { - "id": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_ARROW_REACTIVE", - "equipmentId": "ffbabc27-1ccd-4fdc-b037-e341706c8d29", - "side": "ONE" - }, - { - "id": "idb58bf21a_45_096a_45_4dae_45_9a01_45_3f03b60c24c7_95_ONE_ARROW_REACTIVE", - "equipmentId": "b58bf21a-096a-4dae-9a01-3f03b60c24c7", - "side": "ONE" - }, - { - "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_ARROW_REACTIVE", - "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", - "side": "TWO" - }, - { - "id": "id3a3b27be_45_b18b_45_4385_45_b557_45_6735d733baf0_ARROW_ACTIVE", - "equipmentId": "3a3b27be-b18b-4385-b557-6735d733baf0" - }, - { - "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_ARROW_ACTIVE", - "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", - "side": "ONE" - }, - { - "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_ARROW_ACTIVE", - "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", - "side": "TWO" - }, - { - "id": "id78736387_45_5f60_45_4832_45_b3fe_45_d50daf81b0a6_ARROW_ACTIVE", - "equipmentId": "78736387-5f60-4832-b3fe-d50daf81b0a6" - }, - { - "id": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_ARROW_ACTIVE", - "equipmentId": "d771118f-36e9-4115-a128-cc3d9ce3e3da" - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_ARROW_REACTIVE", - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "side": "TWO" - }, - { - "id": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_ARROW_REACTIVE", - "equipmentId": "550ebe0d-f2b2-48c1-991f-cebea43a21aa" - }, - { - "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_ONE_ARROW_REACTIVE", - "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", - "side": "ONE" - }, - { - "id": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_ARROW_REACTIVE", - "equipmentId": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8" - }, - { - "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_TWO_ARROW_ACTIVE", - "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", - "side": "TWO" - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_ARROW_REACTIVE", - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "side": "THREE" - }, - { - "id": "id1c6beed6_45_1acf_45_42e7_45_ba55_45_0cc9f04bddd8_ARROW_ACTIVE", - "equipmentId": "1c6beed6-1acf-42e7-ba55-0cc9f04bddd8" - }, - { - "id": "idffbabc27_45_1ccd_45_4fdc_45_b037_45_e341706c8d29_95_ONE_ARROW_ACTIVE", - "equipmentId": "ffbabc27-1ccd-4fdc-b037-e341706c8d29", - "side": "ONE" - }, - { - "id": "id550ebe0d_45_f2b2_45_48c1_45_991f_45_cebea43a21aa_ARROW_ACTIVE", - "equipmentId": "550ebe0d-f2b2-48c1-991f-cebea43a21aa" - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_TWO_ARROW_ACTIVE", - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "side": "TWO" - }, - { - "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_ARROW_ACTIVE", - "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", - "side": "ONE" - }, - { - "id": "idd771118f_45_36e9_45_4115_45_a128_45_cc3d9ce3e3da_ARROW_REACTIVE", - "equipmentId": "d771118f-36e9-4115-a128-cc3d9ce3e3da" - }, - { - "id": "idb94318f6_45_6d24_45_4f56_45_96b9_45_df2531ad6543_95_ONE_ARROW_REACTIVE", - "equipmentId": "b94318f6-6d24-4f56-96b9-df2531ad6543", - "side": "ONE" - }, - { - "id": "ided0c5d75_45_4a54_45_43c8_45_b782_45_b20d7431630b_ARROW_REACTIVE", - "equipmentId": "ed0c5d75-4a54-43c8-b782-b20d7431630b" - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_THREE_ARROW_ACTIVE", - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "side": "THREE" - }, - { - "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_ARROW_ACTIVE", - "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", - "side": "ONE" - }, - { - "id": "ida708c3bc_45_465d_45_4fe7_45_b6ef_45_6fa6408a62b0_95_ONE_ARROW_REACTIVE", - "equipmentId": "a708c3bc-465d-4fe7-b6ef-6fa6408a62b0", - "side": "ONE" - }, - { - "id": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_ARROW_REACTIVE", - "equipmentId": "002b0a40-3957-46db-b84a-30420083558f" - }, - { - "id": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_ARROW_REACTIVE", - "equipmentId": "b18cd1aa-7808-49b9-a7cf-605eaf07b006" - }, - { - "id": "id002b0a40_45_3957_45_46db_45_b84a_45_30420083558f_ARROW_ACTIVE", - "equipmentId": "002b0a40-3957-46db-b84a-30420083558f" - }, - { - "id": "id84ed55f4_45_61f5_45_4d9d_45_8755_45_bba7b877a246_95_ONE_ARROW_REACTIVE", - "equipmentId": "84ed55f4-61f5-4d9d-8755-bba7b877a246", - "side": "ONE" - }, - { - "id": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904_ARROW_ACTIVE", - "equipmentId": "cb459405-cc14-4215-a45c-416789205904" - }, - { - "id": "idcb459405_45_cc14_45_4215_45_a45c_45_416789205904_ARROW_REACTIVE", - "equipmentId": "cb459405-cc14-4215-a45c-416789205904" - }, - { - "id": "ide482b89a_45_fa84_45_4ea9_45_8e70_45_a83d44790957_95_TWO_ARROW_REACTIVE", - "equipmentId": "e482b89a-fa84-4ea9-8e70-a83d44790957", - "side": "TWO" - }, - { - "id": "idb18cd1aa_45_7808_45_49b9_45_a7cf_45_605eaf07b006_ARROW_ACTIVE", - "equipmentId": "b18cd1aa-7808-49b9-a7cf-605eaf07b006" + ], + "electricalNodeInfos": [], + "busInfos": [], + "layoutParams": { + "voltageLevelPadding": { + "left": 20, + "top": 60, + "right": 20, + "bottom": 60 + }, + "diagramPadding": { + "left": 20, + "top": 20, + "right": 20, + "bottom": 20 + }, + "verticalSpaceBus": 25, + "horizontalBusPadding": 20, + "cellWidth": 50, + "externCellHeight": 250, + "internCellHeight": 40, + "stackHeight": 30, + "showGrid": false, + "tooltipEnabled": false, + "showInternalNodes": false, + "scaleFactor": 1, + "drawStraightWires": false, + "horizontalSnakeLinePadding": 20, + "verticalSnakeLinePadding": 25, + "feederInfosOuterMargin": 20, + "spaceForFeederInfos": 50, + "diagramName": null, + "avoidSVGComponentsDuplication": false, + "adaptCellHeightToContent": true, + "maxComponentHeight": 12, + "minSpaceBetweenComponents": 15, + "minExternCellHeight": 80, + "labelCentered": false, + "labelDiagonal": false, + "angleLabelShift": 15, + "highlightLineState": true, + "addNodesInfos": true, + "feederInfoSymmetry": false, + "cssLocation": "EXTERNAL_NO_IMPORT", + "svgWidthAndHeightAdded": false, + "useName": true, + "feederInfosIntraMargin": 10, + "busInfoMargin": 0, + "busbarsAlignment": "FIRST", + "feederInfoPrecision": 0, + "componentsOnBusbars": ["DISCONNECTOR"] } - ], - "electricalNodeInfos": [], - "busInfos": [], - "layoutParams": { - "voltageLevelPadding": { - "left": 20, - "top": 60, - "right": 20, - "bottom": 60 - }, - "diagramPadding": { - "left": 20, - "top": 20, - "right": 20, - "bottom": 20 - }, - "verticalSpaceBus": 25, - "horizontalBusPadding": 20, - "cellWidth": 50, - "externCellHeight": 250, - "internCellHeight": 40, - "stackHeight": 30, - "showGrid": false, - "tooltipEnabled": false, - "showInternalNodes": false, - "scaleFactor": 1, - "drawStraightWires": false, - "horizontalSnakeLinePadding": 20, - "verticalSnakeLinePadding": 25, - "feederInfosOuterMargin": 20, - "spaceForFeederInfos": 50, - "diagramName": null, - "avoidSVGComponentsDuplication": false, - "adaptCellHeightToContent": true, - "maxComponentHeight": 12, - "minSpaceBetweenComponents": 15, - "minExternCellHeight": 80, - "labelCentered": false, - "labelDiagonal": false, - "angleLabelShift": 15, - "highlightLineState": true, - "addNodesInfos": true, - "feederInfoSymmetry": false, - "cssLocation": "EXTERNAL_NO_IMPORT", - "svgWidthAndHeightAdded": false, - "useName": true, - "feederInfosIntraMargin": 10, - "busInfoMargin": 0, - "busbarsAlignment": "FIRST", - "feederInfoPrecision": 0, - "componentsOnBusbars": [ - "DISCONNECTOR" - ] - } } - diff --git a/demo/src/map-viewer/demo-map-equipments.js b/demo/src/map-viewer/demo-map-equipments.ts similarity index 65% rename from demo/src/map-viewer/demo-map-equipments.js rename to demo/src/map-viewer/demo-map-equipments.ts index 7ca007a5..bbc45157 100644 --- a/demo/src/map-viewer/demo-map-equipments.js +++ b/demo/src/map-viewer/demo-map-equipments.ts @@ -5,15 +5,19 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { MapEquipments } from '../../../src'; +import { + Line, + Substation, +} from '@/components/network-map-viewer/utils/equipment-types'; +import { MapEquipments } from '@/index'; export default class DemoMapEquipments extends MapEquipments { - initEquipments(smapdata, lmapdata) { + initEquipments(smapdata: Substation[], lmapdata: Line[]) { this.updateSubstations(smapdata, true); this.updateLines(lmapdata, true); } - constructor(smapdata, lmapdata) { + constructor(smapdata: Substation[], lmapdata: Line[]) { super(); this.initEquipments(smapdata, lmapdata); } diff --git a/package-lock.json b/package-lock.json index a3931100..83f08dc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,23 +10,23 @@ "license": "MPL-2.0", "dependencies": { "@mapbox/mapbox-gl-draw": "^1.4.3", - "@svgdotjs/svg.js": "^3.2.0", + "@svgdotjs/svg.js": "^3.2.4", "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^9.0.14", + "deck.gl": "^9.0.21", "geolib": "^3.3.4", - "mapbox-gl": "^3.2.0", - "maplibre-gl": "^4.1.2", + "mapbox-gl": "^3.4.0", + "maplibre-gl": "^4.5.0", "react-map-gl": "^7.1.7" }, "devDependencies": { - "@babel/core": "^7.24.3", - "@babel/preset-env": "^7.24.3", - "@babel/preset-typescript": "^7.24.1", - "@mui/icons-material": "^5.15.14", - "@mui/material": "^5.15.14", - "@mui/system": "^5.15.14", + "@babel/core": "^7.24.7", + "@babel/preset-env": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", + "@mui/icons-material": "^5.15.21", + "@mui/material": "^5.15.21", + "@mui/system": "^5.15.20", "@types/eslint": "^7.29.0", "@types/eslint-config-prettier": "^6.11.3", "@types/jest": "^29.5.12", @@ -34,27 +34,27 @@ "@types/mapbox__mapbox-gl-draw": "^1.4.6", "@types/mapbox-gl": "^3.1.0", "@types/node": "^18.19.31", - "@types/react": "^18.2.75", - "@types/react-dom": "^18.2.24", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@vitejs/plugin-react": "^4.2.1", + "@vitejs/plugin-react": "^4.3.1", "babel-jest": "^29.7.0", "eslint": "^7.32.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.6", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "license-checker": "^25.0.1", "prettier": "^2.8.8", - "ts-jest": "^29.1.2", + "ts-jest": "^29.1.5", "ts-node": "^10.9.2", - "typescript": "5.1.6", - "vite": "^5.2.7", - "vite-plugin-dts": "^3.8.1", + "typescript": "5.5.3", + "vite": "^5.3.3", + "vite-plugin-dts": "^3.9.1", "vite-plugin-eslint": "^1.8.1", "vite-plugin-externalize-deps": "^0.8.0" }, @@ -82,27 +82,27 @@ } }, "node_modules/@arcgis/core": { - "version": "4.29.10", - "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.29.10.tgz", - "integrity": "sha512-EMJOJkeXG7sYeKLrjEWvF3cKWCFB4CFEjcsfRi0j9UlULv9NV9IarVryG1oLCg17CtEzcKjl7EZXiPnZsX5M2Q==", + "version": "4.30.5", + "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.30.5.tgz", + "integrity": "sha512-ES/L1e1MuSZgG4mj960n0VRc5F/cW1gRLXpzJvRdhxXjsLWC/zsc4syW6CdQ09NjQFM1pd5IxuXz9U/tpWbjJg==", "peer": true, "dependencies": { - "@esri/arcgis-html-sanitizer": "~3.0.1", + "@esri/arcgis-html-sanitizer": "~4.0.1", "@esri/calcite-colors": "~6.1.0", - "@esri/calcite-components": "^2.4.0", - "@popperjs/core": "~2.11.8", - "@vaadin/grid": "~24.3.6", - "@zip.js/zip.js": "~2.7.34", + "@esri/calcite-components": "^2.8.5", + "@vaadin/grid": "~24.3.13", + "@zip.js/zip.js": "~2.7.44", "luxon": "~3.4.4", + "marked": "~12.0.2", "sortablejs": "~1.15.2" } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -110,30 +110,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -149,12 +149,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -164,37 +163,38 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -204,19 +204,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -227,12 +227,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -260,73 +260,75 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -336,35 +338,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -374,14 +376,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -391,100 +393,101 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", - "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.23.0", - "@babel/template": "^7.24.0", - "@babel/types": "^7.24.5" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -494,10 +497,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -505,13 +507,29 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -521,14 +539,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -538,13 +556,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -641,12 +659,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -656,12 +674,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -695,12 +713,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -812,12 +830,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -843,12 +861,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -858,14 +876,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -876,14 +894,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -893,12 +911,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -908,12 +926,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -923,13 +941,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -939,13 +957,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -956,18 +974,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -978,13 +996,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -994,12 +1012,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1009,13 +1027,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1025,12 +1043,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1040,12 +1058,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1056,13 +1074,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1072,12 +1090,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1088,13 +1106,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1104,14 +1122,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1121,12 +1139,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1137,12 +1155,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1152,12 +1170,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1168,12 +1186,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1183,13 +1201,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1199,14 +1217,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1216,15 +1234,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1234,13 +1252,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1250,13 +1268,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1266,12 +1284,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1281,12 +1299,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1297,12 +1315,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1313,15 +1331,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1331,13 +1349,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1347,12 +1365,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1363,13 +1381,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1380,12 +1398,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1395,13 +1413,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1411,14 +1429,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1429,12 +1447,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1474,12 +1492,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1490,12 +1508,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1505,12 +1523,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1520,13 +1538,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1536,12 +1554,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1551,12 +1569,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1566,12 +1584,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1581,15 +1599,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", - "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1599,12 +1617,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1614,13 +1632,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1630,13 +1648,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1646,13 +1664,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1662,26 +1680,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", - "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1693,54 +1712,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.1", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.1", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1770,16 +1789,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1806,33 +1825,31 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1841,12 +1858,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1882,12 +1899,12 @@ } }, "node_modules/@deck.gl/aggregation-layers": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.14.tgz", - "integrity": "sha512-cmoCD1RZ3v91+lkfAOWZMmQc0BFjSiXwinmUvlBkXSkZLgL1j4vGXw/t2kFHseBJnFo/rLRXzeF3ckuPOGCPoQ==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.21.tgz", + "integrity": "sha512-vJzJhYjZD7Nk/d+aQ5rifv7fSeV7ThIgHVnpe3j9QAS8Yy5VfuHKcOqIMi0JlRNPdINqmXjokknRno5jrdBCJA==", "dependencies": { - "@luma.gl/constants": "^9.0.11", - "@luma.gl/shadertools": "^9.0.11", + "@luma.gl/constants": "^9.0.15", + "@luma.gl/shadertools": "^9.0.15", "@math.gl/web-mercator": "^4.0.0", "d3-hexbin": "^0.2.1" }, @@ -1899,11 +1916,11 @@ } }, "node_modules/@deck.gl/arcgis": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.0.14.tgz", - "integrity": "sha512-3q0DCVRHAsk/0uNnllFtv089IS+/wgqjYX+DcYPMsmuEHa9MouL4MVIsGRT50RmLDd9TkBrbtMhFa8fuDT3x2w==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.0.21.tgz", + "integrity": "sha512-Yki93Y6tV4N8MxBaal2wVFQLIb3UAlPkgmeAlWAuWrtWvAhCgdDZazwFao8SE5Ifoemi7U0faBMJR0BVX6ntMA==", "dependencies": { - "@luma.gl/constants": "^9.0.11", + "@luma.gl/constants": "^9.0.15", "esri-loader": "^3.7.0" }, "peerDependencies": { @@ -1914,23 +1931,22 @@ } }, "node_modules/@deck.gl/carto": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.14.tgz", - "integrity": "sha512-tbsKvo56TDXZ+HoA4XV9g1BIL/PrdvcemP/AYYABw/iOQNMP4ZmiRmGBLCIpa34q8NjR4aHLrYxMgBK1S4YMvQ==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.21.tgz", + "integrity": "sha512-UjP/CN5DhXgfvKgVjzHZkYY2fGwFc9vscP1DciNZIdpZqij9uoVTgP5QxYEXKUe2pbJ8NEZlE5jpn5VEyogrIw==", "dependencies": { "@loaders.gl/gis": "^4.2.0", "@loaders.gl/loader-utils": "^4.2.0", "@loaders.gl/mvt": "^4.2.0", "@loaders.gl/schema": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", - "@luma.gl/constants": "^9.0.11", - "@luma.gl/core": "^9.0.11", - "@luma.gl/shadertools": "^9.0.11", + "@luma.gl/core": "^9.0.15", + "@luma.gl/shadertools": "^9.0.15", "@math.gl/web-mercator": "^4.0.0", "@types/d3-array": "^3.0.2", "@types/d3-color": "^1.4.2", "@types/d3-scale": "^3.0.0", - "cartocolor": "^4.0.2", + "cartocolor": "^5.0.2", "d3-array": "^3.2.0", "d3-color": "^3.1.0", "d3-format": "^3.1.0", @@ -1951,17 +1967,17 @@ } }, "node_modules/@deck.gl/core": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.14.tgz", - "integrity": "sha512-F3HtES5o5/hC6ouhiE+qmw9NeUiaY55UqQt+iODEwbfy4mtRV7TyNWJTC1jY+dw5qUTmwvAT66NYufI1GQYEnA==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.21.tgz", + "integrity": "sha512-RXVedj0n2Smt6xOqPD7Gb8QNz1MYGlVNvQ65N4uPZ7vUqmpKY+nO6R8Au5DbrK+4gQm/BNOuWtUbxJH2KhNCyQ==", "dependencies": { "@loaders.gl/core": "^4.2.0", "@loaders.gl/images": "^4.2.0", - "@luma.gl/constants": "^9.0.11", - "@luma.gl/core": "^9.0.11", - "@luma.gl/engine": "^9.0.11", - "@luma.gl/shadertools": "^9.0.11", - "@luma.gl/webgl": "^9.0.11", + "@luma.gl/constants": "^9.0.15", + "@luma.gl/core": "^9.0.15", + "@luma.gl/engine": "^9.0.15", + "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/webgl": "^9.0.15", "@math.gl/core": "^4.0.0", "@math.gl/sun": "^4.0.0", "@math.gl/web-mercator": "^4.0.0", @@ -1974,12 +1990,12 @@ } }, "node_modules/@deck.gl/extensions": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.14.tgz", - "integrity": "sha512-tQM9frol9E48oV5OzNIIYf3aePUlPO2vCEdTcXxn7Y7d1hBf4xrTMlKeM+4nR+LP2iB/40gUrYYAMTkcRAsGPA==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.21.tgz", + "integrity": "sha512-ANiCPDN4tIR/e9eg7LWPvtqagQXIxD7AQkWKNDJz853js/YlVjxse2K1lhyrLgNLRaeacsOliglJI+1174ZY/Q==", "dependencies": { - "@luma.gl/constants": "^9.0.11", - "@luma.gl/shadertools": "^9.0.11", + "@luma.gl/constants": "^9.0.15", + "@luma.gl/shadertools": "^9.0.15", "@math.gl/core": "^4.0.0" }, "peerDependencies": { @@ -1989,9 +2005,9 @@ } }, "node_modules/@deck.gl/geo-layers": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.14.tgz", - "integrity": "sha512-ldMghVE3dR4eXglZ4CA+zQJ+UQeQQCHlzaqiNsX2+fyNeJ+K4TuzNAPQaW/HKseJvanRAggD1OKrV0xsqQ81KA==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.21.tgz", + "integrity": "sha512-87s6rqOcsJALjSxfc+bH0GBqHbVshISu4Ii6CRHQpBl0Hply1ERONrUj0lIgU8d9sGt71Ide4cH3yHeFw+ynhQ==", "dependencies": { "@loaders.gl/3d-tiles": "^4.2.0", "@loaders.gl/gis": "^4.2.0", @@ -2001,8 +2017,8 @@ "@loaders.gl/terrain": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", "@loaders.gl/wms": "^4.2.0", - "@luma.gl/gltf": "^9.0.11", - "@luma.gl/shadertools": "^9.0.11", + "@luma.gl/gltf": "^9.0.15", + "@luma.gl/shadertools": "^9.0.15", "@math.gl/core": "^4.0.0", "@math.gl/culling": "^4.0.0", "@math.gl/web-mercator": "^4.0.0", @@ -2021,11 +2037,11 @@ } }, "node_modules/@deck.gl/google-maps": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.14.tgz", - "integrity": "sha512-6k4zUQktHNaD1JvQO0KlkTKMRd7aEKOlaYSIbxnhq8vrJp3lSaIXdpppmbB/Z++p6U6xbcNFT/oMdKVnY4SwSw==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.21.tgz", + "integrity": "sha512-GqkuLxgqgr/SIPMtVQDX7ahDGvwAS+Kvm+ka5wJuktbi4ExKja3w26NKS/1avpUC8YkobdqHEC6toyv7tiPpCQ==", "dependencies": { - "@luma.gl/constants": "^9.0.11", + "@luma.gl/constants": "^9.0.15", "@math.gl/core": "^4.0.0", "@types/google.maps": "^3.48.6" }, @@ -2035,9 +2051,9 @@ } }, "node_modules/@deck.gl/json": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.14.tgz", - "integrity": "sha512-D03XvhZ4tv2RRb1CryBC0hFdZi8W7OLKiYySnLdvrR8SGh4POxCPK2fauU+vmNsQiCuSAw1ADaBWMj++o2o0tA==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.21.tgz", + "integrity": "sha512-qzCWh4RK1bioOU3sfLGb10yHR2+G8x7bUqHTFz6Rw4KGUInrF/FRokidUjLOy6Sa9E6o1S+7EAXb1xjNmx0L9w==", "dependencies": { "expression-eval": "^5.0.0" }, @@ -2046,9 +2062,9 @@ } }, "node_modules/@deck.gl/layers": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.14.tgz", - "integrity": "sha512-gnt6hrbwbru8uNyMGkruroa2+h/2KUAVLztXuYk9kPAsoIr4806ZfBM/pneQe6UTbHMDnVpVtaS2fTY8wW5Jcw==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.21.tgz", + "integrity": "sha512-R+Uoj2VpFW3QuRvZFQjjDcFQLfBP+zp+/8puJqrfDdQNG/d8MR96rzVXIxFfrKGCEh34qM7zbB4zSzc1SzhxgQ==", "dependencies": { "@loaders.gl/images": "^4.2.0", "@loaders.gl/schema": "^4.2.0", @@ -2066,11 +2082,11 @@ } }, "node_modules/@deck.gl/mapbox": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.14.tgz", - "integrity": "sha512-Lu4UuMh1klHvym4SN8pVs2mpQm16e5D4O8pCmGgLcepiQ6Ij4U6RwhnWVJ1FK0Pl01YcVonLeG25rJBcQ2S3zg==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.21.tgz", + "integrity": "sha512-9IxkjRAfDlqFxfVYDUeWb+YG5tnF6f8BRReogic/ImKAfe5Qk1aG1p47X0jSBWm8wRx45W+jvCpA/wPd0sfHQg==", "dependencies": { - "@luma.gl/constants": "^9.0.11", + "@luma.gl/constants": "^9.0.15", "@math.gl/web-mercator": "^4.0.0" }, "peerDependencies": { @@ -2079,13 +2095,13 @@ } }, "node_modules/@deck.gl/mesh-layers": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.14.tgz", - "integrity": "sha512-2Zvn3nLrVCMBFMrYkHiI9QJXOvsTFLjaLNjcpjJJ5w8hoRCmhgDY8OJ3hVVPDUH1ADEOkg6WK7FNLy+nZbvULw==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.21.tgz", + "integrity": "sha512-ywTKEun/QA8p2ZhfBAKjD3DgjMzztEdWF/xOtEJfdPTG03v7WDfd8jFiLDCwVxGAuoxljRuNOX/B5z6HhizbNg==", "dependencies": { "@loaders.gl/gltf": "^4.2.0", - "@luma.gl/gltf": "^9.0.11", - "@luma.gl/shadertools": "^9.0.11" + "@luma.gl/gltf": "^9.0.15", + "@luma.gl/shadertools": "^9.0.15" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", @@ -2094,9 +2110,9 @@ } }, "node_modules/@deck.gl/react": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.14.tgz", - "integrity": "sha512-wHw8XkRWaD30s+EC+S9ZRmRRkaMgxTdxMidIk6rBxhmTI+RX0A/HQPBEXp+WiNaPyuwN31td6LgG9SlEJJ6UFA==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.21.tgz", + "integrity": "sha512-u9CxlSU4boWKsAU0zcTzzn9gUTSJmlNjx1gQTP4ZB6aIw3DkaLMZYi+yWIuIuExXbQh6UlUan4n2PjhuPHlm1Q==", "peerDependencies": { "@deck.gl/core": "^9.0.0", "react": ">=16.3.0", @@ -2104,9 +2120,9 @@ } }, "node_modules/@deck.gl/widgets": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.14.tgz", - "integrity": "sha512-DoxESfwbQR1ffME4lbWSm/w5jOLPu/PGPXUAU4d/VQWhLX0axf6ZcOja+7HnpeD5ZbwWdQ5sNTcTckgzZs2RTQ==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.21.tgz", + "integrity": "sha512-KJkCihnE3ZWxw1+vGAtFT/78Cfa3jgOGI1E8AX5wtlidIFyrba2D6jeek78OJhsO/9TB/26j3fnIbZPSdDo+Wg==", "dependencies": { "preact": "^10.17.0" }, @@ -2274,9 +2290,9 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -2290,9 +2306,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -2306,9 +2322,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -2322,9 +2338,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -2338,9 +2354,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -2354,9 +2370,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -2370,9 +2386,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -2386,9 +2402,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -2402,9 +2418,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -2418,9 +2434,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -2434,9 +2450,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -2450,9 +2466,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -2466,9 +2482,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -2482,9 +2498,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -2498,9 +2514,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -2514,9 +2530,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -2530,9 +2546,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -2546,9 +2562,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -2562,9 +2578,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -2578,9 +2594,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -2594,9 +2610,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -2610,9 +2626,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -2626,9 +2642,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -2732,12 +2748,15 @@ } }, "node_modules/@esri/arcgis-html-sanitizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-3.0.1.tgz", - "integrity": "sha512-cwZJwsYCJZwtBQU2AmaiIVFg5nZcVwInPYja1/OgC9iKYO+ytZRoc5h+0S9/ygbFNoS8Nd0RX9A85stLX/BgiA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-4.0.3.tgz", + "integrity": "sha512-B06V4Spjhcy2zcKH9SaTrZwRGjUTlsCSGImdCpe7fN/Q3HxLa4QosMgrRJQ+Q8guLhBA177+6Fjwzl/xIrmY7A==", "peer": true, "dependencies": { "xss": "1.0.13" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@esri/calcite-colors": { @@ -2747,17 +2766,17 @@ "peer": true }, "node_modules/@esri/calcite-components": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-2.8.2.tgz", - "integrity": "sha512-eQvYWQVcT5+Wpm0xECnyw1oCSg36E6y0i5qBn7PjwrOtEbYQwlLqOmSzEk0JLbZxRvjJjegtqZhn5H75rnngIQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-2.10.1.tgz", + "integrity": "sha512-8M2ZBYcEk20x34TDxZ6H5rLCWtGrOJLtHA/k6yWL/GJTC85/gvY153XxbGN8F1ywJb/3imvhy/SlfNRPnVPQNQ==", "peer": true, "dependencies": { - "@floating-ui/dom": "1.6.3", - "@stencil/core": "4.17.1", + "@floating-ui/dom": "1.6.5", + "@stencil/core": "4.18.3", "@types/color": "3.0.6", "color": "4.2.3", "composed-offset-position": "0.0.4", - "dayjs": "1.11.10", + "dayjs": "1.11.11", "focus-trap": "7.5.4", "lodash-es": "4.17.21", "sortablejs": "1.15.1", @@ -2765,16 +2784,6 @@ "type-fest": "4.18.2" } }, - "node_modules/@esri/calcite-components/node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", - "peer": true, - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, "node_modules/@esri/calcite-components/node_modules/sortablejs": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.1.tgz", @@ -2805,7 +2814,6 @@ "version": "1.6.5", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", - "dev": true, "dependencies": { "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" @@ -3650,7 +3658,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3664,7 +3671,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -3673,7 +3679,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -3681,14 +3686,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3710,19 +3713,19 @@ } }, "node_modules/@loaders.gl/3d-tiles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.2.1.tgz", - "integrity": "sha512-rDzWmdyE6YSd/QiqOO8n3LeRLZEP2LYHr6DffAItRzg464xsRjE4992MVvdn6B7yvB9FMrGeb1vshm89G0f8mw==", - "dependencies": { - "@loaders.gl/compression": "4.2.1", - "@loaders.gl/crypto": "4.2.1", - "@loaders.gl/draco": "4.2.1", - "@loaders.gl/gltf": "4.2.1", - "@loaders.gl/images": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/math": "4.2.1", - "@loaders.gl/tiles": "4.2.1", - "@loaders.gl/zip": "4.2.1", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.2.2.tgz", + "integrity": "sha512-op7KelDjEahz+ViFmavJdHw10n6lRZeTefC/cVYVQ1Jfvb8T+55KaOOXGoZODo14/B8Z53FnyPGVqR68dBYARw==", + "dependencies": { + "@loaders.gl/compression": "4.2.2", + "@loaders.gl/crypto": "4.2.2", + "@loaders.gl/draco": "4.2.2", + "@loaders.gl/gltf": "4.2.2", + "@loaders.gl/images": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/math": "4.2.2", + "@loaders.gl/tiles": "4.2.2", + "@loaders.gl/zip": "4.2.2", "@math.gl/core": "^4.0.1", "@math.gl/culling": "^4.0.1", "@math.gl/geospatial": "^4.0.1", @@ -3739,12 +3742,12 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/@loaders.gl/compression": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.2.1.tgz", - "integrity": "sha512-GaeAW9Cn355ClsB0bCw28/YvCd+n7kTPE6QgwaMzblc9HCvzqTwvcl2FdFg6YBbKGMjwhNVbKYAw9XmnlNzf1Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.2.2.tgz", + "integrity": "sha512-dBFjMe4zLhE4NXfVsPkhs267/55qnxgP/AIhksOKTx30gQxCtcty6RWhfWGnluTnbAEXID2Uq/vfp1HYH7ZYCg==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/worker-utils": "4.2.1", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/worker-utils": "4.2.2", "@types/brotli": "^1.3.0", "@types/pako": "^1.0.1", "fflate": "0.7.4", @@ -3762,23 +3765,23 @@ } }, "node_modules/@loaders.gl/core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.2.1.tgz", - "integrity": "sha512-VadjNJaH3oixqhUgu4SbmEALar7ELinXbIh6gxYPhFNdEicPXmFT3qrZG49p9x6KG/iP3vWR2jOHgebyFMeXPg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.2.2.tgz", + "integrity": "sha512-d3YElSsqL29MaiOwzGB97v994SPotbTvJnooCqoQsYGoYYrECdIetv1/zlfDsh5UB2Wl/NaUMJrzyOqlLmDz5Q==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", - "@loaders.gl/worker-utils": "4.2.1", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", + "@loaders.gl/worker-utils": "4.2.2", "@probe.gl/log": "^4.0.2" } }, "node_modules/@loaders.gl/crypto": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.2.1.tgz", - "integrity": "sha512-t8X5BOQRmXveDK/4Gz4vXCDMA9NiFzAuTdyTTwdJKmenvCRN+E6IH1OYmCHjo19DtHG0fzmp4DgocqOAaCUHEQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.2.2.tgz", + "integrity": "sha512-0rbpHX8784wkcTb8+gjkzAxdA4p2CH3W5xxzdvpG4r37jVQwKYrh2NJxeF+xGIuuxlEaxD8x4kcyadKgCVtspA==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/worker-utils": "4.2.1", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/worker-utils": "4.2.2", "@types/crypto-js": "^4.0.2" }, "peerDependencies": { @@ -3786,13 +3789,13 @@ } }, "node_modules/@loaders.gl/draco": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.2.1.tgz", - "integrity": "sha512-Iw2rL6Qi08xoiXlP63DcWa0M5znULrZPzlus3cmgrx2cPazT7Cp5nRG78z/XvsnriwhBZWAdb6saG3NRtLpHWA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.2.2.tgz", + "integrity": "sha512-WM7Zw6+04QzqlXjUYibR63Zi4I2iuBaDR41Rguur1s+ns2faiHDyEvuFlKtArTChFPQ8Xzf+6MNt7JeR8kpZTA==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", - "@loaders.gl/worker-utils": "4.2.1", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", + "@loaders.gl/worker-utils": "4.2.2", "draco3d": "1.5.7" }, "peerDependencies": { @@ -3800,12 +3803,12 @@ } }, "node_modules/@loaders.gl/gis": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.2.1.tgz", - "integrity": "sha512-TH4/OBgchIDGvKdy9Tg/g+5Ue5yid7XgVslDtUAs6ZdW1qpKCWFAcOAnrKgaF7bT2W3caMWakfhJRoNySz9KBA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.2.2.tgz", + "integrity": "sha512-s9kD6yLMKn8+jAhDFDVWBeeKcDkJHFrscTnVWveGBfnC7IYT4gD6lQeHRIfXrJKs0LWmKPrAS8grTq7Ull8V6Q==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", "@mapbox/vector-tile": "^1.3.1", "@math.gl/polygon": "^4.0.0", "pbf": "^3.2.1" @@ -3815,15 +3818,15 @@ } }, "node_modules/@loaders.gl/gltf": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.2.1.tgz", - "integrity": "sha512-EjEQv3ovOskLDSrCzYiE1S7i4gCvrqYmgVc5ThkpCuDFwBszOZjLFtPscj9ORI7jof4JFosvzWx1Cn5DvRVIhA==", - "dependencies": { - "@loaders.gl/draco": "4.2.1", - "@loaders.gl/images": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", - "@loaders.gl/textures": "4.2.1", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.2.2.tgz", + "integrity": "sha512-AK90PnRoaZ1jw/QWkg6TEJG8Yxd/QefxwlbMRJvtgk7QafsYo8dMm0e7EYgyOms0wDOcPflm5LHkIoqViRp/ww==", + "dependencies": { + "@loaders.gl/draco": "4.2.2", + "@loaders.gl/images": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", + "@loaders.gl/textures": "4.2.2", "@math.gl/core": "^4.0.0" }, "peerDependencies": { @@ -3831,23 +3834,23 @@ } }, "node_modules/@loaders.gl/images": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.2.1.tgz", - "integrity": "sha512-w/CPNmnqu1eutOo3BJ30ad3CXHPs5vPa9ZzwAL6PQSMb+rqaCRVCfHlaDedzBh+KyPfC9C+q62ouQvzUT5XKDg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.2.2.tgz", + "integrity": "sha512-R53rkexvVT0i4YXt++r8gLq3reB6kWTLvdJL81J3R4YJbM5+kNSe40jJOA94LFYlsTN+oirF4lkLTe5YXGZPYQ==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1" + "@loaders.gl/loader-utils": "4.2.2" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/loader-utils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.1.tgz", - "integrity": "sha512-8algFDeaEB+ceXJK9/s/d/YjBfCEXXGrsIyGF18APfWTldzEwYoL/D8VV8RnklR7ICJjYCotBoF96USkoB9tMQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.2.tgz", + "integrity": "sha512-5udJQhFx1KNIcRBYkFMi8QZitAsK+m3PkZ9GejM8VpOSsJUHD2Yal3wBHOPTRsOjQ0zXG/nqM7BHOojjeetNTg==", "dependencies": { - "@loaders.gl/schema": "4.2.1", - "@loaders.gl/worker-utils": "4.2.1", + "@loaders.gl/schema": "4.2.2", + "@loaders.gl/worker-utils": "4.2.2", "@probe.gl/stats": "^4.0.2" }, "peerDependencies": { @@ -3855,12 +3858,12 @@ } }, "node_modules/@loaders.gl/math": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.2.1.tgz", - "integrity": "sha512-7y8RadrhGYZB3IH2URkj7+KS7OIqq6p11pYY9BL71+3C8CQ5dx1iWOcVQghpm1e7kgoSMLRJ2L93pVkCfLc7mA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.2.2.tgz", + "integrity": "sha512-nfiNNxXobhdKJILlHDWvm92SMEMMh1XAsb4BYvRIHyTzw4KzflFMS6C62v8ctAW6P8pQKyRvuos9LcRyroty1A==", "dependencies": { - "@loaders.gl/images": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/images": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", "@math.gl/core": "^4.0.0" }, "peerDependencies": { @@ -3868,14 +3871,14 @@ } }, "node_modules/@loaders.gl/mvt": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.2.1.tgz", - "integrity": "sha512-k6c6BDeezDrrd9JGy3C/O1QwYc1iB61AR2wlryBUDGiTmBdA4YNPByMnvgR7ZJClIWEJcUeE2yEdgH1PTPdixw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.2.2.tgz", + "integrity": "sha512-KglhYp1rwIs6h6AtrmKjrEYWxcX6xhlG3c3pTIFJwfA5nMBa+cmzD19vBRo1po9hzWKq4oqqhi7JL0ovH6GAqw==", "dependencies": { - "@loaders.gl/gis": "4.2.1", - "@loaders.gl/images": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", + "@loaders.gl/gis": "4.2.2", + "@loaders.gl/images": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", "@math.gl/polygon": "^4.0.0", "pbf": "^3.2.1" }, @@ -3884,9 +3887,9 @@ } }, "node_modules/@loaders.gl/schema": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.1.tgz", - "integrity": "sha512-uhcQmeOJDmosWGlGRVEwx5zCTcME6Fy7QiR+IuEZaUyEkcFJZU8Ccit4d5ap9gHz1avANzan/+h2dECSpjd8wg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.2.tgz", + "integrity": "sha512-vrQ6vlGWWptJXDP1DrL5x/j70xmyt2l36QZcGyDYptrohTGvQLc3yrOEHuD5v96fXX5WR619pT3zSYhuf1FnIg==", "dependencies": { "@types/geojson": "^7946.0.7" }, @@ -3895,13 +3898,13 @@ } }, "node_modules/@loaders.gl/terrain": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.2.1.tgz", - "integrity": "sha512-/XDW+5zOoYoJR2JwoDC+aoR3j+mHDWJ8cOlu6Nb6sldQHd85pIOdmBmOzBRGAc0gv1v0/ItDGEoDd0wPV9eBeg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.2.2.tgz", + "integrity": "sha512-M5wDS20y0TTq9giCONLOWSIznD9H4JxfU1wicyEGUOa8U2u0Fdau5TObr//fOcT+Tvemkvcn01Oxj8acJWIsGw==", "dependencies": { - "@loaders.gl/images": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", + "@loaders.gl/images": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", "@mapbox/martini": "^0.2.0" }, "peerDependencies": { @@ -3909,14 +3912,14 @@ } }, "node_modules/@loaders.gl/textures": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.2.1.tgz", - "integrity": "sha512-gNLbNgKaLHuD68+ILXCx0XhxnTFEzWsHJ/1EVk48TjZ83EEYWNMsTwJhGtsu8U4CX/4D5vQ1Fc9oIT7mDR1JsQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.2.2.tgz", + "integrity": "sha512-UlxCCi7VbCloj4VCzSULASgGVA059jglQYLc3kIHclvGoMcx3MJi0hID0MEQ6IhdO9Zyn4F42doVPrriNDVJFQ==", "dependencies": { - "@loaders.gl/images": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", - "@loaders.gl/worker-utils": "4.2.1", + "@loaders.gl/images": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", + "@loaders.gl/worker-utils": "4.2.2", "@math.gl/types": "^4.0.1", "ktx-parse": "^0.0.4", "texture-compressor": "^1.0.2" @@ -3926,12 +3929,12 @@ } }, "node_modules/@loaders.gl/tiles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.2.1.tgz", - "integrity": "sha512-XqctpHvcrZVhedd2WevHyLrkCho3F3CgCFyENJK9seR10O3/hez5cGwCFbbsqsnol+hR6r4VkEUH7QDq7Imxkw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.2.2.tgz", + "integrity": "sha512-mozBA1FOrOFXa0lBxrRvHoRxsSb9T8D6ZfFIpbVR1z0zEWKm+NgRQzO8yS4IJD/CPFOn/r31SolZII6yXnzWbg==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/math": "4.2.1", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/math": "4.2.2", "@math.gl/core": "^4.0.0", "@math.gl/culling": "^4.0.0", "@math.gl/geospatial": "^4.0.0", @@ -3943,14 +3946,14 @@ } }, "node_modules/@loaders.gl/wms": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.2.1.tgz", - "integrity": "sha512-fdU5EYdq8oTtw4xUvZnjrgieqbog5B++iAlVuZNAMN+ws17Gjjkp+aaQclQ3ZIGd/IfKQLQ9ciZxLmqw2BeygA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.2.2.tgz", + "integrity": "sha512-MoZqOgebyXsElfNbjX/el4jA9Rypusq7Z+cJ1tiP2yBTepuLkPBpXLeuUgt/v0MOqGoUWrkUY8I811ijkZYyjA==", "dependencies": { - "@loaders.gl/images": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", - "@loaders.gl/xml": "4.2.1", + "@loaders.gl/images": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", + "@loaders.gl/xml": "4.2.2", "@turf/rewind": "^5.1.5", "deep-strict-equal": "^0.2.0" }, @@ -3959,20 +3962,20 @@ } }, "node_modules/@loaders.gl/worker-utils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.1.tgz", - "integrity": "sha512-+cZEgmyHQ3SPYX8Lzeqd7JZaMPbbnJuQs7fyMbfBeb7hmkO4XNwo/tnk/vKSmP24YMugAbWrxRlKNI0CMbkOhw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.2.tgz", + "integrity": "sha512-7Ad83VS/PmS0T3LXo+LB6cq5oHhAUW3GvYWizm4OfeuBDQRtYK7iRehgC13/BomkNtWIn0y7iAphlQMVrNdvhQ==", "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, "node_modules/@loaders.gl/xml": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.2.1.tgz", - "integrity": "sha512-J7/RBuyD7vrgsITP4iCkAFppEXaSpXUXBWKQPa1aMzLm8UUdS3RcWgEcfDNQ9SURxKF78NsHOqkIv9TZpg1mSQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.2.2.tgz", + "integrity": "sha512-ADikkGCwkS6d2IwFPomVAZfTNEHC6xXqDFbzfhYThsG3ptPpeosjJmn4GdI4dyazTsQnKIeiqV/RLS4CvJgxzw==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.1", - "@loaders.gl/schema": "4.2.1", + "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/schema": "4.2.2", "fast-xml-parser": "^4.2.5" }, "peerDependencies": { @@ -3980,13 +3983,13 @@ } }, "node_modules/@loaders.gl/zip": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.2.1.tgz", - "integrity": "sha512-t1LL+LYrLWJGYy8Bnj+RZu73awIgVLhPIzdHZgaV9RH6BCMb15HIwx1ritF1ESHgxgI2AIFvpRil2+hqJZsnjg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.2.2.tgz", + "integrity": "sha512-8wuhWrmGFUb9X7i1E9ObhqyiYuwQj6x0ttzujXE6o83T8TI1i88fySttMe0LSV2aIrTLo8A5n6MOf2LPSefPYg==", "dependencies": { - "@loaders.gl/compression": "4.2.1", - "@loaders.gl/crypto": "4.2.1", - "@loaders.gl/loader-utils": "4.2.1", + "@loaders.gl/compression": "4.2.2", + "@loaders.gl/crypto": "4.2.2", + "@loaders.gl/loader-utils": "4.2.2", "jszip": "^3.1.5", "md5": "^2.3.0" }, @@ -3995,14 +3998,14 @@ } }, "node_modules/@luma.gl/constants": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.14.tgz", - "integrity": "sha512-mCZ5Sr39EX8AjPVy3v5W/XamaU6dtA5CEHCYLPdyMXEQ2snqsFut2Y4cOO/ySuOUccjEm4Y6Vb45BJKNMN8NyQ==" + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.15.tgz", + "integrity": "sha512-gcvQmd5Nl0rnU/lXq2Rj214Mjc2XnyBJlfcQfRUGBngvcN4AtQvVtZVUveW6wCZA6JysB0ntvi4ovZm4GhJ/lw==" }, "node_modules/@luma.gl/core": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.14.tgz", - "integrity": "sha512-XkgCpVWGtfmEVTRbkkBu1HksjD1+3ZFqamNlCNgeWqsCcy0UZ2+iTF9qyxnT9K0QhdhnPgox6890A49C2iSRnw==", + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.15.tgz", + "integrity": "sha512-pogG6a91oM0ynSvBm0MsA7ABWu1QdqlaGyrb1mxvQrQA1NvgN/jflYlqBZ8YfckgJdJe7EZ4bNqnR5ABOu7wIA==", "dependencies": { "@math.gl/types": "^4.0.0", "@probe.gl/env": "^4.0.2", @@ -4012,11 +4015,11 @@ } }, "node_modules/@luma.gl/engine": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.14.tgz", - "integrity": "sha512-7PuvXbcovFfXgCWC4eAZAPMzNAf3rfFo7Cd9FB7AEKLIwdYYN6nmn/PNjsZREa8eXK5ExDC8jDJ6lqtWrTqlyg==", + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.15.tgz", + "integrity": "sha512-CTumSSnBoDbmLF4CvdDk3O8UKArv+cuWq6yiquuPNnJkpzPu1CCz8cIE21boHMNTkWzrxZNceS0RQwbATgQVRA==", "dependencies": { - "@luma.gl/shadertools": "9.0.14", + "@luma.gl/shadertools": "9.0.15", "@math.gl/core": "^4.0.0", "@probe.gl/log": "^4.0.2", "@probe.gl/stats": "^4.0.2" @@ -4026,23 +4029,24 @@ } }, "node_modules/@luma.gl/gltf": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.14.tgz", - "integrity": "sha512-0C1AWEJ7xHN95cSNQXjA6NMCJZJLBlKl+eI65KXLtwIEdWnEopIr/+u4HX11P1lEzPMrpj3KFeCzo+scG+1hPA==", + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.15.tgz", + "integrity": "sha512-gZsWzpYd+oj8W8Gsrr+Iq8Q05zSTyzbAHgmDvDFati4d7X++jnCUZL00KB4wwheQ755MXHU+//+10b5L1Nev1Q==", "dependencies": { "@loaders.gl/textures": "^4.2.0", - "@luma.gl/shadertools": "9.0.14", + "@luma.gl/shadertools": "9.0.15", "@math.gl/core": "^4.0.0" }, "peerDependencies": { + "@loaders.gl/core": "^4.2.0", "@luma.gl/core": "^9.0.0", "@luma.gl/engine": "^9.0.0" } }, "node_modules/@luma.gl/shadertools": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.14.tgz", - "integrity": "sha512-4UFh/oQ+sRwERzuPf2flgMhHIbENU1xnHvXUzpzE3Z/+/DNljb2oSeMkW74fgpVmM6MuyHZhU1hM5RRq/mW3Tw==", + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.15.tgz", + "integrity": "sha512-U/W1Vh7HXlhw3T6edUMcLFPSO6OVlDZKPx8v6kSkJtjny37aFZaVeRupUgYfjsSxK1aEc5uTAN1w7+3lJMhUIg==", "dependencies": { "@math.gl/core": "^4.0.0", "@math.gl/types": "^4.0.0" @@ -4052,11 +4056,11 @@ } }, "node_modules/@luma.gl/webgl": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.14.tgz", - "integrity": "sha512-TcgXPWaKVEVbnzB6Cu49Ia70oZny/GNy57OLj82kW7+llrKY5bpfOaD5aSIDEV34nqmmlpML4agPJXEIzeP/BQ==", + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.15.tgz", + "integrity": "sha512-hAwer8bCe3S5fL8/1Z/gWp5dinVNOxC7oFZQ7uYVr/BhUu7NbUA6P9ueVJDANtE9wAh+tl/uN43mcH9aP7YMfQ==", "dependencies": { - "@luma.gl/constants": "9.0.14", + "@luma.gl/constants": "9.0.15", "@probe.gl/env": "^4.0.2" }, "peerDependencies": { @@ -4191,9 +4195,9 @@ } }, "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.2.0.tgz", - "integrity": "sha512-BTw6/3ysowky22QMtNDjElp+YLwwvBDh3xxnq1izDFjTtUERm5nYSihlNZ6QaxXb+6lX2T2t0hBEjheAI+kBEQ==", + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.0.tgz", + "integrity": "sha512-eSiQ3E5LUSxAOY9ABXGyfNhout2iEa6mUxKeaQ9nJ8NL1NuaQYU7zKqzx/LEYcXe1neT4uYAgM1wYZj3fTSXtA==", "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", @@ -4438,9 +4442,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.17", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.17.tgz", - "integrity": "sha512-DVAejDQkjNnIac7MfP8sLzuo7fyrBPxNdXe+6bYqOqg1z2OPTlfFAejSNzWe7UenRMuFu9/AyFXj/X2vN2w6dA==", + "version": "5.15.21", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.21.tgz", + "integrity": "sha512-dp9lXBaJZzJYeJfQY3Ow4Rb49QaCEdkl2KKYscdQHQm6bMJ+l4XPY3Cd9PCeeJTsHPIDJ60lzXbeRgs6sx/rpw==", "dev": true, "funding": { "type": "opencollective", @@ -4448,9 +4452,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.14.tgz", - "integrity": "sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==", + "version": "5.15.21", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.21.tgz", + "integrity": "sha512-yqkq1MbdkmX5ZHyvZTBuAaA6RkvoqkoAgwBSx9Oh0L0jAfj9T/Ih/NhMNjkl8PWVSonjfDUkKroBnjRyo/1M9Q==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9" @@ -4474,17 +4478,17 @@ } }, "node_modules/@mui/material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.14.tgz", - "integrity": "sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==", + "version": "5.15.21", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.21.tgz", + "integrity": "sha512-nTyCcgduKwHqiuQ/B03EQUa+utSMzn2sQp0QAibsnYe4tvc3zkMbO0amKpl48vhABIY3IvT6w9615BFIgMt0YA==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.14", - "@mui/system": "^5.15.14", + "@mui/core-downloads-tracker": "^5.15.21", + "@mui/system": "^5.15.20", "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", + "@mui/utils": "^5.15.20", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", @@ -4519,13 +4523,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", - "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", + "version": "5.15.20", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.20.tgz", + "integrity": "sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.14", + "@mui/utils": "^5.15.20", "prop-types": "^15.8.1" }, "engines": { @@ -4578,16 +4582,16 @@ } }, "node_modules/@mui/system": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.14.tgz", - "integrity": "sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==", + "version": "5.15.20", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.20.tgz", + "integrity": "sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.14", + "@mui/private-theming": "^5.15.20", "@mui/styled-engine": "^5.15.14", "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", + "@mui/utils": "^5.15.20", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -4632,9 +4636,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", - "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "version": "5.15.20", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.20.tgz", + "integrity": "sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", @@ -4713,6 +4717,7 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -5110,9 +5115,9 @@ } }, "node_modules/@stencil/core": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.17.1.tgz", - "integrity": "sha512-nlARe1QtK5abnCG8kPQKJMWiELg39vKabvf3ebm6YEhQA35CgrxC1pVYTsYq3yktJKoY+k+VzGRnATLKyaLbvA==", + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.18.3.tgz", + "integrity": "sha512-8yoG5AFQYEPocVtuoc5kvRS0Hku0MoDWDUpADRaXPVHsOFLmxR16LJENj25ucCz5GEfeTGQ/tCE8JAypPmr/fQ==", "peer": true, "bin": { "stencil": "bin/stencil" @@ -5123,9 +5128,9 @@ } }, "node_modules/@svgdotjs/svg.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.0.tgz", - "integrity": "sha512-Tr8p+QVP7y+QT1GBlq1Tt57IvedVH8zCPoYxdHLX0Oof3a/PqnC/tXAkVufv1JQJfsDHlH/UrjcDfgxSofqSNA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz", + "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==", "funding": { "type": "github", "url": "https://github.com/sponsors/Fuzzyma" @@ -5419,9 +5424,9 @@ } }, "node_modules/@types/google.maps": { - "version": "3.55.8", - "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.55.8.tgz", - "integrity": "sha512-aSyvlCRXzF9Jtjqq4zmA24sczKZ0QWJnn4zRrkufCoohHulS6LCf4KsF22eAlnHBuVYwEhQoMXIufUS7kXF5uA==" + "version": "3.55.11", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.55.11.tgz", + "integrity": "sha512-F3VuPtjKj4UGuyym75pqmgPBOHbT/i7I6/D+4DdtSzbeu2aWZG1ENwpbZOd46uO+PSAz9flJEhxxi+b4MVb4gQ==" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", @@ -5577,18 +5582,18 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { - "version": "18.2.75", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.75.tgz", - "integrity": "sha512-+DNnF7yc5y0bHkBTiLKqXFe+L4B3nvOphiMY3tuA5X10esmjqk7smyBZzbGTy2vsiy/Bnzj8yFIBL8xhRacoOg==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.24.tgz", - "integrity": "sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "dependencies": { "@types/react": "*" @@ -5877,38 +5882,38 @@ } }, "node_modules/@vaadin/a11y-base": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.13.tgz", - "integrity": "sha512-7iEbJiJM/+YIC/D7HzQUuU3OX27MhcNoX8k3mWLBQu8SCVGDerCZUlHCHfeFpbJc76aWDNUrvEhAzBVrM/mn+A==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.15.tgz", + "integrity": "sha512-gFLt2Hh49SGS1w7vni+txLhoSxLNpd89gBRzXyx61ug3G0u9ydKb96feyUR1eKjfN0gVDO9urRJy0h49+1p3WQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.13", + "@vaadin/component-base": "~24.3.15", "lit": "^3.0.0" } }, "node_modules/@vaadin/checkbox": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.13.tgz", - "integrity": "sha512-YT67/M31Dq7UKwtZ+hEUjOrVHnje+7wpf4aBYAeKoEqa57uw2Q9+lGTwoWgviVzXKtXhoQd/oLiNUaxeOVcNzA==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.15.tgz", + "integrity": "sha512-2LJ95fKBSgSi6dmuhFTXknp/zfmDGXnBV+e+ewdM8wYOFimSlCslhrkZNyXXb6T91TcZPx7qmjmGp4KF+PZR5Q==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.13", - "@vaadin/component-base": "~24.3.13", - "@vaadin/field-base": "~24.3.13", - "@vaadin/vaadin-lumo-styles": "~24.3.13", - "@vaadin/vaadin-material-styles": "~24.3.13", - "@vaadin/vaadin-themable-mixin": "~24.3.13", + "@vaadin/a11y-base": "~24.3.15", + "@vaadin/component-base": "~24.3.15", + "@vaadin/field-base": "~24.3.15", + "@vaadin/vaadin-lumo-styles": "~24.3.15", + "@vaadin/vaadin-material-styles": "~24.3.15", + "@vaadin/vaadin-themable-mixin": "~24.3.15", "lit": "^3.0.0" } }, "node_modules/@vaadin/component-base": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.13.tgz", - "integrity": "sha512-UjokKlcs3NVnUATmv03Av55dZGCqvRXEaY2N1PO0C5OYATNekF5wlnz2nQ1+j1Tvk9eI+bzZKN28Yu0S3kvl0A==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.15.tgz", + "integrity": "sha512-b5wQhrRZw5Ur+mK7IDm/j441Vv0Ww+RpgjTJfBgW3kT+4mJu1gqsO6VkhmxafVfaWM6AorcMB2cHmQwCZJzhSQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", @@ -5919,88 +5924,88 @@ } }, "node_modules/@vaadin/field-base": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.13.tgz", - "integrity": "sha512-Qc2OUaBDGbskBnnSlDNhQd682tL8QlpqFfoS9lrZhRV286OlkfEiQ06kMZc75Q9fIeVIz3S2BPhtdoxd/8Tc4w==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.15.tgz", + "integrity": "sha512-2om/73h41qC0S3AX6TgwZIEPikoGHUoPgFnBv0/30fjF5aqTMlQ7Ldw2g+oIaR+YDeCOfkB/3idoNogpz1QSQQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.13", - "@vaadin/component-base": "~24.3.13", + "@vaadin/a11y-base": "~24.3.15", + "@vaadin/component-base": "~24.3.15", "lit": "^3.0.0" } }, "node_modules/@vaadin/grid": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.13.tgz", - "integrity": "sha512-oRNP9V6d7khFlB49wDfPfHG1fHFImc9dagX9Tlatpo3j1TLJ9JlfkrdWsuYY1aYtYnx5huvH3iOAV93fV1CFFg==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.15.tgz", + "integrity": "sha512-qJI1pZBfGvwAtiE5Zk9DmjVuw/2DAslzhouhgNziBxyHmEj3jb1BStLJ+aXGytgvJ0aHY6fMr92KAGVOmKcsAw==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.13", - "@vaadin/checkbox": "~24.3.13", - "@vaadin/component-base": "~24.3.13", - "@vaadin/lit-renderer": "~24.3.13", - "@vaadin/text-field": "~24.3.13", - "@vaadin/vaadin-lumo-styles": "~24.3.13", - "@vaadin/vaadin-material-styles": "~24.3.13", - "@vaadin/vaadin-themable-mixin": "~24.3.13" + "@vaadin/a11y-base": "~24.3.15", + "@vaadin/checkbox": "~24.3.15", + "@vaadin/component-base": "~24.3.15", + "@vaadin/lit-renderer": "~24.3.15", + "@vaadin/text-field": "~24.3.15", + "@vaadin/vaadin-lumo-styles": "~24.3.15", + "@vaadin/vaadin-material-styles": "~24.3.15", + "@vaadin/vaadin-themable-mixin": "~24.3.15" } }, "node_modules/@vaadin/icon": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.13.tgz", - "integrity": "sha512-uH28N3fYJO6FObz+WLNfqHLm2VPbL1hNkmoU/yDiMldfIyTqpbSO2DlwNMXbsm3T8xkJRlHM+LWATheMsIynOw==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.15.tgz", + "integrity": "sha512-KS36B+G9lIj0NBnwz1BDAXU5vNsRKQXEbV5SjXLbQC7PwP0HpAz8Y61W1U9lqHtd9hG/forQd+znQYeDaubs1A==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.13", - "@vaadin/vaadin-lumo-styles": "~24.3.13", - "@vaadin/vaadin-themable-mixin": "~24.3.13", + "@vaadin/component-base": "~24.3.15", + "@vaadin/vaadin-lumo-styles": "~24.3.15", + "@vaadin/vaadin-themable-mixin": "~24.3.15", "lit": "^3.0.0" } }, "node_modules/@vaadin/input-container": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.13.tgz", - "integrity": "sha512-Rg77JYKwxMdnTqxTIQWkaiNCZGiI4sIP3V6sxYJxqn0v1Nwwy80OQ5nzGQj+KyNk4B6SajmAwgHbu+IcFthN1A==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.15.tgz", + "integrity": "sha512-5Bm8fMnIJRHfWBVIYVXGKcEF7NInJ9F1Z9k9fwBjJSFesd2KQ02IzqzOLd2+iVr8+ozp8dE0wQZQHXiAxoA4wg==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.13", - "@vaadin/vaadin-lumo-styles": "~24.3.13", - "@vaadin/vaadin-material-styles": "~24.3.13", - "@vaadin/vaadin-themable-mixin": "~24.3.13", + "@vaadin/component-base": "~24.3.15", + "@vaadin/vaadin-lumo-styles": "~24.3.15", + "@vaadin/vaadin-material-styles": "~24.3.15", + "@vaadin/vaadin-themable-mixin": "~24.3.15", "lit": "^3.0.0" } }, "node_modules/@vaadin/lit-renderer": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.13.tgz", - "integrity": "sha512-5/qtyj6YfdM7BjwH9cpA1y0rPRdKQYr2s6Ze/Ocgfb26DUR6n4daXzilB3TceUanvAFFScGx16CqlA/my1cozQ==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.15.tgz", + "integrity": "sha512-nJxHRjXb1JgcgNF4MYtYopAtIs+9RLhQ56TKyEfcRWXC6Eq6yZcKPN0mxCRalSnCZYUORuc0gvzfnZCMIdfa1Q==", "peer": true, "dependencies": { "lit": "^3.0.0" } }, "node_modules/@vaadin/text-field": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.13.tgz", - "integrity": "sha512-+f0DGrD+KmVw6s75Gdprugb01LYhsCdLgc2QLTrNjmyx/kvNfw76jTHZEeUuYYjxTMVyKXVstcWxG/oWt/sZSQ==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.15.tgz", + "integrity": "sha512-x0Z7O4zf24+XL7Zs7qghL1twBs79JvhhiFCLfttKG8j1njxr01QsoxlrxPrUJDP9T9hTSZAlJ8WkDE/+wWU25g==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.13", - "@vaadin/component-base": "~24.3.13", - "@vaadin/field-base": "~24.3.13", - "@vaadin/input-container": "~24.3.13", - "@vaadin/vaadin-lumo-styles": "~24.3.13", - "@vaadin/vaadin-material-styles": "~24.3.13", - "@vaadin/vaadin-themable-mixin": "~24.3.13", + "@vaadin/a11y-base": "~24.3.15", + "@vaadin/component-base": "~24.3.15", + "@vaadin/field-base": "~24.3.15", + "@vaadin/input-container": "~24.3.15", + "@vaadin/vaadin-lumo-styles": "~24.3.15", + "@vaadin/vaadin-material-styles": "~24.3.15", + "@vaadin/vaadin-themable-mixin": "~24.3.15", "lit": "^3.0.0" } }, @@ -6011,32 +6016,32 @@ "peer": true }, "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.13.tgz", - "integrity": "sha512-43h6sKTVdNJ2Gv3mTcD1oVHjrNKj28Zs+VqcTUS5Vn2bxmGsIm3V5qLMdSe5GWNeZPbl+5dFa1VjFUjQWElMYw==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.15.tgz", + "integrity": "sha512-W/CBtratSQrRzeren8R0rOtSlavSpy8FlLu4MM9E8CWzbPCVmg+jhATNKBSVQzcY991yE2qws44B/awuXpuhbg==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.13", - "@vaadin/icon": "~24.3.13", - "@vaadin/vaadin-themable-mixin": "~24.3.13" + "@vaadin/component-base": "~24.3.15", + "@vaadin/icon": "~24.3.15", + "@vaadin/vaadin-themable-mixin": "~24.3.15" } }, "node_modules/@vaadin/vaadin-material-styles": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.13.tgz", - "integrity": "sha512-TG+y/YPI4M2rXkkyzbb6EzLl2dFaf+sNEH7tZXz4RLAUciKC7QHgpEESwQ0mfdonov2xP9Op48eBhkWalhKxDA==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.15.tgz", + "integrity": "sha512-CSzHBunOYbfTOM9ZTl2xBAqU9FF9lGwog9p7wiSOxD1LEs2KqjlEnJ4sZ9tlwSjNEMQHopT0Fh5INUB1YBgUmw==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.13", - "@vaadin/vaadin-themable-mixin": "~24.3.13" + "@vaadin/component-base": "~24.3.15", + "@vaadin/vaadin-themable-mixin": "~24.3.15" } }, "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.3.13", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.13.tgz", - "integrity": "sha512-OmDLX92U1tefwgnmlP/OBsf/z/GGjy3IOoEUqEPCgf01+xB6wM6uCRaY1dBU8NgHQeaJq80YzQjP0z5D+SqTkA==", + "version": "24.3.15", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.15.tgz", + "integrity": "sha512-V/AQj4EL5SiDtGImqhFYMgE4g3WNZdcvgWBa57wlny83ThdcxJtc/vLLC1bRYlaLV9DTa93wW9N9tyt2qsexcA==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", @@ -6057,16 +6062,16 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", "dev": true, "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" + "react-refresh": "^0.14.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -6164,9 +6169,9 @@ "peer": true }, "node_modules/@zip.js/zip.js": { - "version": "2.7.44", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.44.tgz", - "integrity": "sha512-ZzMhAcAyRAYi1FZELsvKaw8I4ADxNTqbiVIjyo/syBe4HGWop9+OADnuBnHpm2TxgXPogxxhhPffOhDD40jUdA==", + "version": "2.7.45", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.45.tgz", + "integrity": "sha512-Mm2EXF33DJQ/3GWWEWeP1UCqzpQ5+fiMvT3QWspsXY05DyqqxWu7a9awSzU4/spHMHVFrTjani1PR0vprgZpow==", "peer": true, "engines": { "bun": ">=0.7.0", @@ -6480,16 +6485,19 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -6967,11 +6975,11 @@ ] }, "node_modules/cartocolor": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cartocolor/-/cartocolor-4.0.2.tgz", - "integrity": "sha512-+Gh9mb6lFxsDOLQlBLPxAHCnWXlg2W8q3AcVwqRcy95TdBbcOU89Wrb6h2Hd/6Ww1Kc1pzXmUdpnWD+xeCG0dg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/cartocolor/-/cartocolor-5.0.2.tgz", + "integrity": "sha512-Ihb/wU5V6BVbHwapd8l/zg7bnhZ4YPFVfa7quSpL86lfkPJSf4YuNBT+EvesPRP5vSqhl6vZVsQJwCR8alBooQ==", "dependencies": { - "colorbrewer": "1.0.0" + "colorbrewer": "1.5.6" } }, "node_modules/chalk": { @@ -7124,9 +7132,9 @@ "peer": true }, "node_modules/colorbrewer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.0.0.tgz", - "integrity": "sha512-NZuIOVdErK/C6jDH3jWT/roxWJbJAinMiqEpbuWniKvQAoWdg6lGra3pPrSHvaIf8PlX8wLs/RAC6nULFJbgmg==" + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.5.6.tgz", + "integrity": "sha512-fONg2pGXyID8zNgKHBlagW8sb/AMShGzj4rRJfz5biZ7iuHQZYquSCLE/Co1oSQFmt/vvwjyezJCejQl7FG/tg==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -7522,9 +7530,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", "peer": true }, "node_modules/de-indent": { @@ -7537,7 +7545,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -7567,26 +7574,26 @@ "dev": true }, "node_modules/deck.gl": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.14.tgz", - "integrity": "sha512-xjNLOT1WB5iAZ1Rtui1g9yXALiCQQW7IbEVSYRb+UTgLFtr/c0FZDksn1sT1S7IstAuzOXTmgq3fpXSvKdDrsA==", - "dependencies": { - "@deck.gl/aggregation-layers": "9.0.14", - "@deck.gl/arcgis": "9.0.14", - "@deck.gl/carto": "9.0.14", - "@deck.gl/core": "9.0.14", - "@deck.gl/extensions": "9.0.14", - "@deck.gl/geo-layers": "9.0.14", - "@deck.gl/google-maps": "9.0.14", - "@deck.gl/json": "9.0.14", - "@deck.gl/layers": "9.0.14", - "@deck.gl/mapbox": "9.0.14", - "@deck.gl/mesh-layers": "9.0.14", - "@deck.gl/react": "9.0.14", - "@deck.gl/widgets": "9.0.14", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.21.tgz", + "integrity": "sha512-8DMlI4SO97PtAY42wPcvmgMizTKthnp+afaTEGiIyPXDzun0FF6wjc8G3CC71iYYvEZ2gFcyKjSOemCd5BQgug==", + "dependencies": { + "@deck.gl/aggregation-layers": "9.0.21", + "@deck.gl/arcgis": "9.0.21", + "@deck.gl/carto": "9.0.21", + "@deck.gl/core": "9.0.21", + "@deck.gl/extensions": "9.0.21", + "@deck.gl/geo-layers": "9.0.21", + "@deck.gl/google-maps": "9.0.21", + "@deck.gl/json": "9.0.21", + "@deck.gl/layers": "9.0.21", + "@deck.gl/mapbox": "9.0.21", + "@deck.gl/mesh-layers": "9.0.21", + "@deck.gl/react": "9.0.21", + "@deck.gl/widgets": "9.0.21", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.11", - "@luma.gl/engine": "^9.0.11" + "@luma.gl/core": "^9.0.15", + "@luma.gl/engine": "^9.0.15" }, "peerDependencies": { "@arcgis/core": "^4.0.0", @@ -7990,9 +7997,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -8002,29 +8009,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -8175,29 +8182,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.11" }, "engines": { "node": ">=4" @@ -8207,9 +8214,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "engines": { "node": ">=10" @@ -8711,9 +8718,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", + "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", "funding": [ { "type": "github", @@ -9112,7 +9119,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -11772,7 +11778,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -11972,9 +11977,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lit": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.3.tgz", - "integrity": "sha512-l4slfspEsnCcHVRTvaP7YnkTZEZggNFywLEIhQaGhYDczG+tu/vlgm/KaWIEjIp+ZyV20r2JnZctMb8LeLCG7Q==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.4.tgz", + "integrity": "sha512-q6qKnKXHy2g1kjBaNfcoLlgbI3+aSOZ9Q4tiGa9bGYXq5RBXxkVTqTIVmP2VWMp29L4GyvCFm8ZQ2o56eUAMyA==", "peer": true, "dependencies": { "@lit/reactive-element": "^2.0.4", @@ -11983,9 +11988,9 @@ } }, "node_modules/lit-element": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", - "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.6.tgz", + "integrity": "sha512-U4sdJ3CSQip7sLGZ/uJskO5hGiqtlpxndsLr6mt3IQIjheg93UKYeGQjWMRql1s/cXNOaRrCzC2FQwjIwSUqkg==", "peer": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", @@ -11994,9 +11999,9 @@ } }, "node_modules/lit-html": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", - "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.4.tgz", + "integrity": "sha512-yKKO2uVv7zYFHlWMfZmqc+4hkmSbFp8jgjdZY9vvR9jr4J8fH6FUMXhr+ljfELgmjpvlF7Z1SJ5n5/Jeqtc9YA==", "peer": true, "dependencies": { "@types/trusted-types": "^2.0.2" @@ -12166,11 +12171,10 @@ } }, "node_modules/mapbox-gl": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.3.0.tgz", - "integrity": "sha512-cVeAu9PxPTx113AnJAzcSKbBtL5F5EpJ6/NuYgNib9zNduNSoDG2oVX6xK0bAP/VwwVwRh9SEhcyM7nh4GThvQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.4.0.tgz", + "integrity": "sha512-QWgL28zg/zuIOHeF8DXPvHy1UHTgO5p4Oy6ifCAHwI9/hoI9/Fruya0yI4HkDtX1OgzTLO6SHO13A781BGJvyw==", "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^3.0.0", "@mapbox/point-geometry": "^0.1.0", @@ -12194,7 +12198,7 @@ "rw": "^1.3.3", "serialize-to-js": "^3.1.2", "supercluster": "^8.0.0", - "tiny-lru": "^11.2.5", + "tiny-lru": "^11.2.6", "tinyqueue": "^2.0.3", "tweakpane": "^4.0.3", "vt-pbf": "^3.1.3" @@ -12211,9 +12215,9 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/maplibre-gl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.3.0.tgz", - "integrity": "sha512-lmv1iUJAWYde6KyGk0ln2WIJbQ/S3Fu3HZTQ9sCgVxPaB3X0aXJbFDsIer+kGrh2+ArhyuM7NzF1dB2nPl4bGQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.5.0.tgz", + "integrity": "sha512-qOS1hn4d/pn2i0uva4S5Oz+fACzTkgBKq+NpwT/Tqzi4MSyzcWNtDELzLUSgWqHfNIkGCl5CZ/w7dtis+t4RCw==", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", @@ -12222,7 +12226,7 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.2.0", + "@maplibre/maplibre-gl-style-spec": "^20.3.0", "@types/geojson": "^7946.0.14", "@types/geojson-vt": "3.2.5", "@types/junit-report-builder": "^3.0.2", @@ -12231,7 +12235,7 @@ "@types/pbf": "^3.0.5", "@types/supercluster": "^7.1.3", "earcut": "^2.2.4", - "geojson-vt": "^3.2.1", + "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "global-prefix": "^3.0.0", "kdbush": "^4.0.2", @@ -12251,6 +12255,23 @@ "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" } }, + "node_modules/maplibre-gl/node_modules/geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + }, + "node_modules/marked": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -12343,9 +12364,9 @@ } }, "node_modules/mjolnir.js": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.7.1.tgz", - "integrity": "sha512-72BeUWgTv2cj5aZQKpwL8caNUFhXZ9bDm1hxpNj70XJQ62IBnTZmtv/WPxJvtaVNhzNo+D2U8O6ryNI0zImYcw==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.7.3.tgz", + "integrity": "sha512-Z5z/+FzZqOSO3juSVKV3zcm4R2eAlWwlKMcqHmyFEJAaLILNcDKnIbnb4/kbcGyIuhtdWrzu8WOIR7uM6I34aw==", "dependencies": { "@types/hammerjs": "^2.0.41", "hammerjs": "^2.0.8" @@ -12389,8 +12410,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/muggle-string": { "version": "0.3.1", @@ -12869,9 +12889,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -12889,7 +12909,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -12902,9 +12922,9 @@ "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" }, "node_modules/preact": { - "version": "10.22.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", - "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", + "version": "10.22.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", + "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -14469,9 +14489,9 @@ } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.5.tgz", + "integrity": "sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -14487,10 +14507,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -14500,6 +14521,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -14714,9 +14738,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -14927,13 +14951,13 @@ } }, "node_modules/vite": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", - "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", + "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", + "esbuild": "^0.21.3", + "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { @@ -14982,9 +15006,9 @@ } }, "node_modules/vite-plugin-dts": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-3.8.1.tgz", - "integrity": "sha512-zEYyQxH7lKto1VTKZHF3ZZeOPkkJgnMrePY4VxDHfDSvDjmYMMfWjZxYmNwW8QxbaItWJQhhXY+geAbyNphI7g==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-3.9.1.tgz", + "integrity": "sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==", "dev": true, "dependencies": { "@microsoft/api-extractor": "7.43.0", diff --git a/package.json b/package.json index 2703a72d..3969b021 100644 --- a/package.json +++ b/package.json @@ -29,14 +29,14 @@ }, "dependencies": { "@mapbox/mapbox-gl-draw": "^1.4.3", - "@svgdotjs/svg.js": "^3.2.0", + "@svgdotjs/svg.js": "^3.2.4", "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^9.0.14", + "deck.gl": "^9.0.21", "geolib": "^3.3.4", - "mapbox-gl": "^3.2.0", - "maplibre-gl": "^4.1.2", + "mapbox-gl": "^3.4.0", + "maplibre-gl": "^4.5.0", "react-map-gl": "^7.1.7" }, "peerDependencies": { @@ -49,12 +49,12 @@ "react-intl": "^6.6.4" }, "devDependencies": { - "@babel/core": "^7.24.3", - "@babel/preset-env": "^7.24.3", - "@babel/preset-typescript": "^7.24.1", - "@mui/icons-material": "^5.15.14", - "@mui/material": "^5.15.14", - "@mui/system": "^5.15.14", + "@babel/core": "^7.24.7", + "@babel/preset-env": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", + "@mui/icons-material": "^5.15.21", + "@mui/material": "^5.15.21", + "@mui/system": "^5.15.20", "@types/eslint": "^7.29.0", "@types/eslint-config-prettier": "^6.11.3", "@types/jest": "^29.5.12", @@ -62,27 +62,27 @@ "@types/mapbox__mapbox-gl-draw": "^1.4.6", "@types/mapbox-gl": "^3.1.0", "@types/node": "^18.19.31", - "@types/react": "^18.2.75", - "@types/react-dom": "^18.2.24", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@vitejs/plugin-react": "^4.2.1", + "@vitejs/plugin-react": "^4.3.1", "babel-jest": "^29.7.0", "eslint": "^7.32.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.6", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "license-checker": "^25.0.1", "prettier": "^2.8.8", - "ts-jest": "^29.1.2", + "ts-jest": "^29.1.5", "ts-node": "^10.9.2", - "typescript": "5.1.6", - "vite": "^5.2.7", - "vite-plugin-dts": "^3.8.1", + "typescript": "5.5.3", + "vite": "^5.3.3", + "vite-plugin-dts": "^3.9.1", "vite-plugin-eslint": "^1.8.1", "vite-plugin-externalize-deps": "^0.8.0" } diff --git a/src/components/network-map-viewer/network/constants.js b/src/components/network-map-viewer/network/constants.ts similarity index 100% rename from src/components/network-map-viewer/network/constants.js rename to src/components/network-map-viewer/network/constants.ts diff --git a/src/components/network-map-viewer/network/draw-control.ts b/src/components/network-map-viewer/network/draw-control.ts index 20e464fc..9d710acd 100644 --- a/src/components/network-map-viewer/network/draw-control.ts +++ b/src/components/network-map-viewer/network/draw-control.ts @@ -8,8 +8,8 @@ import MapboxDraw from '@mapbox/mapbox-gl-draw'; import { useCallback } from 'react'; import { useControl } from 'react-map-gl'; -import type { ControlPosition } from 'react-map-gl'; import { EventedListener } from 'mapbox-gl'; +import type { ControlPosition } from 'react-map-gl'; let mapDrawerController: MapboxDraw | undefined = undefined; @@ -28,13 +28,29 @@ type DrawControlProps = ConstructorParameters[0] & { position?: ControlPosition; readyToDisplay: boolean; onDrawPolygonModeActive: (polygoneDrawing: DRAW_MODES) => void; - onCreate: EventedListener; - onUpdate: EventedListener; - onDelete: EventedListener; + onCreate?: EventedListener; + onUpdate?: EventedListener; + onDelete?: EventedListener; +}; + +const DefaultProps = { + onCreate: () => {}, + onUpdate: () => {}, + onDelete: () => {}, }; export default function DrawControl(props: DrawControlProps) { - const { onDrawPolygonModeActive } = props; + const { + onDrawPolygonModeActive, + position, + onCreate, + onUpdate, + onDelete, + ...mapboxProps + } = { + ...DefaultProps, + ...props, + }; const onModeChange = useCallback( (e: { mode: DRAW_MODES }) => { onDrawPolygonModeActive(e.mode); @@ -45,33 +61,27 @@ export default function DrawControl(props: DrawControlProps) { useControl( //onCreate () => { - mapDrawerController = new MapboxDraw({ ...props }); + mapDrawerController = new MapboxDraw({ ...mapboxProps }); return mapDrawerController; }, //on add ({ map }) => { - map.on('draw.create', props.onCreate); - map.on('draw.update', props.onUpdate); - map.on('draw.delete', props.onDelete); + map.on('draw.create', onCreate); + map.on('draw.update', onUpdate); + map.on('draw.delete', onDelete); map.on('draw.modechange', onModeChange); }, //onRemove ({ map }) => { - map.off('draw.create', props.onCreate); - map.off('draw.update', props.onUpdate); - map.off('draw.delete', props.onDelete); + map.off('draw.create', onCreate); + map.off('draw.update', onUpdate); + map.off('draw.delete', onDelete); map.off('draw.modechange', onModeChange); }, { - position: props.position, + position, } ); return null; } - -DrawControl.defaultProps = { - onCreate: () => {}, - onUpdate: () => {}, - onDelete: () => {}, -}; diff --git a/src/components/network-map-viewer/network/geo-data.js b/src/components/network-map-viewer/network/geo-data.ts similarity index 80% rename from src/components/network-map-viewer/network/geo-data.js rename to src/components/network-map-viewer/network/geo-data.ts index 2c648b11..3ac635d9 100644 --- a/src/components/network-map-viewer/network/geo-data.js +++ b/src/components/network-map-viewer/network/geo-data.ts @@ -5,35 +5,61 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import cheapRuler from 'cheap-ruler'; import { computeDestinationPoint, getGreatCircleBearing, getRhumbLineBearing, } from 'geolib'; -import cheapRuler from 'cheap-ruler'; +import { Line, LonLat } from '../utils/equipment-types'; import { ArrowDirection } from './layers/arrow-layer'; +import { MapEquipments } from './map-equipments'; -const substationPositionByIdIndexer = (map, substation) => { +const substationPositionByIdIndexer = ( + map: Map, + substation: SubstationPosition +) => { map.set(substation.id, substation.coordinate); return map; }; -const linePositionByIdIndexer = (map, line) => { +const linePositionByIdIndexer = ( + map: Map, + line: LinePosition +) => { map.set(line.id, line.coordinates); return map; }; +type Coordinate = { + lon: number; + lat: number; +}; + +type SubstationPosition = { + id: string; + coordinate: Coordinate; +}; + +type LinePosition = { + id: string; + coordinates: Coordinate[]; +}; + export class GeoData { - substationPositionsById = new Map(); + substationPositionsById = new Map(); - linePositionsById = new Map(); + linePositionsById = new Map(); - constructor(substationPositionsById, linePositionsById) { + constructor( + substationPositionsById: Map, + linePositionsById: Map + ) { this.substationPositionsById = substationPositionsById; this.linePositionsById = linePositionsById; } - setSubstationPositions(positions) { + setSubstationPositions(positions: SubstationPosition[]) { // index positions by substation id this.substationPositionsById = positions.reduce( substationPositionByIdIndexer, @@ -41,7 +67,10 @@ export class GeoData { ); } - updateSubstationPositions(substationIdsToUpdate, fetchedPositions) { + updateSubstationPositions( + substationIdsToUpdate: string[], + fetchedPositions: SubstationPosition[] + ) { fetchedPositions.forEach((pos) => this.substationPositionsById.set(pos.id, pos.coordinate) ); @@ -52,7 +81,7 @@ export class GeoData { .forEach((id) => this.substationPositionsById.delete(id)); } - getSubstationPosition(substationId) { + getSubstationPosition(substationId: string): LonLat { const position = this.substationPositionsById.get(substationId); if (!position) { console.warn(`Position not found for ${substationId}`); @@ -61,7 +90,7 @@ export class GeoData { return [position.lon, position.lat]; } - setLinePositions(positions) { + setLinePositions(positions: LinePosition[]) { // index positions by line id this.linePositionsById = positions.reduce( linePositionByIdIndexer, @@ -69,7 +98,10 @@ export class GeoData { ); } - updateLinePositions(lineIdsToUpdate, fetchedPositions) { + updateLinePositions( + lineIdsToUpdate: string[], + fetchedPositions: LinePosition[] + ) { fetchedPositions.forEach((pos) => { this.linePositionsById.set(pos.id, pos.coordinates); }); @@ -84,7 +116,11 @@ export class GeoData { /** * Get line positions always ordered from side 1 to side 2. */ - getLinePositions(network, line, detailed = true) { + getLinePositions( + network: MapEquipments, + line: Line, + detailed = true + ): LonLat[] { const voltageLevel1 = network.getVoltageLevel(line.voltageLevelId1); if (!voltageLevel1) { throw new Error( @@ -121,7 +157,7 @@ export class GeoData { const linePositions = this.linePositionsById.get(line.id); // Is there any position for this line ? if (linePositions) { - const positions = new Array(linePositions.length); + const positions = new Array(linePositions.length); for (const [index, position] of linePositions.entries()) { positions[index] = [position.lon, position.lat]; @@ -134,9 +170,9 @@ export class GeoData { return [substationPosition1, substationPosition2]; } - getLineDistances(positions) { + getLineDistances(positions: LonLat[]) { if (positions !== null && positions.length > 1) { - let cumulativeDistanceArray = [0]; + const cumulativeDistanceArray = [0]; let cumulativeDistance = 0; let segmentDistance; let ruler; @@ -156,13 +192,17 @@ export class GeoData { * along with the remaining distance to travel on this segment to be at the exact wanted distance * (implemented using a binary search) */ - findSegment(positions, cumulativeDistances, wantedDistance) { + findSegment( + positions: LonLat[], + cumulativeDistances: number[], + wantedDistance: number + ) { let lowerBound = 0; let upperBound = cumulativeDistances.length - 1; let middlePoint; while (lowerBound + 1 !== upperBound) { middlePoint = Math.floor((lowerBound + upperBound) / 2); - let middlePointDistance = cumulativeDistances[middlePoint]; + const middlePointDistance = cumulativeDistances[middlePoint]; if (middlePointDistance <= wantedDistance) { lowerBound = middlePoint; } else { @@ -171,21 +211,24 @@ export class GeoData { } return { idx: lowerBound, - segment: positions.slice(lowerBound, lowerBound + 2), + segment: positions.slice(lowerBound, lowerBound + 2) as [ + LonLat, + LonLat + ], remainingDistance: wantedDistance - cumulativeDistances[lowerBound], }; } labelDisplayPosition( - positions, - cumulativeDistances, - arrowPosition, - arrowDirection, - lineParallelIndex, - lineAngle, - proximityAngle, - distanceBetweenLines, - proximityFactor + positions: LonLat[], + cumulativeDistances: number[], + arrowPosition: number, + arrowDirection: ArrowDirection, + lineParallelIndex: number, + lineAngle: number, + proximityAngle: number, + distanceBetweenLines: number, + proximityFactor: number ) { if (arrowPosition > 1 || arrowPosition < 0) { throw new Error( @@ -199,7 +242,8 @@ export class GeoData { ) { return null; } - let lineDistance = cumulativeDistances[cumulativeDistances.length - 1]; + const lineDistance = + cumulativeDistances[cumulativeDistances.length - 1]; let wantedDistance = lineDistance * arrowPosition; if (cumulativeDistances.length === 2) { @@ -211,7 +255,7 @@ export class GeoData { 2 * distanceBetweenLines * arrowPosition * proximityFactor; } - let goodSegment = this.findSegment( + const goodSegment = this.findSegment( positions, cumulativeDistances, wantedDistance @@ -234,9 +278,9 @@ export class GeoData { default: throw new Error('impossible'); } - let remainingDistance = goodSegment.remainingDistance * multiplier; + const remainingDistance = goodSegment.remainingDistance * multiplier; - let angle = this.getMapAngle( + const angle = this.getMapAngle( goodSegment.segment[0], goodSegment.segment[1] ); @@ -292,8 +336,12 @@ export class GeoData { return position; } - getLabelOffset(angle, offsetDistance, arrowDirection) { - let radiantAngle = (-angle + 90) / (180 / Math.PI); + getLabelOffset( + angle: number, + offsetDistance: number, + arrowDirection: ArrowDirection + ): [number, number] { + const radiantAngle = (-angle + 90) / (180 / Math.PI); let direction = 0; switch (arrowDirection) { case ArrowDirection.FROM_SIDE_2_TO_SIDE_1: @@ -316,11 +364,11 @@ export class GeoData { } //returns the angle between point1 and point2 in degrees [0-360) - getMapAngle(point1, point2) { + getMapAngle(point1: LonLat, point2: LonLat) { // We don't have the exact same angle calculation as in the arrow shader, and this // seems to give more approaching results let angle = getRhumbLineBearing(point1, point2); - let angle2 = getGreatCircleBearing(point1, point2); + const angle2 = getGreatCircleBearing(point1, point2); const coeff = 0.1; angle = coeff * angle + (1 - coeff) * angle2; return angle; diff --git a/src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.js b/src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.ts similarity index 79% rename from src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.js rename to src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.ts index e97b7c0b..d646b48d 100644 --- a/src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.js +++ b/src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.ts @@ -6,18 +6,17 @@ */ const fs = `\ +#version 300 es #define SHADER_NAME arrow-layer-fragment-shader - precision highp float; - -varying vec4 vFillColor; -varying float shouldDiscard; - +in vec4 vFillColor; +in float shouldDiscard; +out vec4 fragmentColor; void main(void) { if (shouldDiscard > 0.0) { discard; } - gl_FragColor = vFillColor; + fragmentColor = vFillColor; } `; export default fs; diff --git a/src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.js b/src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.ts similarity index 75% rename from src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.js rename to src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.ts index 5f7984b4..b20c6188 100644 --- a/src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.js +++ b/src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.ts @@ -6,75 +6,63 @@ */ const vs = `\ +#version 300 es #define SHADER_NAME arrow-layer-vertex-shader precision highp float; -attribute vec3 positions; - -attribute float instanceSize; -attribute float instanceArrowDistance; -attribute vec4 instanceColor; -attribute float instanceSpeedFactor; -attribute float instanceLinePositionsTextureOffset; -attribute float instanceLineDistancesTextureOffset; -attribute float instanceLinePointCount; -attribute float instanceLineDistance; -attribute float instanceArrowDirection; -attribute float instanceLineParallelIndex; -attribute vec3 instanceLineAngles; -attribute vec2 instanceProximityFactors; +in vec3 positions; +in float instanceSize; +in vec4 instanceColor; +in float instanceSpeedFactor; +in float instanceArrowDistance; +in float instanceArrowDirection; +in float instanceLineDistance; +in int instanceLinePositionsTextureOffset; +in int instanceLineDistancesTextureOffset; +in int instanceLinePointCount; +in float instanceLineParallelIndex; +in vec3 instanceLineAngles; +in vec2 instanceProximityFactors; +in float instanceDistanceBetweenLines; uniform float sizeMinPixels; uniform float sizeMaxPixels; uniform float timestamp; uniform sampler2D linePositionsTexture; uniform sampler2D lineDistancesTexture; -uniform ivec2 linePositionsTextureSize; -uniform ivec2 lineDistancesTextureSize; -uniform float webgl2; -uniform float distanceBetweenLines; uniform float maxParallelOffset; uniform float minParallelOffset; uniform float opacity; +uniform ivec2 linePositionsTextureSize; +uniform ivec2 lineDistancesTextureSize; -varying vec4 vFillColor; -varying float shouldDiscard; - -vec4 texelFetch(sampler2D sampler, ivec2 index, ivec2 size) { - float x = (2.0 * float(index.x) + 1.0) / (2.0 * float(size.x)); - float y = (2.0 * float(index.y) + 1.0) / (2.0 * float(size.y)); - return texture2D(sampler, vec2(x, y)); -} +out vec4 vFillColor; +out float shouldDiscard; /** * Calculate 2 dimensions texture index from flat index. */ ivec2 calculateTextureIndex(int flatIndex, ivec2 textureSize) { - int x = flatIndex - flatIndex / textureSize.x * textureSize.x; - int y = flatIndex / textureSize.y; - return ivec2(x, y); + return ivec2(flatIndex % textureSize.x, flatIndex / textureSize.x); } /** * Fetch WGS84 position from texture for a given point of the line. */ vec3 fetchLinePosition(int point) { - int flatIndex = int(instanceLinePositionsTextureOffset) + point; + int flatIndex = instanceLinePositionsTextureOffset + point; ivec2 textureIndex = calculateTextureIndex(flatIndex, linePositionsTextureSize); - vec4 color = texelFetch(linePositionsTexture, textureIndex, linePositionsTextureSize); - float x = color.r; - float y = webgl2 > 0.5 ? color.g : color.a; - return vec3(x, y, 0); + return vec3(texelFetch(linePositionsTexture, textureIndex, 0).xy, 0); } /** * Fetch distance (in meters from the start of the line) from texture for a point of the line. */ float fetchLineDistance(int point) { - int flatIndex = int(instanceLineDistancesTextureOffset) + point; + int flatIndex = instanceLineDistancesTextureOffset + point; ivec2 textureIndex = calculateTextureIndex(flatIndex, lineDistancesTextureSize); - return texelFetch(lineDistancesTexture, textureIndex, lineDistancesTextureSize).r; + return texelFetch(lineDistancesTexture, textureIndex, 0).x; } /** @@ -94,28 +82,22 @@ float fetchLineDistance(int point) { */ int findFirstLinePointAfterDistance(float distance) { int firstPoint = 0; - int lastPoint = int(instanceLinePointCount) - 1; + int lastPoint = instanceLinePointCount - 1; - // variable length loops are not supported in WebGL v1, it needs to be a constant and cannot be like in WebGL v2 an - // attribute, so we suppose here that we won't have more that 2^log2MaxPointCount points per line... - // - // WARNING!!!! - // also, we need to avoid break/return in the for loop even if search complete because with a WebGL1 browser - // it is not possible to call texture2D inside a non deterministic piece of code - // https://shadertoyunofficial.wordpress.com/2017/11/19/avoiding-compiler-crash-or-endless-compilation - const int log2MaxPointCount = 15; - for (int i = 0; i < log2MaxPointCount; i++) { - if (firstPoint + 1 != lastPoint) { - int middlePoint = (firstPoint + lastPoint) / 2; - float middlePointDistance = fetchLineDistance(middlePoint); - if (middlePointDistance <= distance) { - firstPoint = middlePoint; - } else { - lastPoint = middlePoint; - } - } - } - return lastPoint; + // variable length loops are not supported in GLSL, instanceLinePointCount is an upper bound that + // will never be reached as binary search complexity is in O(log(instanceLinePointCount)) + for (int i = 0; i < instanceLinePointCount; i++) { + if (firstPoint + 1 == lastPoint) { + return lastPoint; + } + int middlePoint = (firstPoint + lastPoint) / 2; + float middlePointDistance = fetchLineDistance(middlePoint); + if (middlePointDistance <= distance) { + firstPoint = middlePoint; + } else { + lastPoint = middlePoint; + } + } } mat3 calculateRotation(vec3 commonPosition1, vec3 commonPosition2) { @@ -190,7 +172,7 @@ void main(void) { // are not correctly positioned on the lines, they are slightly off. // This hack does not seem necessary for parallel-path or fork-line layers. vec3 arrowPositionWorldSpace = mix(linePosition1, linePosition2, interpolationValue); - float offsetCommonSpace = clamp(project_size_all_zoom_levels(distanceBetweenLines, arrowPositionWorldSpace.y), project_pixel_size(minParallelOffset), project_pixel_size(maxParallelOffset)); + float offsetCommonSpace = clamp(project_size_all_zoom_levels(instanceDistanceBetweenLines, arrowPositionWorldSpace.y), project_pixel_size(minParallelOffset), project_pixel_size(maxParallelOffset)); // calculate translation for the parallels lines, use the angle calculated from origin/destination // to maintain the same translation between segments diff --git a/src/components/network-map-viewer/network/layers/arrow-layer.js b/src/components/network-map-viewer/network/layers/arrow-layer.ts similarity index 65% rename from src/components/network-map-viewer/network/layers/arrow-layer.js rename to src/components/network-map-viewer/network/layers/arrow-layer.ts index 5d8b9e42..083b8b19 100644 --- a/src/components/network-map-viewer/network/layers/arrow-layer.js +++ b/src/components/network-map-viewer/network/layers/arrow-layer.ts @@ -4,31 +4,91 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { Layer, project32, picking } from '@deck.gl/core'; +import { + Accessor, + DefaultProps, + Layer, + picking, + project32, +} from '@deck.gl/core'; import { GL } from '@luma.gl/constants'; -import { Model, Geometry } from '@luma.gl/engine'; - -import vs from './arrow-layer-vertex.glsl'; +import type { Texture } from '@luma.gl/core'; +import { DeprecatedWebGLTextureProps } from '@luma.gl/core/src/adapter/resources/texture'; +import { Geometry, Model } from '@luma.gl/engine'; + +import { + Device, + RenderPass, + TextureFormat, + TextureProps, + UniformValue, +} from '@luma.gl/core'; +import { + Color, + LayerContext, + LayerProps, + Position, + UpdateParameters, +} from 'deck.gl'; +import { Line } from '../../utils/equipment-types'; import fs from './arrow-layer-fragment.glsl'; +import vs from './arrow-layer-vertex.glsl'; -const DEFAULT_COLOR = [0, 0, 0, 255]; +const DEFAULT_COLOR = [0, 0, 0, 255] satisfies Color; // this value has to be consistent with the one in vertex shader const MAX_LINE_POINT_COUNT = 2 ** 15; -export const ArrowDirection = { - NONE: 'none', - FROM_SIDE_1_TO_SIDE_2: 'fromSide1ToSide2', - FROM_SIDE_2_TO_SIDE_1: 'fromSide2ToSide1', +export enum ArrowDirection { + NONE = 'none', + FROM_SIDE_1_TO_SIDE_2 = 'fromSide1ToSide2', + FROM_SIDE_2_TO_SIDE_1 = 'fromSide2ToSide1', +} + +export type Arrow = { + line: Line; + distance: number; }; -const defaultProps = { +export type LayerDataSource = DataType[]; +// | LayerData +// | string +// | AsyncIterable +// | Promise> +// | null; + +type _ArrowLayerProps = { + data: Arrow[]; + sizeMinPixels?: number; + sizeMaxPixels?: number; + getDistance: Accessor; + getLine: (arrow: Arrow) => Line; + getLinePositions: (line: Line) => Position[]; + getSize?: Accessor; + getColor?: Accessor; + getSpeedFactor?: Accessor; + getDirection?: Accessor; + animated?: boolean; + getLineParallelIndex?: Accessor; + getLineAngles?: Accessor; + getDistanceBetweenLines?: Accessor; + maxParallelOffset?: number; + minParallelOffset?: number; + opacity?: number; +} & LayerProps; + +type ArrowLayerProps = _ArrowLayerProps & LayerProps; + +const defaultProps: DefaultProps = { sizeMinPixels: { type: 'number', min: 0, value: 0 }, // min size in pixels sizeMaxPixels: { type: 'number', min: 0, value: Number.MAX_SAFE_INTEGER }, // max size in pixels - getDistance: { type: 'accessor', value: (arrow) => arrow.distance }, - getLine: { type: 'accessor', value: (arrow) => arrow.line }, - getLinePositions: { type: 'accessor', value: (line) => line.positions }, + // getDistance: { type: 'accessor', value: (arrow: Arrow) => arrow.distance }, + getLine: { type: 'function', value: (arrow: Arrow) => arrow.line }, + // getLinePositions: { + // type: 'function', + // value: (line: Line) => line.positions, + // }, getSize: { type: 'accessor', value: 1 }, getColor: { type: 'accessor', value: DEFAULT_COLOR }, getSpeedFactor: { type: 'accessor', value: 1.0 }, @@ -36,12 +96,33 @@ const defaultProps = { animated: { type: 'boolean', value: true }, getLineParallelIndex: { type: 'accessor', value: 0 }, getLineAngles: { type: 'accessor', value: [0, 0, 0] }, - distanceBetweenLines: { type: 'number', value: 1000 }, maxParallelOffset: { type: 'number', value: 100 }, minParallelOffset: { type: 'number', value: 3 }, opacity: { type: 'number', value: 1.0 }, + getDistanceBetweenLines: { type: 'accessor', value: 1000 }, +}; +type LineAttributes = { + distance: number; + positionsTextureOffset: number; + distancesTextureOffset: number; + pointCount: number; }; +// const isAccessorFunction = ( +// accessor: Accessor +// ): accessor is AccessorFunction => typeof accessor === 'function'; + +// const getValue = ( +// accessor: Accessor, +// object: In, +// objectInfo: AccessorContext +// ) => { +// if (isAccessorFunction(accessor)) { +// return accessor(object, objectInfo); +// } +// return accessor; +// }; + /** * A layer that draws arrows over the lines between voltage levels. The arrows are drawn on a direct line * or with a parallel offset. The initial point is also shifted to coincide with the fork line ends. @@ -52,12 +133,24 @@ const defaultProps = { * maxParallelOffset: max pixel distance * minParallelOffset: min pixel distance */ -export class ArrowLayer extends Layer { +export class ArrowLayer extends Layer> { + static layerName = 'ArrowLayer'; + static defaultProps = defaultProps; + + declare state: { + linePositionsTexture: Texture; + lineDistancesTexture: Texture; + lineAttributes: Map; + model?: Model; + timestamp: number; + stop: boolean; + maxTextureSize: number; + }; getShaders() { return super.getShaders({ vs, fs, modules: [project32, picking] }); } - getArrowLineAttributes(arrow) { + getArrowLineAttributes(arrow: Arrow): LineAttributes { const line = this.props.getLine(arrow); if (!line) { throw new Error('Invalid line'); @@ -69,21 +162,25 @@ export class ArrowLayer extends Layer { return attributes; } - initializeState(context) { - const { device } = context; + initializeState() { + const { device } = this.context; if (!device.features.has('texture-blend-float-webgl')) { throw new Error('Arrow layer not supported on this browser'); } - const maxTextureSize = device.getParametersWebGL(GL.MAX_TEXTURE_SIZE); + const maxTextureSize = device.getParametersWebGL( + GL.MAX_TEXTURE_SIZE + ) as number; + this.state = { maxTextureSize, - }; + } as this['state']; - this.getAttributeManager().addInstanced({ + this.getAttributeManager()?.addInstanced({ instanceSize: { size: 1, + type: 'float32', transition: true, accessor: 'getSize', defaultValue: 1, @@ -91,13 +188,13 @@ export class ArrowLayer extends Layer { instanceColor: { size: this.props.colorFormat.length, transition: true, - normalized: true, - type: GL.UNSIGNED_BYTE, + type: 'unorm8', // normalized: true, accessor: 'getColor', defaultValue: [0, 0, 0, 255], }, instanceSpeedFactor: { size: 1, + type: 'float32', transition: true, accessor: 'getSpeedFactor', defaultValue: 1.0, @@ -111,6 +208,7 @@ export class ArrowLayer extends Layer { }, instanceArrowDirection: { size: 1, + type: 'float32', transition: true, accessor: 'getDirection', transform: (direction) => { @@ -130,83 +228,95 @@ export class ArrowLayer extends Layer { instanceLineDistance: { size: 1, transition: true, - type: GL.FLOAT, - accessor: (arrow) => + type: 'float32', + accessor: (arrow: Arrow) => this.getArrowLineAttributes(arrow).distance, }, instanceLinePositionsTextureOffset: { size: 1, transition: true, - type: GL.FLOAT, - accessor: (arrow) => + type: 'sint32', + accessor: (arrow: Arrow) => this.getArrowLineAttributes(arrow).positionsTextureOffset, }, instanceLineDistancesTextureOffset: { size: 1, transition: true, - type: GL.FLOAT, - accessor: (arrow) => + type: 'sint32', + accessor: (arrow: Arrow) => this.getArrowLineAttributes(arrow).distancesTextureOffset, }, instanceLinePointCount: { size: 1, transition: true, - type: GL.FLOAT, - accessor: (arrow) => + type: 'sint32', + accessor: (arrow: Arrow) => this.getArrowLineAttributes(arrow).pointCount, }, instanceLineParallelIndex: { size: 1, accessor: 'getLineParallelIndex', - type: GL.FLOAT, + type: 'float32', }, instanceLineAngles: { size: 3, accessor: 'getLineAngles', - type: GL.FLOAT, + type: 'float32', }, instanceProximityFactors: { size: 2, - accessor: 'getProximityFactors', - type: GL.FLOAT, + accessor: 'getProximityFactors', //TODO where is it ??? + type: 'float32', + }, + instanceDistanceBetweenLines: { + size: 1, + transition: true, + accessor: 'getDistanceBetweenLines', + type: 'float32', + defaultValue: 1000, }, }); } - finalizeState(context) { + finalizeState(context: LayerContext) { super.finalizeState(context); // we do not use setState to avoid a redraw, it is just used to stop the animation this.state.stop = true; } - createTexture2D(device, data, elementSize, format, dataFormat) { + createTexture2D( + device: Device, + data: Array, + elementSize: number, + format: TextureFormat + ) { const start = performance.now(); - // we calculate the smallest square texture that is a power of 2 but less or equals to MAX_TEXTURE_SIZE + const { maxTextureSize } = this.state; + // we calculate the smallest texture width less or equals to MAX_TEXTURE_SIZE // (which is an property of the graphic card) const elementCount = data.length / elementSize; - const n = Math.ceil(Math.log2(elementCount) / 2); - const textureSize = 2 ** n; - const { maxTextureSize } = this.state; - if (textureSize > maxTextureSize) { + const width = Math.min(maxTextureSize, elementCount); + const height = Math.ceil(elementCount / width); + if (height > maxTextureSize) { throw new Error( - `Texture size (${textureSize}) cannot be greater than ${maxTextureSize}` + `Texture size ${width}*${height} cannot be greater than ${maxTextureSize}` ); } // data length needs to be width * height (otherwise we get an error), so we pad the data array with zero until // reaching the correct size. - if (data.length < textureSize * textureSize * elementSize) { + const newLength = width * height * elementSize; + if (data.length < newLength) { const oldLength = data.length; - data.length = textureSize * textureSize * elementSize; - data.fill(0, oldLength, textureSize * textureSize * elementSize); + data.length = newLength; + data.fill(0, oldLength, newLength); } const texture2d = device.createTexture({ - width: textureSize, - height: textureSize, - format: format, - dataFormat: dataFormat, + width, + height, + format, type: GL.FLOAT, data: new Float32Array(data), parameters: { @@ -216,11 +326,11 @@ export class ArrowLayer extends Layer { [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE, }, mipmaps: false, - }); + } satisfies TextureProps | DeprecatedWebGLTextureProps as TextureProps); const stop = performance.now(); console.info( - `Texture of ${elementCount} elements (${textureSize} * ${textureSize}) created in ${ + `Texture of ${newLength} elements (${width} * ${height}) created in ${ stop - start } ms` ); @@ -228,11 +338,11 @@ export class ArrowLayer extends Layer { return texture2d; } - createTexturesStructure(props) { + createTexturesStructure(props: this['props']) { const start = performance.now(); - const linePositionsTextureData = []; - const lineDistancesTextureData = []; + const linePositionsTextureData: number[] = []; + const lineDistancesTextureData: number[] = []; const lineAttributes = new Map(); let lineDistance = 0; @@ -251,7 +361,7 @@ export class ArrowLayer extends Layer { const lineDistancesTextureOffset = lineDistancesTextureData.length; let linePointCount = 0; if (positions.length > 0) { - positions.forEach((position) => { + positions.forEach((position: Position) => { // fill line positions texture linePositionsTextureData.push(position[0]); linePositionsTextureData.push(position[1]); @@ -287,7 +397,7 @@ export class ArrowLayer extends Layer { }; } - updateGeometry({ props, changeFlags }) { + updateGeometry({ props, changeFlags }: UpdateParameters) { const geometryChanged = changeFlags.dataChanged || (changeFlags.updateTriggersChanged && @@ -307,15 +417,13 @@ export class ArrowLayer extends Layer { device, linePositionsTextureData, 2, - this.state.webgl2 ? GL.RG32F : GL.LUMINANCE_ALPHA, - this.state.webgl2 ? GL.RG : GL.LUMINANCE_ALPHA + 'rg32float' //GL.RG32F, ); const lineDistancesTexture = this.createTexture2D( device, lineDistancesTextureData, 1, - this.state.webgl2 ? GL.R32F : GL.LUMINANCE, - this.state.webgl2 ? GL.RED : GL.LUMINANCE + 'r32float' //GL.R32F, ); this.setState({ @@ -325,29 +433,29 @@ export class ArrowLayer extends Layer { }); if (!changeFlags.dataChanged) { - this.getAttributeManager().invalidateAll(); + this.getAttributeManager()?.invalidateAll(); } } } - updateModel({ changeFlags }) { + updateModel({ changeFlags }: UpdateParameters) { if (changeFlags.somethingChanged) { const { device } = this.context; const { model } = this.state; if (model) { - model.delete(); + model.destroy(); } this.setState({ model: this._getModel(device), }); - this.getAttributeManager().invalidateAll(); + this.getAttributeManager()?.invalidateAll(); } } - updateState(updateParams) { + updateState(updateParams: UpdateParameters) { super.updateState(updateParams); this.updateGeometry(updateParams); @@ -366,7 +474,7 @@ export class ArrowLayer extends Layer { } } - animate(timestamp) { + animate(timestamp: number) { if (this.state.stop) { return; } @@ -380,41 +488,49 @@ export class ArrowLayer extends Layer { window.requestAnimationFrame((timestamp) => this.animate(timestamp)); } - draw({ uniforms }) { - const { sizeMinPixels, sizeMaxPixels } = this.props; + draw({ + uniforms, + renderPass, + }: { + uniforms: Record; + renderPass: RenderPass; + }) { + const { sizeMinPixels, sizeMaxPixels, opacity } = this.props; const { model, linePositionsTexture, lineDistancesTexture, timestamp, - webgl2, + // maxTextureSize, } = this.state; + model!.setBindings({ + linePositionsTexture, + lineDistancesTexture, + }); - model.setUniforms({ + model!.setUniforms({ ...uniforms, sizeMinPixels, sizeMaxPixels, - linePositionsTexture, - lineDistancesTexture, + // maxTextureSize, linePositionsTextureSize: [ linePositionsTexture.width, linePositionsTexture.height, ], + opacity, lineDistancesTextureSize: [ lineDistancesTexture.width, lineDistancesTexture.height, ], timestamp, - webgl2, - distanceBetweenLines: this.props.getDistanceBetweenLines, maxParallelOffset: this.props.maxParallelOffset, minParallelOffset: this.props.minParallelOffset, }); - model.draw(); + model!.draw(renderPass); } - _getModel(device) { + _getModel(device: Device) { const positions = [ -1, -1, 0, 0, 1, 0, 0, -0.6, 0, 1, -1, 0, 0, 1, 0, 0, -0.6, 0, ]; @@ -423,6 +539,7 @@ export class ArrowLayer extends Layer { device, Object.assign(this.getShaders(), { id: this.props.id, + bufferLayout: this.getAttributeManager()!.getBufferLayouts(), geometry: new Geometry({ topology: 'triangle-list', vertexCount: 6, @@ -438,6 +555,3 @@ export class ArrowLayer extends Layer { ); } } - -ArrowLayer.layerName = 'ArrowLayer'; -ArrowLayer.defaultProps = defaultProps; diff --git a/src/components/network-map-viewer/network/layers/fork-line-layer.js b/src/components/network-map-viewer/network/layers/fork-line-layer.ts similarity index 73% rename from src/components/network-map-viewer/network/layers/fork-line-layer.js rename to src/components/network-map-viewer/network/layers/fork-line-layer.ts index 2945c312..309ed5a5 100644 --- a/src/components/network-map-viewer/network/layers/fork-line-layer.js +++ b/src/components/network-map-viewer/network/layers/fork-line-layer.ts @@ -5,9 +5,30 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { LineLayer } from 'deck.gl'; +import { DefaultProps } from '@deck.gl/core'; +import { Accessor, LineLayer, LineLayerProps } from 'deck.gl'; -const defaultProps = { +export type ForkLineLayerProps = _ForkLineLayerProps & + LineLayerProps; + +type _ForkLineLayerProps = { + getLineParallelIndex: Accessor; + getLineAngle: Accessor; + distanceBetweenLines: Accessor; + maxParallelOffset: Accessor; + minParallelOffset: Accessor; + substationRadius: Accessor; + substationMaxPixel: Accessor; + minSubstationRadiusPixel: Accessor; + getDistanceBetweenLines: Accessor; + getMaxParallelOffset: Accessor; + getMinParallelOffset: Accessor; + getSubstationRadius: Accessor; + getSubstationMaxPixel: Accessor; + getMinSubstationRadiusPixel: Accessor; +}; + +const defaultProps: DefaultProps = { getLineParallelIndex: { type: 'accessor', value: 0 }, getLineAngle: { type: 'accessor', value: 0 }, distanceBetweenLines: { type: 'number', value: 1000 }, @@ -31,15 +52,23 @@ const defaultProps = { * substationMaxPixel: max pixel for a voltage level in substation * minSubstationRadiusPixel : min pixel for a substation */ -export default class ForkLineLayer extends LineLayer { +export default class ForkLineLayer extends LineLayer< + DataT, + Required<_ForkLineLayerProps> +> { + static layerName = 'ForkLineLayer'; + static defaultProps = defaultProps; + + // declare state: LineLayer['state']; + getShaders() { const shaders = super.getShaders(); shaders.inject = { 'vs:#decl': ` -attribute float instanceLineParallelIndex; -attribute float instanceLineAngle; -attribute float instanceOffsetStart; -attribute float instanceProximityFactor; +in float instanceLineParallelIndex; +in float instanceLineAngle; +in float instanceOffsetStart; +in float instanceProximityFactor; uniform float distanceBetweenLines; uniform float maxParallelOffset; uniform float minParallelOffset; @@ -73,8 +102,7 @@ uniform float minSubstationRadiusPixel; initializeState() { super.initializeState(); - const attributeManager = this.getAttributeManager(); - attributeManager.addInstanced({ + this.getAttributeManager()?.addInstanced({ instanceLineParallelIndex: { size: 1, type: 'float32', @@ -98,7 +126,13 @@ uniform float minSubstationRadiusPixel; }); } - draw({ uniforms }) { + draw({ + uniforms, + }: // renderPass, + { + uniforms: Record; + // renderPass: RenderPass; + }) { super.draw({ uniforms: { ...uniforms, @@ -113,6 +147,3 @@ uniform float minSubstationRadiusPixel; }); } } - -ForkLineLayer.layerName = 'ForkLineLayer'; -ForkLineLayer.defaultProps = defaultProps; diff --git a/src/components/network-map-viewer/network/layers/parallel-path-layer.js b/src/components/network-map-viewer/network/layers/parallel-path-layer.ts similarity index 84% rename from src/components/network-map-viewer/network/layers/parallel-path-layer.js rename to src/components/network-map-viewer/network/layers/parallel-path-layer.ts index 7d9d9480..b0ce2d9b 100644 --- a/src/components/network-map-viewer/network/layers/parallel-path-layer.js +++ b/src/components/network-map-viewer/network/layers/parallel-path-layer.ts @@ -4,9 +4,22 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { PathLayer } from 'deck.gl'; +import { DefaultProps } from '@deck.gl/core'; +import { RenderPass, UniformValue } from '@luma.gl/core'; +import { Accessor, PathLayer, PathLayerProps } from 'deck.gl'; -const defaultProps = { +type _ParallelPathLayerProps = { + getLineParallelIndex?: Accessor; + getLineAngle?: Accessor; + distanceBetweenLines?: number; + maxParallelOffset?: number; + minParallelOffset?: number; +}; + +export type ParallelPathLayerProps = + _ParallelPathLayerProps & PathLayerProps; + +const defaultProps: DefaultProps = { getLineParallelIndex: { type: 'accessor', value: 0 }, getLineAngle: { type: 'accessor', value: 0 }, distanceBetweenLines: { type: 'number', value: 1000 }, @@ -26,7 +39,13 @@ const defaultProps = { * maxParallelOffset: max pixel distance * minParallelOffset: min pixel distance */ -export default class ParallelPathLayer extends PathLayer { +export default class ParallelPathLayer extends PathLayer< + DataT, + Required<_ParallelPathLayerProps> +> { + static layerName = 'ParallelPathLayer'; + static defaultProps = defaultProps; + getShaders() { const shaders = super.getShaders(); shaders.inject = Object.assign({}, shaders.inject, { @@ -55,7 +74,7 @@ export default class ParallelPathLayer extends PathLayer { // also has the downside that you can't update one attribute and reconstruct // only its buffer, so it hurts performance a bit in this case. // But this is a rare case for us (changing parameters) so it doesn't matter much. -attribute vec4 instanceExtraAttributes; +in vec4 instanceExtraAttributes; uniform float distanceBetweenLines; uniform float maxParallelOffset; uniform float minParallelOffset; @@ -103,8 +122,7 @@ gl_Position += project_common_position_to_clipspace(trans) - project_uCenter; initializeState() { super.initializeState(); - const attributeManager = this.getAttributeManager(); - attributeManager.addInstanced({ + this.getAttributeManager()?.addInstanced({ // too much instances variables need to compact some... instanceExtraAttributes: { size: 4, @@ -114,7 +132,12 @@ gl_Position += project_common_position_to_clipspace(trans) - project_uCenter; }); } - draw({ uniforms }) { + draw({ + uniforms, + }: { + uniforms: Record; + renderPass: RenderPass; + }) { super.draw({ uniforms: { ...uniforms, @@ -125,6 +148,3 @@ gl_Position += project_common_position_to_clipspace(trans) - project_uCenter; }); } } - -ParallelPathLayer.layerName = 'ParallelPathLayer'; -ParallelPathLayer.defaultProps = defaultProps; diff --git a/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.js b/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.ts similarity index 61% rename from src/components/network-map-viewer/network/layers/scatterplot-layer-ext.js rename to src/components/network-map-viewer/network/layers/scatterplot-layer-ext.ts index d68c5aa0..83c38fa5 100644 --- a/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.js +++ b/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.ts @@ -4,16 +4,28 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { ScatterplotLayer } from 'deck.gl'; +import { DefaultProps } from '@deck.gl/core'; +import { Accessor, ScatterplotLayer, ScatterplotLayerProps } from 'deck.gl'; -const defaultProps = { +type _ScatterplotLayerExtProps = { + getRadiusMaxPixels: Accessor; +}; +export type ScatterplotLayerExtProps = + _ScatterplotLayerExtProps & ScatterplotLayerProps; + +const defaultProps: DefaultProps = { getRadiusMaxPixels: { type: 'accessor', value: 1 }, }; /** * An extended scatter plot layer that allows a radius max pixels to be different for each object. */ -export default class ScatterplotLayerExt extends ScatterplotLayer { +export default class ScatterplotLayerExt< + DataT = unknown +> extends ScatterplotLayer>> { + static layerName = 'ScatterplotLayerExt'; + static defaultProps = defaultProps; + getShaders() { const shaders = super.getShaders(); return Object.assign({}, shaders, { @@ -23,7 +35,7 @@ export default class ScatterplotLayerExt extends ScatterplotLayer { ), // hack to replace the uniform variable to corresponding attribute inject: { 'vs:#decl': `\ -attribute float instanceRadiusMaxPixels; +in float instanceRadiusMaxPixels; `, }, }); @@ -32,8 +44,7 @@ attribute float instanceRadiusMaxPixels; initializeState() { super.initializeState(); - const attributeManager = this.getAttributeManager(); - attributeManager.addInstanced({ + this.getAttributeManager()?.addInstanced({ instanceRadiusMaxPixels: { size: 1, transition: true, @@ -44,6 +55,3 @@ attribute float instanceRadiusMaxPixels; }); } } - -ScatterplotLayerExt.layerName = 'ScatterplotLayerExt'; -ScatterplotLayerExt.defaultProps = defaultProps; diff --git a/src/components/network-map-viewer/network/line-layer.js b/src/components/network-map-viewer/network/line-layer.ts similarity index 73% rename from src/components/network-map-viewer/network/line-layer.js rename to src/components/network-map-viewer/network/line-layer.ts index 0a98e7af..c5ef6378 100644 --- a/src/components/network-map-viewer/network/line-layer.js +++ b/src/components/network-map-viewer/network/line-layer.ts @@ -5,20 +5,33 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CompositeLayer, TextLayer, IconLayer } from 'deck.gl'; -import PadlockIcon from '../images/lock_black_24dp.svg'; -import BoltIcon from '../images/bolt_black_24dp.svg'; import { PathStyleExtension } from '@deck.gl/extensions'; -import { ArrowLayer, ArrowDirection } from './layers/arrow-layer'; -import ParallelPathLayer from './layers/parallel-path-layer'; -import ForkLineLayer from './layers/fork-line-layer'; +import { + Color, + CompositeLayer, + CompositeLayerProps, + IconLayer, + Layer, + LayerContext, + Position, + TextLayer, + UpdateParameters, +} from 'deck.gl'; import { getDistance } from 'geolib'; +import { INVALID_FLOW_OPACITY } from '../../../utils/colors'; +import BoltIcon from '../images/bolt_black_24dp.svg'; +import PadlockIcon from '../images/lock_black_24dp.svg'; +import { Line, LonLat } from '../utils/equipment-types'; import { SUBSTATION_RADIUS, SUBSTATION_RADIUS_MAX_PIXEL, SUBSTATION_RADIUS_MIN_PIXEL, } from './constants'; -import { INVALID_FLOW_OPACITY } from '../../../utils/colors'; +import { GeoData } from './geo-data'; +import { Arrow, ArrowDirection, ArrowLayer } from './layers/arrow-layer'; +import ForkLineLayer from './layers/fork-line-layer'; +import ParallelPathLayer from './layers/parallel-path-layer'; +import { MapEquipments } from './map-equipments'; const DISTANCE_BETWEEN_ARROWS = 10000.0; //Constants for Feeders mode @@ -39,13 +52,13 @@ export const LineFlowColorMode = { const noDashArray = [0, 0]; const dashArray = [15, 10]; -function doDash(lineConnection) { +function doDash(lineConnection: LineConnection) { return ( !lineConnection.terminal1Connected || !lineConnection.terminal2Connected ); } -function getArrowDirection(p) { +function getArrowDirection(p: number) { if (p < 0) { return ArrowDirection.FROM_SIDE_2_TO_SIDE_1; } else if (p > 0) { @@ -55,22 +68,22 @@ function getArrowDirection(p) { } } -export const LineLoadingZone = { - UNKNOWN: 0, - SAFE: 1, - WARNING: 2, - OVERLOAD: 3, -}; +export enum LineLoadingZone { + UNKNOWN = 0, + SAFE = 1, + WARNING = 2, + OVERLOAD = 3, +} export function getLineLoadingZoneOfSide( - limit, - intensity, - lineFlowAlertThreshold + limit: number | undefined, + intensity: number | undefined, + lineFlowAlertThreshold: number ) { if (limit === undefined || intensity === undefined || intensity === 0) { return LineLoadingZone.UNKNOWN; } else { - let threshold = (lineFlowAlertThreshold * limit) / 100; + const threshold = (lineFlowAlertThreshold * limit) / 100; if (intensity > 0 && intensity < threshold) { return LineLoadingZone.SAFE; } else if (intensity >= threshold && intensity < limit) { @@ -81,7 +94,7 @@ export function getLineLoadingZoneOfSide( } } -export function getLineLoadingZone(line, lineFlowAlertThreshold) { +export function getLineLoadingZone(line: Line, lineFlowAlertThreshold: number) { const zone1 = getLineLoadingZoneOfSide( line.currentLimits1?.permanentLimit, line.i1, @@ -95,7 +108,7 @@ export function getLineLoadingZone(line, lineFlowAlertThreshold) { return Math.max(zone1, zone2); } -function getLineLoadingZoneColor(zone) { +function getLineLoadingZoneColor(zone: LineLoadingZone): Color { if (zone === LineLoadingZone.UNKNOWN) { return [128, 128, 128]; // grey } else if (zone === LineLoadingZone.SAFE) { @@ -109,11 +122,17 @@ function getLineLoadingZoneColor(zone) { } } -function getLineColor(line, nominalVoltageColor, props, lineConnection) { +function getLineColor( + line: Line, + nominalVoltageColor: Color, + props: LineLayer['props'], + lineConnection: LineConnection +) { if (props.lineFlowColorMode === LineFlowColorMode.NOMINAL_VOLTAGE) { if ( - !lineConnection.terminal1Connected && - !lineConnection.terminal2Connected + !lineConnection || + (!lineConnection.terminal1Connected && + !lineConnection.terminal2Connected) ) { return props.disconnectedLineColor; } else { @@ -127,7 +146,7 @@ function getLineColor(line, nominalVoltageColor, props, lineConnection) { } } -function getLineIcon(lineStatus) { +function getLineIcon(lineStatus: LineStatus) { return { url: lineStatus === 'PLANNED_OUTAGE' @@ -149,7 +168,10 @@ export const ArrowSpeed = { CRAZY: 4, }; -function getArrowSpeedOfSide(limit, intensity) { +function getArrowSpeedOfSide( + limit: number | undefined, + intensity: number | undefined +) { if (limit === undefined || intensity === undefined || intensity === 0) { return ArrowSpeed.STOPPED; } else { @@ -166,7 +188,7 @@ function getArrowSpeedOfSide(limit, intensity) { } } -function getArrowSpeed(line) { +function getArrowSpeed(line: Line) { const speed1 = getArrowSpeedOfSide( line.currentLimits1?.permanentLimit, line.i1 @@ -178,7 +200,7 @@ function getArrowSpeed(line) { return Math.max(speed1, speed2); } -function getArrowSpeedFactor(speed) { +function getArrowSpeedFactor(speed: number) { switch (speed) { case ArrowSpeed.STOPPED: return 0; @@ -195,9 +217,124 @@ function getArrowSpeedFactor(speed) { } } -export class LineLayer extends CompositeLayer { - initializeState() { - super.initializeState(); +type LineConnection = { + terminal1Connected: boolean; + terminal2Connected: boolean; +}; + +export enum LineStatus { + PLANNED_OUTAGE = 'PLANNED_OUTAGE', + FORCED_OUTAGE = 'FORCED_OUTAGE', + IN_OPERATION = 'IN_OPERATION', +} + +type LinesStatus = { + operatingStatus: LineStatus; +}; + +type CompositeDataLine = { + nominalV: number; + lines: Line[]; + arrows: Arrow[]; + positions: LonLat[]; + cumulativeDistances: number[]; +}; + +type ActivePower = { + p: number | undefined; + printPosition: Position; + offset: [number, number]; + line: Line; +}; + +type OperatingStatus = { + status: LineStatus; + printPosition: Position; + offset: [number, number]; +}; + +export type CompositeData = { + nominalV: number; + mapOriginDestination?: Map>; + lines: Line[]; + lineMap?: Map; + activePower: ActivePower[]; + operatingStatus: OperatingStatus[]; + arrows: Arrow[]; +}; + +type MinProximityFactor = { + lines: Line[]; + start: number; + end: number; +}; + +type _LineLayerProps = { + data: Line[]; + network: MapEquipments; + geoData: GeoData; + getNominalVoltageColor: (voltage: number) => Color; + disconnectedLineColor: Color; + filteredNominalVoltages: number[] | null; + lineFlowMode: string; + lineFlowColorMode: string; + lineFlowAlertThreshold: number; + showLineFlow: boolean; + lineFullPath: boolean; + lineParallelPath: boolean; + labelSize: number; + iconSize: number; + distanceBetweenLines: number; + maxParallelOffset: number; + minParallelOffset: number; + substationRadius: number; + substationMaxPixel: number; + minSubstationRadiusPixel: number; + areFlowsValid: boolean; + updatedLines: Line[]; + labelsVisible: boolean; + labelColor: Color; +}; + +export type LineLayerProps = _LineLayerProps & CompositeLayerProps; + +const defaultProps = { + network: null, + geoData: null, + getNominalVoltageColor: { type: 'accessor', value: [255, 255, 255] }, + disconnectedLineColor: { type: 'color', value: [255, 255, 255] }, + filteredNominalVoltages: null, + lineFlowMode: LineFlowMode.FEEDERS, + lineFlowColorMode: LineFlowColorMode.NOMINAL_VOLTAGE, + lineFlowAlertThreshold: 100, + showLineFlow: true, + lineFullPath: true, + lineParallelPath: true, + labelSize: 12, + iconSize: 48, + distanceBetweenLines: 1000, + maxParallelOffset: 100, + minParallelOffset: 3, + substationRadius: { type: 'number', value: SUBSTATION_RADIUS }, + substationMaxPixel: { type: 'number', value: SUBSTATION_RADIUS_MAX_PIXEL }, + minSubstationRadiusPixel: { + type: 'number', + value: SUBSTATION_RADIUS_MIN_PIXEL, + }, +}; + +export class LineLayer extends CompositeLayer> { + static layerName = 'LineLayer'; + static defaultProps = defaultProps; + + declare state: { + compositeData: CompositeData[]; + linesConnection: Map; + linesStatus: Map; + }; + + initializeState(context: LayerContext) { + super.initializeState(context); this.state = { compositeData: [], @@ -206,10 +343,16 @@ export class LineLayer extends CompositeLayer { }; } - getVoltageLevelIndex(voltageLevelId) { + getVoltageLevelIndex(voltageLevelId: string) { const { network } = this.props; const vl = network.getVoltageLevel(voltageLevelId); + if (vl === undefined) { + return undefined; + } const substation = network.getSubstation(vl.substationId); + if (substation === undefined) { + return undefined; + } return ( [ ...new Set( @@ -224,16 +367,15 @@ export class LineLayer extends CompositeLayer { } //TODO this is a huge function, refactor - updateState({ props, oldProps, changeFlags }) { - let compositeData; - let linesConnection; - let linesStatus; + updateState({ props, oldProps, changeFlags }: UpdateParameters) { + let compositeData: Partial[]; + let linesConnection: Map | undefined; + let linesStatus: Map | undefined; if (changeFlags.dataChanged) { compositeData = []; - - linesConnection = new Map(); - linesStatus = new Map(); + linesConnection = new Map(); + linesStatus = new Map(); if ( props.network != null && @@ -242,11 +384,15 @@ export class LineLayer extends CompositeLayer { props.geoData != null ) { // group lines by nominal voltage - const lineNominalVoltageIndexer = (map, line) => { + const lineNominalVoltageIndexer = ( + map: Map, + line: Line + ) => { const network = props.network; - const vl1 = network.getVoltageLevel(line.voltageLevelId1); - const vl2 = network.getVoltageLevel(line.voltageLevelId2); + const vl1 = network.getVoltageLevel(line.voltageLevelId1)!; + const vl2 = network.getVoltageLevel(line.voltageLevelId2)!; const vl = vl1 || vl2; + let list = map.get(vl.nominalV); if (!list) { list = []; @@ -259,31 +405,31 @@ export class LineLayer extends CompositeLayer { }; const linesByNominalVoltage = props.data.reduce( lineNominalVoltageIndexer, - new Map() + new Map() ); compositeData = Array.from(linesByNominalVoltage.entries()) - .map((e) => { - return { nominalV: e[0], lines: e[1] }; + .map(([nominalV, lines]) => { + return { nominalV, lines }; }) .sort((a, b) => b.nominalV - a.nominalV); - compositeData.forEach((compositeData) => { + compositeData.forEach((c) => { //find lines with same substations set - let mapOriginDestination = new Map(); - compositeData.mapOriginDestination = mapOriginDestination; - compositeData.lines.forEach((line) => { - linesConnection.set(line.id, { + const mapOriginDestination = new Map(); + c.mapOriginDestination = mapOriginDestination; + c.lines!.forEach((line) => { + linesConnection!.set(line.id, { terminal1Connected: line.terminal1Connected, terminal2Connected: line.terminal2Connected, }); - linesStatus.set(line.id, { + linesStatus!.set(line.id, { operatingStatus: line.operatingStatus, }); const key = this.genLineKey(line); - let val = mapOriginDestination.get(key); + const val = mapOriginDestination.get(key); if (val == null) { mapOriginDestination.set(key, new Set([line])); } else { @@ -299,11 +445,11 @@ export class LineLayer extends CompositeLayer { if (props.updatedLines !== oldProps.updatedLines) { props.updatedLines.forEach((line1) => { - linesConnection.set(line1.id, { + linesConnection!.set(line1.id, { terminal1Connected: line1.terminal1Connected, terminal2Connected: line1.terminal2Connected, }); - linesStatus.set(line1.id, { + linesStatus!.set(line1.id, { operatingStatus: line1.operatingStatus, }); }); @@ -317,7 +463,10 @@ export class LineLayer extends CompositeLayer { props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) ) { - this.recomputeParallelLinesIndex(compositeData, props); + this.recomputeParallelLinesIndex( + compositeData as CompositeData[], + props + ); } if ( @@ -326,9 +475,9 @@ export class LineLayer extends CompositeLayer { (oldProps.lineFullPath !== props.lineFullPath || oldProps.geoData !== props.geoData)) ) { - compositeData.forEach((compositeData) => { - let lineMap = new Map(); - compositeData.lines.forEach((line) => { + compositeData.forEach((c) => { + const lineMap = new Map(); + c.lines!.forEach((line) => { const positions = props.geoData.getLinePositions( props.network, line, @@ -342,7 +491,7 @@ export class LineLayer extends CompositeLayer { line: line, }); }); - compositeData.lineMap = lineMap; + c.lineMap = lineMap; }); } @@ -353,7 +502,7 @@ export class LineLayer extends CompositeLayer { props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) ) { - this.recomputeForkLines(compositeData, props); + this.recomputeForkLines(compositeData as CompositeData[], props); } if ( @@ -364,35 +513,35 @@ export class LineLayer extends CompositeLayer { props.geoData !== oldProps.geoData)) ) { //add labels - compositeData.forEach((compositeData) => { - compositeData.activePower = []; - compositeData.lines.forEach((line) => { - let lineData = compositeData.lineMap.get(line.id); - let arrowDirection = getArrowDirection(line.p1); - let coordinates1 = props.geoData.labelDisplayPosition( + compositeData.forEach((cData) => { + cData.activePower = []; + cData.lines!.forEach((line) => { + const lineData = cData.lineMap!.get(line.id)!; + const arrowDirection = getArrowDirection(line.p1); + const coordinates1 = props.geoData.labelDisplayPosition( lineData.positions, lineData.cumulativeDistances, START_ARROW_POSITION, arrowDirection, line.parallelIndex, - (line.angle * 180) / Math.PI, - (line.angleStart * 180) / Math.PI, + (line.angle! * 180) / Math.PI, + (line.angleStart! * 180) / Math.PI, props.distanceBetweenLines, - line.proximityFactorStart + line.proximityFactorStart! ); - let coordinates2 = props.geoData.labelDisplayPosition( + const coordinates2 = props.geoData.labelDisplayPosition( lineData.positions, lineData.cumulativeDistances, END_ARROW_POSITION, arrowDirection, line.parallelIndex, - (line.angle * 180) / Math.PI, - (line.angleEnd * 180) / Math.PI, + (line.angle! * 180) / Math.PI, + (line.angleEnd! * 180) / Math.PI, props.distanceBetweenLines, - line.proximityFactorEnd + line.proximityFactorEnd! ); if (coordinates1 !== null && coordinates2 !== null) { - compositeData.activePower.push({ + cData.activePower!.push({ line: line, p: line.p1, printPosition: [ @@ -401,7 +550,7 @@ export class LineLayer extends CompositeLayer { ], offset: coordinates1.offset, }); - compositeData.activePower.push({ + cData.activePower!.push({ line: line, p: line.p2, printPosition: [ @@ -424,30 +573,30 @@ export class LineLayer extends CompositeLayer { props.geoData !== oldProps.geoData)) ) { //add icons - compositeData.forEach((compositeData) => { - compositeData.operatingStatus = []; - compositeData.lines.forEach((line) => { - let lineStatus = linesStatus.get(line.id); + compositeData.forEach((cData) => { + cData.operatingStatus = []; + cData.lines!.forEach((line) => { + const lineStatus = linesStatus!.get(line.id); if ( lineStatus !== undefined && lineStatus.operatingStatus !== undefined && lineStatus.operatingStatus !== 'IN_OPERATION' ) { - let lineData = compositeData.lineMap.get(line.id); - let coordinatesIcon = + const lineData = cData.lineMap!.get(line.id)!; + const coordinatesIcon = props.geoData.labelDisplayPosition( lineData.positions, lineData.cumulativeDistances, 0.5, ArrowDirection.NONE, line.parallelIndex, - (line.angle * 180) / Math.PI, - (line.angleEnd * 180) / Math.PI, + (line.angle! * 180) / Math.PI, + (line.angleEnd! * 180) / Math.PI, props.distanceBetweenLines, - line.proximityFactorEnd + line.proximityFactorEnd! ); if (coordinatesIcon !== null) { - compositeData.operatingStatus.push({ + cData.operatingStatus!.push({ status: lineStatus.operatingStatus, printPosition: [ coordinatesIcon.position.longitude, @@ -473,12 +622,12 @@ export class LineLayer extends CompositeLayer { oldProps.lineFlowMode === LineFlowMode.FEEDERS)))) ) { // add arrows - compositeData.forEach((compositeData) => { - const lineMap = compositeData.lineMap; + compositeData.forEach((cData) => { + const lineMap = cData.lineMap!; // create one arrow each DISTANCE_BETWEEN_ARROWS - compositeData.arrows = compositeData.lines.flatMap((line) => { - let lineData = lineMap.get(line.id); + cData.arrows = cData.lines!.flatMap((line) => { + const lineData = lineMap.get(line.id)!; line.cumulativeDistances = lineData.cumulativeDistances; line.positions = lineData.positions; @@ -526,22 +675,21 @@ export class LineLayer extends CompositeLayer { }); }); } - this.setState({ - compositeData: compositeData, - linesConnection: linesConnection, - linesStatus: linesStatus, - }); + this.setState({ compositeData, linesConnection, linesStatus }); } - genLineKey(line) { + genLineKey(line: Line) { return line.voltageLevelId1 > line.voltageLevelId2 ? line.voltageLevelId1 + '##' + line.voltageLevelId2 : line.voltageLevelId2 + '##' + line.voltageLevelId1; } - recomputeParallelLinesIndex(compositeData, props) { - compositeData.forEach((compositeData) => { - const mapOriginDestination = compositeData.mapOriginDestination; + recomputeParallelLinesIndex( + compositeData: CompositeData[], + props: this['props'] + ) { + compositeData.forEach((cData) => { + const mapOriginDestination = cData.mapOriginDestination!; // calculate index for line with same substation set // The index is a real number in a normalized unit. // +1 => distanceBetweenLines on side @@ -572,11 +720,14 @@ export class LineLayer extends CompositeLayer { }); } - recomputeForkLines(compositeData, props) { - const mapMinProximityFactor = new Map(); - compositeData.forEach((compositeData) => { - compositeData.lines.forEach((line) => { - const positions = compositeData.lineMap.get(line.id).positions; + recomputeForkLines(compositeData: CompositeData[], props: this['props']) { + const mapMinProximityFactor = new Map(); + compositeData.forEach((cData) => { + cData.lines.forEach((line) => { + const positions = cData?.lineMap?.get(line.id)?.positions; + if (!positions) { + return; + } //the first and last in positions doesn't depend on lineFullPath line.origin = positions[0]; line.end = positions[positions.length - 1]; @@ -612,8 +763,8 @@ export class LineLayer extends CompositeLayer { positions[positions.length - 1] ); - let key = this.genLineKey(line); - let val = mapMinProximityFactor.get(key); + const key = this.genLineKey(line); + const val = mapMinProximityFactor.get(key); if (val == null) { mapMinProximityFactor.set(key, { lines: [line], @@ -636,7 +787,7 @@ export class LineLayer extends CompositeLayer { ); } - getProximityFactor(firstPosition, secondPosition) { + getProximityFactor(firstPosition: LonLat, secondPosition: LonLat) { let factor = getDistance(firstPosition, secondPosition) / (3 * this.props.distanceBetweenLines); @@ -646,7 +797,7 @@ export class LineLayer extends CompositeLayer { return factor; } - computeAngle(props, position1, position2) { + computeAngle(props: this['props'], position1: LonLat, position2: LonLat) { let angle = props.geoData.getMapAngle(position1, position2); angle = (angle * Math.PI) / 180 + Math.PI; if (angle < 0) { @@ -656,7 +807,7 @@ export class LineLayer extends CompositeLayer { } renderLayers() { - const layers = []; + const layers: Layer[] = []; const linePathUpdateTriggers = [ this.props.lineFullPath, @@ -665,44 +816,44 @@ export class LineLayer extends CompositeLayer { ]; // lines : create one layer per nominal voltage, starting from higher to lower nominal voltage - this.state.compositeData.forEach((compositeData) => { + this.state.compositeData.forEach((cData) => { const nominalVoltageColor = this.props.getNominalVoltageColor( - compositeData.nominalV + cData.nominalV ); const lineLayer = new ParallelPathLayer( this.getSubLayerProps({ - id: 'LineNominalVoltage' + compositeData.nominalV, - data: compositeData.lines, + id: 'LineNominalVoltage' + cData.nominalV, + data: cData.lines, widthScale: 20, widthMinPixels: 1, widthMaxPixels: 2, - getPath: (line) => + getPath: (line: Line) => this.props.geoData.getLinePositions( this.props.network, line, this.props.lineFullPath ), - getColor: (line) => + getColor: (line: Line) => getLineColor( line, nominalVoltageColor, this.props, - this.state.linesConnection.get(line.id) + this.state.linesConnection.get(line.id)! ), getWidth: 2, - getLineParallelIndex: (line) => line.parallelIndex, - getExtraAttributes: (line) => [ + getLineParallelIndex: (line: Line) => line.parallelIndex, + getExtraAttributes: (line: Line) => [ line.angleStart, line.angle, line.angleEnd, line.parallelIndex * 2 + 31 + 64 * - (Math.ceil(line.proximityFactorStart * 512) - + (Math.ceil(line.proximityFactorStart! * 512) - 1) + 64 * 512 * - (Math.ceil(line.proximityFactorEnd * 512) - 1), + (Math.ceil(line.proximityFactorEnd! * 512) - 1), ], distanceBetweenLines: this.props.distanceBetweenLines, maxParallelOffset: this.props.maxParallelOffset, @@ -710,7 +861,7 @@ export class LineLayer extends CompositeLayer { visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - compositeData.nominalV + cData.nominalV ), updateTriggers: { getPath: linePathUpdateTriggers, @@ -726,8 +877,8 @@ export class LineLayer extends CompositeLayer { ], getDashArray: [this.props.updatedLines], }, - getDashArray: (line) => - doDash(this.state.linesConnection.get(line.id)) + getDashArray: (line: Line) => + doDash(this.state.linesConnection!.get(line.id)!) ? dashArray : noDashArray, extensions: [new PathStyleExtension({ dash: true })], @@ -737,42 +888,44 @@ export class LineLayer extends CompositeLayer { const arrowLayer = new ArrowLayer( this.getSubLayerProps({ - id: 'ArrowNominalVoltage' + compositeData.nominalV, - data: compositeData.arrows, + id: 'ArrowNominalVoltage' + cData.nominalV, + data: cData.arrows, sizeMinPixels: 3, sizeMaxPixels: 7, - getDistance: (arrow) => arrow.distance, - getLine: (arrow) => arrow.line, - getLinePositions: (line) => + getDistance: (arrow: Arrow) => arrow.distance, + getLine: (arrow: Arrow) => arrow.line, + getLinePositions: (line: Line) => this.props.geoData.getLinePositions( this.props.network, line, this.props.lineFullPath ), - getColor: (arrow) => + getColor: (arrow: Arrow) => getLineColor( arrow.line, nominalVoltageColor, this.props, - this.state.linesConnection.get(arrow.line.id) + this.state.linesConnection.get(arrow.line.id)! ), getSize: 700, - getSpeedFactor: (arrow) => + getSpeedFactor: (arrow: Arrow) => getArrowSpeedFactor(getArrowSpeed(arrow.line)), - getLineParallelIndex: (arrow) => arrow.line.parallelIndex, - getLineAngles: (arrow) => [ + getLineParallelIndex: (arrow: Arrow) => + arrow.line.parallelIndex, + getLineAngles: (arrow: Arrow) => [ arrow.line.angleStart, arrow.line.angle, arrow.line.angleEnd, ], - getProximityFactors: (arrow) => [ + getProximityFactors: (arrow: Arrow) => [ arrow.line.proximityFactorStart, arrow.line.proximityFactorEnd, ], - getDistanceBetweenLines: this.props.distanceBetweenLines, + getDistanceBetweenLines: () => + this.props.distanceBetweenLines, maxParallelOffset: this.props.maxParallelOffset, minParallelOffset: this.props.minParallelOffset, - getDirection: (arrow) => { + getDirection: (arrow: Arrow) => { return getArrowDirection(arrow.line.p1); }, animated: @@ -783,7 +936,7 @@ export class LineLayer extends CompositeLayer { this.props.showLineFlow && (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - compositeData.nominalV + cData.nominalV )), opacity: this.props.areFlowsValid ? 1 @@ -806,25 +959,27 @@ export class LineLayer extends CompositeLayer { const startFork = new ForkLineLayer( this.getSubLayerProps({ - id: 'LineForkStart' + compositeData.nominalV, - getSourcePosition: (line) => line.origin, - getTargetPosition: (line) => line.end, - getSubstationOffset: (line) => line.substationIndexStart, - data: compositeData.lines, + id: 'LineForkStart' + cData.nominalV, + getSourcePosition: (line: Line) => line.origin, + getTargetPosition: (line: Line) => line.end, + getSubstationOffset: (line: Line) => + line.substationIndexStart, + data: cData.lines, widthScale: 20, widthMinPixels: 1, widthMaxPixels: 2, - getColor: (line) => + getColor: (line: Line) => getLineColor( line, nominalVoltageColor, this.props, - this.state.linesConnection.get(line.id) + this.state.linesConnection.get(line.id)! ), getWidth: 2, - getProximityFactor: (line) => line.proximityFactorStart, - getLineParallelIndex: (line) => line.parallelIndex, - getLineAngle: (line) => line.angleStart, + getProximityFactor: (line: Line) => + line.proximityFactorStart, + getLineParallelIndex: (line: Line) => line.parallelIndex, + getLineAngle: (line: Line) => line.angleStart, getDistanceBetweenLines: this.props.distanceBetweenLines, getMaxParallelOffset: this.props.maxParallelOffset, getMinParallelOffset: this.props.minParallelOffset, @@ -835,7 +990,7 @@ export class LineLayer extends CompositeLayer { visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - compositeData.nominalV + cData.nominalV ), updateTriggers: { getLineParallelIndex: linePathUpdateTriggers, @@ -856,25 +1011,26 @@ export class LineLayer extends CompositeLayer { const endFork = new ForkLineLayer( this.getSubLayerProps({ - id: 'LineForkEnd' + compositeData.nominalV, - getSourcePosition: (line) => line.end, - getTargetPosition: (line) => line.origin, - getSubstationOffset: (line) => line.substationIndexEnd, - data: compositeData.lines, + id: 'LineForkEnd' + cData.nominalV, + getSourcePosition: (line: Line) => line.end, + getTargetPosition: (line: Line) => line.origin, + getSubstationOffset: (line: Line) => + line.substationIndexEnd, + data: cData.lines, widthScale: 20, widthMinPixels: 1, widthMaxPixels: 2, - getColor: (line) => + getColor: (line: Line) => getLineColor( line, nominalVoltageColor, this.props, - this.state.linesConnection.get(line.id) + this.state.linesConnection.get(line.id)! ), getWidth: 2, - getProximityFactor: (line) => line.proximityFactorEnd, - getLineParallelIndex: (line) => -line.parallelIndex, - getLineAngle: (line) => line.angleEnd + Math.PI, + getProximityFactor: (line: Line) => line.proximityFactorEnd, + getLineParallelIndex: (line: Line) => -line.parallelIndex, + getLineAngle: (line: Line) => line.angleEnd! + Math.PI, getDistanceBetweenLines: this.props.distanceBetweenLines, getMaxParallelOffset: this.props.maxParallelOffset, getMinParallelOffset: this.props.minParallelOffset, @@ -885,7 +1041,7 @@ export class LineLayer extends CompositeLayer { visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - compositeData.nominalV + cData.nominalV ), updateTriggers: { getLineParallelIndex: [this.props.lineParallelPath], @@ -907,9 +1063,9 @@ export class LineLayer extends CompositeLayer { // lines active power const lineActivePowerLabelsLayer = new TextLayer( this.getSubLayerProps({ - id: 'ActivePower' + compositeData.nominalV, - data: compositeData.activePower, - getText: (activePower) => + id: 'ActivePower' + cData.nominalV, + data: cData.activePower, + getText: (activePower: ActivePower) => activePower.p !== undefined ? Math.round(activePower.p).toString() : '', @@ -917,18 +1073,19 @@ export class LineLayer extends CompositeLayer { // the label is not correctly positioned on the lines, they are slightly off. // In the custom layers, we clamp the distanceBetweenLines. This is not done in the deck.gl TextLayer // and IconLayer or in the position calculated here. - getPosition: (activePower) => activePower.printPosition, + getPosition: (activePower: ActivePower) => + activePower.printPosition, getColor: this.props.labelColor, fontFamily: 'Roboto', getSize: this.props.labelSize, getAngle: 0, - getPixelOffset: (activePower) => + getPixelOffset: (activePower: ActivePower) => activePower.offset.map((x) => x), getTextAnchor: 'middle', visible: (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - compositeData.nominalV + cData.nominalV )) && this.props.labelsVisible, opacity: this.props.areFlowsValid @@ -949,23 +1106,24 @@ export class LineLayer extends CompositeLayer { // line status const lineStatusIconLayer = new IconLayer( this.getSubLayerProps({ - id: 'OperatingStatus' + compositeData.nominalV, - data: compositeData.operatingStatus, + id: 'OperatingStatus' + cData.nominalV, + data: cData.operatingStatus, // The position passed to this layer causes a bug when zooming and maxParallelOffset is reached: // the icon is not correctly positioned on the lines, they are slightly off. // In the custom layers, we clamp the distanceBetweenLines. This is not done in the deck.gl TextLayer // and IconLayer or in the position calculated here. - getPosition: (operatingStatus) => + getPosition: (operatingStatus: OperatingStatus) => operatingStatus.printPosition, - getIcon: (operatingStatus) => + getIcon: (operatingStatus: OperatingStatus) => getLineIcon(operatingStatus.status), getSize: this.props.iconSize, getColor: () => this.props.labelColor, - getPixelOffset: (operatingStatus) => operatingStatus.offset, + getPixelOffset: (operatingStatus: OperatingStatus) => + operatingStatus.offset, visible: (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - compositeData.nominalV + cData.nominalV )) && this.props.labelsVisible, updateTriggers: { @@ -985,30 +1143,3 @@ export class LineLayer extends CompositeLayer { return layers; } } - -LineLayer.layerName = 'LineLayer'; - -LineLayer.defaultProps = { - network: null, - geoData: null, - getNominalVoltageColor: { type: 'accessor', value: [255, 255, 255] }, - disconnectedLineColor: { type: 'color', value: [255, 255, 255] }, - filteredNominalVoltages: null, - lineFlowMode: LineFlowMode.FEEDERS, - lineFlowColorMode: LineFlowColorMode.NOMINAL_VOLTAGE, - lineFlowAlertThreshold: 100, - showLineFlow: true, - lineFullPath: true, - lineParallelPath: true, - labelSize: 12, - iconSize: 48, - distanceBetweenLines: 1000, - maxParallelOffset: 100, - minParallelOffset: 3, - substationRadius: { type: 'number', value: SUBSTATION_RADIUS }, - substationMaxPixel: { type: 'number', value: SUBSTATION_RADIUS_MAX_PIXEL }, - minSubstationRadiusPixel: { - type: 'number', - value: SUBSTATION_RADIUS_MIN_PIXEL, - }, -}; diff --git a/src/components/network-map-viewer/network/map-equipments.js b/src/components/network-map-viewer/network/map-equipments.ts similarity index 77% rename from src/components/network-map-viewer/network/map-equipments.js rename to src/components/network-map-viewer/network/map-equipments.ts index d6343045..1e39118a 100644 --- a/src/components/network-map-viewer/network/map-equipments.js +++ b/src/components/network-map-viewer/network/map-equipments.ts @@ -5,35 +5,45 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { EQUIPMENT_TYPES } from '../utils/equipment-types'; - -const elementIdIndexer = (map, element) => { +import { + HvdcLine, + Line, + Substation, + TieLine, + VoltageLevel, +} from '@/components/network-map-viewer/utils/equipment-types'; +import { EQUIPMENT_TYPES, Equiment } from '../utils/equipment-types'; + +const elementIdIndexer = ( + map: Map, + element: T +) => { map.set(element.id, element); return map; }; export class MapEquipments { - substations = []; + substations: Substation[] = []; - substationsById = new Map(); + substationsById = new Map(); - lines = []; + lines: Line[] = []; - linesById = new Map(); + linesById = new Map(); - tieLines = []; + tieLines: TieLine[] = []; - tieLinesById = new Map(); + tieLinesById = new Map(); - hvdcLines = []; + hvdcLines: HvdcLine[] = []; - hvdcLinesById = new Map(); + hvdcLinesById = new Map(); - voltageLevels = []; + voltageLevels: VoltageLevel[] = []; - voltageLevelsById = new Map(); + voltageLevelsById = new Map(); - nominalVoltages = []; + nominalVoltages: number[] = []; intlRef = undefined; @@ -46,17 +56,17 @@ export class MapEquipments { return Object.assign(Object.create(Object.getPrototypeOf(this)), this); } - checkAndGetValues(equipments) { + checkAndGetValues(equipments: Equiment[]) { return equipments ? equipments : []; } - completeSubstationsInfos(equipementsToIndex) { + completeSubstationsInfos(equipementsToIndex: Substation[]) { const nominalVoltagesSet = new Set(this.nominalVoltages); if (equipementsToIndex?.length === 0) { this.substationsById = new Map(); this.voltageLevelsById = new Map(); } - const substations = + const substations: Substation[] = equipementsToIndex?.length > 0 ? equipementsToIndex : this.substations; @@ -84,7 +94,11 @@ export class MapEquipments { ); } - updateEquipments(currentEquipments, newEquipements) { + updateEquipments( + currentEquipments: T[], + newEquipements: T[], + _equipmentType: EQUIPMENT_TYPES + ) { // replace current modified equipments currentEquipments.forEach((equipment1, index) => { const found = newEquipements.filter( @@ -104,7 +118,7 @@ export class MapEquipments { return [...currentEquipments, ...eqptsToAdd]; } - updateSubstations(substations, fullReload) { + updateSubstations(substations: Substation[], fullReload: boolean) { if (fullReload) { this.substations = []; } @@ -138,7 +152,7 @@ export class MapEquipments { } }); - if (substationAdded === true || voltageLevelAdded === true) { + if (substationAdded || voltageLevelAdded) { this.substations = [...this.substations]; } @@ -146,7 +160,7 @@ export class MapEquipments { this.completeSubstationsInfos(fullReload ? [] : substations); } - completeLinesInfos(equipementsToIndex) { + completeLinesInfos(equipementsToIndex: Line[]) { if (equipementsToIndex?.length > 0) { equipementsToIndex.forEach((line) => { this.linesById?.set(line.id, line); @@ -156,7 +170,7 @@ export class MapEquipments { } } - completeTieLinesInfos(equipementsToIndex) { + completeTieLinesInfos(equipementsToIndex: Equiment[]) { if (equipementsToIndex?.length > 0) { equipementsToIndex.forEach((tieLine) => { this.tieLinesById?.set(tieLine.id, tieLine); @@ -169,7 +183,7 @@ export class MapEquipments { } } - updateLines(lines, fullReload) { + updateLines(lines: Line[], fullReload: boolean) { if (fullReload) { this.lines = []; } @@ -181,7 +195,7 @@ export class MapEquipments { this.completeLinesInfos(fullReload ? [] : lines); } - updateTieLines(tieLines, fullReload) { + updateTieLines(tieLines: TieLine[], fullReload: boolean) { if (fullReload) { this.tieLines = []; } @@ -193,7 +207,7 @@ export class MapEquipments { this.completeTieLinesInfos(fullReload ? [] : tieLines); } - updateHvdcLines(hvdcLines, fullReload) { + updateHvdcLines(hvdcLines: HvdcLine[], fullReload: boolean) { if (fullReload) { this.hvdcLines = []; } @@ -205,7 +219,7 @@ export class MapEquipments { this.completeHvdcLinesInfos(fullReload ? [] : hvdcLines); } - completeHvdcLinesInfos(equipementsToIndex) { + completeHvdcLinesInfos(equipementsToIndex: HvdcLine[]) { if (equipementsToIndex?.length > 0) { equipementsToIndex.forEach((hvdcLine) => { this.hvdcLinesById?.set(hvdcLine.id, hvdcLine); @@ -218,7 +232,7 @@ export class MapEquipments { } } - removeBranchesOfVoltageLevel(branchesList, voltageLevelId) { + removeBranchesOfVoltageLevel(branchesList: Line[], voltageLevelId: string) { const remainingLines = branchesList.filter( (l) => l.voltageLevelId1 !== voltageLevelId && @@ -231,7 +245,7 @@ export class MapEquipments { return remainingLines; } - removeEquipment(equipmentType, equipmentId) { + removeEquipment(equipmentType: EQUIPMENT_TYPES, equipmentId: string) { switch (equipmentType) { case EQUIPMENT_TYPES.LINE: { this.lines = this.lines.filter((l) => l.id !== equipmentId); @@ -240,14 +254,17 @@ export class MapEquipments { } case EQUIPMENT_TYPES.VOLTAGE_LEVEL: { const substationId = - this.voltageLevelsById.get(equipmentId).substationId; - let voltageLevelsOfSubstation = - this.substationsById.get(substationId).voltageLevels; - voltageLevelsOfSubstation = voltageLevelsOfSubstation.filter( + this.voltageLevelsById.get(equipmentId)?.substationId; + if (substationId === undefined) { + return; + } + const substation = this.substationsById.get(substationId); + if (substation === undefined) { + return; + } + substation.voltageLevels = substation.voltageLevels.filter( (l) => l.id !== equipmentId ); - this.substationsById.get(substationId).voltageLevels = - voltageLevelsOfSubstation; this.removeBranchesOfVoltageLevel(this.lines, equipmentId); //New reference on substations to trigger reload of NetworkExplorer and NetworkMap @@ -260,6 +277,9 @@ export class MapEquipments { ); const substation = this.substationsById.get(equipmentId); + if (substation === undefined) { + return; + } substation.voltageLevels.map((vl) => this.removeEquipment(EQUIPMENT_TYPES.VOLTAGE_LEVEL, vl.id) ); @@ -274,7 +294,7 @@ export class MapEquipments { return this.voltageLevels; } - getVoltageLevel(id) { + getVoltageLevel(id: string) { return this.voltageLevelsById.get(id); } @@ -282,7 +302,7 @@ export class MapEquipments { return this.substations; } - getSubstation(id) { + getSubstation(id: string) { return this.substationsById.get(id); } @@ -294,7 +314,7 @@ export class MapEquipments { return this.lines; } - getLine(id) { + getLine(id: string) { return this.linesById.get(id); } @@ -302,7 +322,7 @@ export class MapEquipments { return this.hvdcLines; } - getHvdcLine(id) { + getHvdcLine(id: string) { return this.hvdcLinesById.get(id); } @@ -310,7 +330,7 @@ export class MapEquipments { return this.tieLines; } - getTieLine(id) { + getTieLine(id: string) { return this.tieLinesById.get(id); } } diff --git a/src/components/network-map-viewer/network/network-map.jsx b/src/components/network-map-viewer/network/network-map.jsx deleted file mode 100644 index a770c8a6..00000000 --- a/src/components/network-map-viewer/network/network-map.jsx +++ /dev/null @@ -1,841 +0,0 @@ -/** - * Copyright (c) 2020, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -import PropTypes from 'prop-types'; -import React, { - forwardRef, - useCallback, - useEffect, - useImperativeHandle, - useMemo, - useRef, - useState, -} from 'react'; - -import { Box, decomposeColor } from '@mui/system'; -import LoaderWithOverlay from '../utils/loader-with-overlay'; - -import { MapboxOverlay } from '@deck.gl/mapbox'; -import { Replay } from '@mui/icons-material'; -import { Button, useTheme } from '@mui/material'; -import { FormattedMessage } from 'react-intl'; -import { Map, NavigationControl, useControl } from 'react-map-gl'; -import { getNominalVoltageColor } from '../../../utils/colors'; -import { useNameOrId } from '../utils/equipmentInfosHandler'; -import { GeoData } from './geo-data'; -import DrawControl, { getMapDrawer } from './draw-control.ts'; -import { LineFlowColorMode, LineFlowMode, LineLayer } from './line-layer'; -import { MapEquipments } from './map-equipments'; -import { SubstationLayer } from './substation-layer'; - -import booleanPointInPolygon from '@turf/boolean-point-in-polygon'; -import mapboxgl from 'mapbox-gl'; -import 'mapbox-gl/dist/mapbox-gl.css'; -import maplibregl from 'maplibre-gl'; -import 'maplibre-gl/dist/maplibre-gl.css'; -import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css'; -import { EQUIPMENT_TYPES } from '../utils/equipment-types.js'; - -// MouseEvent.button https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button -const MOUSE_EVENT_BUTTON_LEFT = 0; -const MOUSE_EVENT_BUTTON_RIGHT = 2; - -/** - * Represents the draw event types for the network map. - * when a draw event is triggered, the event type is passed to the onDrawEvent callback - * On create, when the user create a new polygon (shape finished) - */ -export const DRAW_EVENT = { - CREATE: 1, - UPDATE: 2, - DELETE: 0, -}; - -// Small boilerplate recommended by deckgl, to bridge to a react-map-gl control declaratively -// see https://deck.gl/docs/api-reference/mapbox/mapbox-overlay#using-with-react-map-gl -const DeckGLOverlay = React.forwardRef((props, ref) => { - const overlay = useControl(() => new MapboxOverlay(props)); - overlay.setProps(props); - useImperativeHandle(ref, () => overlay, [overlay]); - return null; -}); - -const PICKING_RADIUS = 5; - -const CARTO = 'carto'; -const CARTO_NOLABEL = 'cartonolabel'; -const MAPBOX = 'mapbox'; - -const LIGHT = 'light'; -const DARK = 'dark'; - -const styles = { - mapManualRefreshBackdrop: { - width: '100%', - height: '100%', - textAlign: 'center', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - background: 'grey', - opacity: '0.8', - zIndex: 99, - fontSize: 30, - }, -}; - -const FALLBACK_MAPBOX_TOKEN = - 'pk.eyJ1IjoiZ2VvZmphbWciLCJhIjoiY2pwbnRwcm8wMDYzMDQ4b2pieXd0bDMxNSJ9.Q4aL20nBo5CzGkrWtxroug'; - -const SUBSTATION_LAYER_PREFIX = 'substationLayer'; -const LINE_LAYER_PREFIX = 'lineLayer'; -const LABEL_SIZE = 12; -const INITIAL_CENTERED = { - lastCenteredSubstation: null, - centeredSubstationId: null, - centered: false, -}; - -// get polygon coordinates (features) or an empty object -function getPolygonFeatures() { - return getMapDrawer()?.getAll()?.features[0] ?? {}; -} -const NetworkMap = forwardRef((props, ref) => { - const [labelsVisible, setLabelsVisible] = useState(false); - const [showLineFlow, setShowLineFlow] = useState(true); - const [showTooltip, setShowTooltip] = useState(true); - const mapRef = useRef(); - const deckRef = useRef(); - const [centered, setCentered] = useState(INITIAL_CENTERED); - const lastViewStateRef = useRef(null); - const [tooltip, setTooltip] = useState({}); - const theme = useTheme(); - const foregroundNeutralColor = useMemo(() => { - const labelColor = decomposeColor(theme.palette.text.primary).values; - labelColor[3] *= 255; - return labelColor; - }, [theme]); - const [cursorType, setCursorType] = useState('grab'); - const [isDragging, setDragging] = useState(false); - - //NOTE these constants are moved to the component's parameters list - //const currentNode = useSelector((state) => state.currentTreeNode); - const { - onPolygonChanged, - centerOnSubstation, - onDrawEvent, - shouldDisableToolTip, - } = props; - - const { getNameOrId } = useNameOrId(props.useName); - - const readyToDisplay = - props.mapEquipments !== null && - props.geoData !== null && - !props.disabled; - - const readyToDisplaySubstations = - readyToDisplay && - props.mapEquipments.substations && - props.geoData.substationPositionsById.size > 0; - - const readyToDisplayLines = - readyToDisplay && - (props.mapEquipments?.lines || - props.mapEquipments?.hvdcLines || - props.mapEquipments?.tieLines) && - props.mapEquipments.voltageLevels && - props.geoData.substationPositionsById.size > 0; - - const mapEquipmentsLines = useMemo(() => { - return [ - ...(props.mapEquipments?.lines.map((line) => ({ - ...line, - equipmentType: EQUIPMENT_TYPES.LINE, - })) ?? []), - ...(props.mapEquipments?.tieLines.map((tieLine) => ({ - ...tieLine, - equipmentType: EQUIPMENT_TYPES.TIE_LINE, - })) ?? []), - ...(props.mapEquipments?.hvdcLines.map((hvdcLine) => ({ - ...hvdcLine, - equipmentType: EQUIPMENT_TYPES.HVDC_LINE, - })) ?? []), - ]; - }, [ - props.mapEquipments?.hvdcLines, - props.mapEquipments?.tieLines, - props.mapEquipments?.lines, - ]); - - const divRef = useRef(); - - const mToken = !props.mapBoxToken - ? FALLBACK_MAPBOX_TOKEN - : props.mapBoxToken; - - useEffect(() => { - if (centerOnSubstation === null) { - return; - } - setCentered({ - lastCenteredSubstation: null, - centeredSubstationId: centerOnSubstation?.to, - centered: true, - }); - }, [centerOnSubstation]); - - // TODO simplify this, now we use Map as the camera controlling component - // so we don't need the deckgl ref anymore. The following comments are - // probably outdated, cleanup everything: - // Do this in onAfterRender because when doing it in useEffect (triggered by calling setDeck()), - // it doesn't work in the case of using the browser backward/forward buttons (because in this particular case, - // we get the ref to the deck and it has not yet initialized..) - function onAfterRender() { - // TODO outdated comment - //use centered and deck to execute this block only once when the data is ready and deckgl is initialized - //TODO, replace the next lines with setProps( { initialViewState } ) when we upgrade to 8.1.0 - //see https://github.com/uber/deck.gl/pull/4038 - //This is a hack because it accesses the properties of deck directly but for now it works - if ( - (!centered.centered || - (centered.centeredSubstationId && - centered.centeredSubstationId !== - centered.lastCenteredSubstation)) && - props.geoData !== null - ) { - if (props.geoData.substationPositionsById.size > 0) { - if (centered.centeredSubstationId) { - const geodata = props.geoData.substationPositionsById.get( - centered.centeredSubstationId - ); - if (!geodata) { - return; - } // can't center on substation if no coordinate. - mapRef.current?.flyTo({ - center: [geodata.lon, geodata.lat], - duration: 2000, - }); - setCentered({ - lastCenteredSubstation: centered.centeredSubstationId, - centeredSubstationId: centered.centeredSubstationId, - centered: true, - }); - } else { - const coords = Array.from( - props.geoData.substationPositionsById.entries() - ).map((x) => x[1]); - const maxlon = Math.max.apply( - null, - coords.map((x) => x.lon) - ); - const minlon = Math.min.apply( - null, - coords.map((x) => x.lon) - ); - const maxlat = Math.max.apply( - null, - coords.map((x) => x.lat) - ); - const minlat = Math.min.apply( - null, - coords.map((x) => x.lat) - ); - const marginlon = (maxlon - minlon) / 10; - const marginlat = (maxlat - minlat) / 10; - mapRef.current?.fitBounds( - [ - [minlon - marginlon / 2, minlat - marginlat / 2], - [maxlon + marginlon / 2, maxlat + marginlat / 2], - ], - { animate: false } - ); - setCentered({ - lastCenteredSubstation: null, - centered: true, - }); - } - } - } - } - - function onViewStateChange(info) { - lastViewStateRef.current = info.viewState; - if ( - !info.interactionState || // first event of before an animation (e.g. clicking the +/- buttons of the navigation controls, gives the target - (info.interactionState && !info.interactionState.inTransition) // Any event not part of a animation (mouse panning or zooming) - ) { - if ( - info.viewState.zoom >= props.labelsZoomThreshold && - !labelsVisible - ) { - setLabelsVisible(true); - } else if ( - info.viewState.zoom < props.labelsZoomThreshold && - labelsVisible - ) { - setLabelsVisible(false); - } - setShowTooltip(info.viewState.zoom >= props.tooltipZoomThreshold); - setShowLineFlow(info.viewState.zoom >= props.arrowsZoomThreshold); - } - } - - function renderTooltip() { - return ( - tooltip && - tooltip.visible && - !shouldDisableToolTip && - //As of now only LINE tooltip is implemented, the following condition is to be removed or tweaked once other types of line tooltip are implemented - tooltip.equipmentType === EQUIPMENT_TYPES.LINE && ( -
- {props.renderPopover(tooltip.equipmentId, divRef.current)} -
- ) - ); - } - - function onClickHandler(info, event, network) { - const leftButton = - event.originalEvent.button === MOUSE_EVENT_BUTTON_LEFT; - const rightButton = - event.originalEvent.button === MOUSE_EVENT_BUTTON_RIGHT; - if ( - info.layer && - info.layer.id.startsWith(SUBSTATION_LAYER_PREFIX) && - info.object && - (info.object.substationId || info.object.voltageLevels) // is a voltage level marker, or a substation text - ) { - let idVl; - let idSubstation; - if (info.object.substationId) { - idVl = info.object.id; - } else if (info.object.voltageLevels) { - if (info.object.voltageLevels.length === 1) { - let idS = info.object.voltageLevels[0].substationId; - let substation = network.getSubstation(idS); - if (substation && substation.voltageLevels.length > 1) { - idSubstation = idS; - } else { - idVl = info.object.voltageLevels[0].id; - } - } else { - idSubstation = info.object.voltageLevels[0].substationId; - } - } - if (idVl !== undefined) { - if (props.onSubstationClick && leftButton) { - props.onSubstationClick(idVl); - } else if (props.onVoltageLevelMenuClick && rightButton) { - props.onVoltageLevelMenuClick( - network.getVoltageLevel(idVl), - event.originalEvent.x, - event.originalEvent.y - ); - } - } - if (idSubstation !== undefined) { - if (props.onSubstationClickChooseVoltageLevel && leftButton) { - props.onSubstationClickChooseVoltageLevel( - idSubstation, - event.originalEvent.x, - event.originalEvent.y - ); - } else if (props.onSubstationMenuClick && rightButton) { - props.onSubstationMenuClick( - network.getSubstation(idSubstation), - event.originalEvent.x, - event.originalEvent.y - ); - } - } - } - if ( - rightButton && - info.layer && - info.layer.id.startsWith(LINE_LAYER_PREFIX) && - info.object && - info.object.id && - info.object.voltageLevelId1 && - info.object.voltageLevelId2 - ) { - // picked line properties are retrieved from network data and not from pickable object infos, - // because pickable object infos might not be up to date - const line = network.getLine(info.object.id); - const tieLine = network.getTieLine(info.object.id); - const hvdcLine = network.getHvdcLine(info.object.id); - - const equipment = line || tieLine || hvdcLine; - if (equipment) { - const menuClickFunction = - equipment === line - ? props.onLineMenuClick - : equipment === tieLine - ? props.onTieLineMenuClick - : props.onHvdcLineMenuClick; - - menuClickFunction( - equipment, - event.originalEvent.x, - event.originalEvent.y - ); - } - } - } - - function onMapContextMenu(event) { - const info = - deckRef.current && - deckRef.current.pickObject({ - x: event.point.x, - y: event.point.y, - radius: PICKING_RADIUS, - }); - info && onClickHandler(info, event, props.mapEquipments); - } - - function cursorHandler() { - return isDragging ? 'grabbing' : cursorType; - } - - const layers = []; - - if (readyToDisplaySubstations) { - layers.push( - new SubstationLayer({ - id: SUBSTATION_LAYER_PREFIX, - data: props.mapEquipments?.substations, - network: props.mapEquipments, - geoData: props.geoData, - getNominalVoltageColor: getNominalVoltageColor, - filteredNominalVoltages: props.filteredNominalVoltages, - labelsVisible: labelsVisible, - labelColor: foregroundNeutralColor, - labelSize: LABEL_SIZE, - pickable: true, - onHover: ({ object }) => { - setCursorType(object ? 'pointer' : 'grab'); - }, - getNameOrId: getNameOrId, - }) - ); - } - - if (readyToDisplayLines) { - layers.push( - new LineLayer({ - areFlowsValid: props.areFlowsValid, - id: LINE_LAYER_PREFIX, - data: mapEquipmentsLines, - network: props.mapEquipments, - updatedLines: props.updatedLines, - geoData: props.geoData, - getNominalVoltageColor: getNominalVoltageColor, - disconnectedLineColor: foregroundNeutralColor, - filteredNominalVoltages: props.filteredNominalVoltages, - lineFlowMode: props.lineFlowMode, - showLineFlow: props.visible && showLineFlow, - lineFlowColorMode: props.lineFlowColorMode, - lineFlowAlertThreshold: props.lineFlowAlertThreshold, - lineFullPath: - props.geoData.linePositionsById.size > 0 && - props.lineFullPath, - lineParallelPath: props.lineParallelPath, - labelsVisible: labelsVisible, - labelColor: foregroundNeutralColor, - labelSize: LABEL_SIZE, - pickable: true, - onHover: ({ object, x, y }) => { - if (object) { - setCursorType('pointer'); - const lineObject = object?.line ?? object; - setTooltip({ - equipmentId: lineObject?.id, - equipmentType: lineObject?.equipmentType, - pointerX: x, - pointerY: y, - visible: showTooltip, - }); - } else { - setCursorType('grab'); - setTooltip(null); - } - }, - }) - ); - } - - const initialViewState = { - longitude: props.initialPosition[0], - latitude: props.initialPosition[1], - zoom: props.initialZoom, - maxZoom: 14, - pitch: 0, - bearing: 0, - }; - - const renderOverlay = () => ( - - ); - - useEffect(() => { - mapRef.current?.resize(); - }, [props.triggerMapResizeOnChange]); - - const getMapStyle = (mapLibrary, mapTheme) => { - switch (mapLibrary) { - case MAPBOX: - if (mapTheme === LIGHT) { - return 'mapbox://styles/mapbox/light-v9'; - } else { - return 'mapbox://styles/mapbox/dark-v9'; - } - case CARTO: - if (mapTheme === LIGHT) { - return 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json'; - } else { - return 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json'; - } - case CARTO_NOLABEL: - if (mapTheme === LIGHT) { - return 'https://basemaps.cartocdn.com/gl/positron-nolabels-gl-style/style.json'; - } else { - return 'https://basemaps.cartocdn.com/gl/dark-matter-nolabels-gl-style/style.json'; - } - default: - return 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json'; - } - }; - - const mapStyle = useMemo( - () => getMapStyle(props.mapLibrary, props.mapTheme), - [props.mapLibrary, props.mapTheme] - ); - - const mapLib = - props.mapLibrary === MAPBOX - ? mToken && { - key: 'mapboxgl', - mapLib: mapboxgl, - mapboxAccessToken: mToken, - } - : { - key: 'maplibregl', - mapLib: maplibregl, - }; - - // because the mapLib prop of react-map-gl is not reactive, we need to - // unmount/mount the Map with 'key', so we need also to reset all state - // associated with uncontrolled state of the map - useEffect(() => { - setCentered(INITIAL_CENTERED); - }, [mapLib?.key]); - - const onUpdate = useCallback(() => { - onPolygonChanged(getPolygonFeatures()); - onDrawEvent(DRAW_EVENT.UPDATE); - }, [onDrawEvent, onPolygonChanged]); - - const onCreate = useCallback(() => { - onPolygonChanged(getPolygonFeatures()); - onDrawEvent(DRAW_EVENT.CREATE); - }, [onDrawEvent, onPolygonChanged]); - const getSelectedLines = useCallback(() => { - const polygonFeatures = getPolygonFeatures(); - const polygonCoordinates = polygonFeatures?.geometry; - if (!polygonCoordinates || polygonCoordinates.coordinates < 3) { - return []; - } - //for each line, check if it is in the polygon - const selectedLines = getSelectedLinesInPolygon( - props.mapEquipments, - mapEquipmentsLines, - props.geoData, - polygonCoordinates - ); - return selectedLines.filter((line) => { - return props.filteredNominalVoltages.some((nv) => { - return ( - nv === - props.mapEquipments.getVoltageLevel( - line.voltageLevelId1 - ).nominalV || - nv === - props.mapEquipments.getVoltageLevel( - line.voltageLevelId2 - ).nominalV - ); - }); - }); - }, [ - props.mapEquipments, - mapEquipmentsLines, - props.geoData, - props.filteredNominalVoltages, - ]); - - const getSelectedSubstations = useCallback(() => { - const substations = getSubstationsInPolygon( - getPolygonFeatures(), - props.mapEquipments, - props.geoData - ); - return ( - substations.filter((substation) => { - return substation.voltageLevels.some((vl) => - props.filteredNominalVoltages.includes(vl.nominalV) - ); - }) ?? [] - ); - }, [props.mapEquipments, props.geoData, props.filteredNominalVoltages]); - - useImperativeHandle( - ref, - () => ({ - getSelectedSubstations, - getSelectedLines, - cleanDraw() { - //because deleteAll does not trigger a update of the polygonFeature callback - getMapDrawer()?.deleteAll(); - onPolygonChanged(getPolygonFeatures()); - onDrawEvent(DRAW_EVENT.DELETE); - }, - getMapDrawer, - }), - [ - onPolygonChanged, - getSelectedSubstations, - getSelectedLines, - onDrawEvent, - ] - ); - - const onDelete = useCallback(() => { - onPolygonChanged(getPolygonFeatures()); - onDrawEvent(DRAW_EVENT.DELETE); - }, [onPolygonChanged, onDrawEvent]); - - return ( - mapLib && ( - setDragging(true)} - onDragEnd={() => setDragging(false)} - onContextMenu={onMapContextMenu} - > - {props.displayOverlayLoader && renderOverlay()} - {props.isManualRefreshBackdropDisplayed && ( - - - - )} - { - onClickHandler( - info, - event.srcEvent, - props.mapEquipments - ); - }} - onAfterRender={onAfterRender} // TODO simplify this - layers={layers} - pickingRadius={PICKING_RADIUS} - /> - {showTooltip && renderTooltip()} - {/* visualizePitch true makes the compass reset the pitch when clicked in addition to visualizing it */} - - { - props.onDrawPolygonModeActive(polygon_draw); - }} - onCreate={onCreate} - onUpdate={onUpdate} - onDelete={onDelete} - /> - - ) - ); -}); - -NetworkMap.defaultProps = { - areFlowsValid: true, - arrowsZoomThreshold: 7, - centerOnSubstation: null, - disabled: false, - displayOverlayLoader: false, - filteredNominalVoltages: null, - geoData: null, - initialPosition: [0, 0], - initialZoom: 5, - isManualRefreshBackdropDisplayed: false, - labelsZoomThreshold: 9, - lineFlowAlertThreshold: 100, - lineFlowColorMode: LineFlowColorMode.NOMINAL_VOLTAGE, - lineFlowHidden: true, - lineFlowMode: LineFlowMode.FEEDERS, - lineFullPath: true, - lineParallelPath: true, - mapBoxToken: null, - mapEquipments: null, - mapLibrary: CARTO, - tooltipZoomThreshold: 7, - mapTheme: DARK, - updatedLines: [], - useName: true, - visible: true, - shouldDisableToolTip: false, - - onSubstationClick: () => {}, - onSubstationClickChooseVoltageLevel: () => {}, - onSubstationMenuClick: () => {}, - onVoltageLevelMenuClick: () => {}, - onLineMenuClick: () => {}, - onTieLineMenuClick: () => {}, - onHvdcLineMenuClick: () => {}, - onManualRefreshClick: () => {}, - renderPopover: (eId) => { - return eId; - }, - onDrawPolygonModeActive: () => {}, - onPolygonChanged: () => {}, - onDrawEvent: () => {}, -}; - -NetworkMap.propTypes = { - disabled: PropTypes.bool, - geoData: PropTypes.instanceOf(GeoData), - mapBoxToken: PropTypes.string, - mapEquipments: PropTypes.instanceOf(MapEquipments), - mapLibrary: PropTypes.oneOf([CARTO, CARTO_NOLABEL, MAPBOX]), - mapTheme: PropTypes.oneOf([LIGHT, DARK]), - - areFlowsValid: PropTypes.bool, - arrowsZoomThreshold: PropTypes.number, - centerOnSubstation: PropTypes.any, - displayOverlayLoader: PropTypes.bool, - filteredNominalVoltages: PropTypes.array, - initialPosition: PropTypes.arrayOf(PropTypes.number), - initialZoom: PropTypes.number, - isManualRefreshBackdropDisplayed: PropTypes.bool, - labelsZoomThreshold: PropTypes.number, - lineFlowAlertThreshold: PropTypes.number, - lineFlowColorMode: PropTypes.oneOf(Object.values(LineFlowColorMode)), - lineFlowHidden: PropTypes.bool, - lineFlowMode: PropTypes.oneOf(Object.values(LineFlowMode)), - lineFullPath: PropTypes.bool, - lineParallelPath: PropTypes.bool, - renderPopover: PropTypes.func, - tooltipZoomThreshold: PropTypes.number, - // With mapboxgl v2 (not a problem with maplibre), we need to call - // map.resize() when the parent size has changed, otherwise the map is not - // redrawn. It seems like this is autodetected when the browser window is - // resized, but not for programmatic resizes of the parent. For now in our - // app, only study display mode resizes programmatically - // use this prop to make the map resize when needed, each time this prop changes, map.resize() is trigged - triggerMapResizeOnChange: PropTypes.any, - updatedLines: PropTypes.array, - useName: PropTypes.bool, - visible: PropTypes.bool, - shouldDisableToolTip: PropTypes.bool, - - onHvdcLineMenuClick: PropTypes.func, - onLineMenuClick: PropTypes.func, - onTieLineMenuClick: PropTypes.func, - onManualRefreshClick: PropTypes.func, - onSubstationClick: PropTypes.func, - onSubstationClickChooseVoltageLevel: PropTypes.func, - onSubstationMenuClick: PropTypes.func, - onVoltageLevelMenuClick: PropTypes.func, - onDrawPolygonModeActive: PropTypes.func, - onPolygonChanged: PropTypes.func, - onDrawEvent: PropTypes.func, -}; - -export default React.memo(NetworkMap); - -function getSubstationsInPolygon(features, mapEquipments, geoData) { - const polygonCoordinates = features?.geometry; - if (!polygonCoordinates || polygonCoordinates.coordinates < 3) { - return []; - } - //get the list of substation - const substationsList = mapEquipments?.substations ?? []; - //for each substation, check if it is in the polygon - return substationsList // keep only the sybstation in the polygon - .filter((substation) => { - const pos = geoData.getSubstationPosition(substation.id); - return booleanPointInPolygon(pos, polygonCoordinates); - }); -} - -function getSelectedLinesInPolygon( - network, - lines, - geoData, - polygonCoordinates -) { - return lines.filter((line) => { - try { - const linePos = geoData.getLinePositions(network, line); - if (!linePos) { - return false; - } - if (linePos.length < 2) { - return false; - } - const extremities = [linePos[0], linePos[linePos.length - 1]]; - return extremities.some((pos) => - booleanPointInPolygon(pos, polygonCoordinates) - ); - } catch (error) { - console.error(error); - return false; - } - }); -} diff --git a/src/components/network-map-viewer/network/network-map.tsx b/src/components/network-map-viewer/network/network-map.tsx new file mode 100644 index 00000000..89befe66 --- /dev/null +++ b/src/components/network-map-viewer/network/network-map.tsx @@ -0,0 +1,915 @@ +/** + * Copyright (c) 2020, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React, { + forwardRef, + useCallback, + useEffect, + useImperativeHandle, + useMemo, + useRef, + useState, +} from 'react'; + +import { Box, decomposeColor } from '@mui/system'; +import LoaderWithOverlay from '../utils/loader-with-overlay'; + +import { MapboxOverlay, MapboxOverlayProps } from '@deck.gl/mapbox'; +import { Replay } from '@mui/icons-material'; +import { Button, useTheme } from '@mui/material'; +import { FormattedMessage } from 'react-intl'; +import { + Map, + NavigationControl, + ViewState, + ViewStateChangeEvent, + useControl, + useMap, +} from 'react-map-gl/maplibre'; +import { getNominalVoltageColor } from '../../../utils/colors'; +import { useNameOrId } from '../utils/equipmentInfosHandler'; +import DrawControl, { DRAW_MODES, getMapDrawer } from './draw-control'; +import { GeoData } from './geo-data'; +import { LineFlowColorMode, LineFlowMode, LineLayer } from './line-layer'; +import { MapEquipments } from './map-equipments'; +import { SubstationLayer } from './substation-layer'; + +import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css'; +import booleanPointInPolygon from '@turf/boolean-point-in-polygon'; +import { PickingInfo } from 'deck.gl'; +import { Feature, Polygon } from 'geojson'; +// import 'mapbox-gl/dist/mapbox-gl.css'; +import 'maplibre-gl/dist/maplibre-gl.css'; +import { + EQUIPMENT_TYPES, + EquimentLine, + HvdcLine, + HvdcLineEquimentLine, + Line, + LineEquimentLine, + Substation, + TieLine, + TieLineEquimentLine, + VoltageLevel, +} from '../utils/equipment-types'; + +// MouseEvent.button https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button +const MOUSE_EVENT_BUTTON_LEFT = 0; +const MOUSE_EVENT_BUTTON_RIGHT = 2; + +/** + * Represents the draw event types for the network map. + * when a draw event is triggered, the event type is passed to the onDrawEvent callback + * On create, when the user create a new polygon (shape finished) + */ +export const DRAW_EVENT = { + CREATE: 1, + UPDATE: 2, + DELETE: 0, +}; + +// Small boilerplate recommended by deckgl, to bridge to a react-map-gl control declaratively +// see https://deck.gl/docs/api-reference/mapbox/mapbox-overlay#using-with-react-map-gl +const DeckGLOverlay = React.forwardRef( + (props, ref) => { + const overlay = useControl(() => new MapboxOverlay(props)); + overlay.setProps(props); + useImperativeHandle(ref, () => overlay, [overlay]); + return null; + } +); + +const PICKING_RADIUS = 5; + +const CARTO = 'carto'; +const CARTO_NOLABEL = 'cartonolabel'; +const MAPBOX = 'mapbox'; +type MapLibrary = typeof CARTO | typeof CARTO_NOLABEL | typeof MAPBOX; + +const LIGHT = 'light'; +const DARK = 'dark'; +type MapTheme = typeof LIGHT | typeof DARK; + +const styles = { + mapManualRefreshBackdrop: { + width: '100%', + height: '100%', + textAlign: 'center', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: 'grey', + opacity: '0.8', + zIndex: 99, + fontSize: 30, + }, +}; + +const FALLBACK_MAPBOX_TOKEN = + 'pk.eyJ1IjoiZ2VvZmphbWciLCJhIjoiY2pwbnRwcm8wMDYzMDQ4b2pieXd0bDMxNSJ9.Q4aL20nBo5CzGkrWtxroug'; + +const SUBSTATION_LAYER_PREFIX = 'substationLayer'; +const LINE_LAYER_PREFIX = 'lineLayer'; +const LABEL_SIZE = 12; + +type Centered = { + lastCenteredSubstation: string | null; + centeredSubstationId?: string | null; + centered: boolean; +}; + +const INITIAL_CENTERED = { + lastCenteredSubstation: null, + centeredSubstationId: null, + centered: false, +} satisfies Centered; + +// get polygon coordinates (features) or an empty object +function getPolygonFeatures(): Partial { + return getMapDrawer()?.getAll()?.features[0] ?? {}; +} +type NetworkMapProps = { + disabled: boolean; + geoData: GeoData; + mapBoxToken: string; + mapEquipments: MapEquipments; + mapLibrary: 'carto' | 'cartonolabel' | 'mapbox'; + mapTheme: 'light' | 'dark'; + + areFlowsValid: boolean; + arrowsZoomThreshold: number; + centerOnSubstation: any; + displayOverlayLoader: boolean; + filteredNominalVoltages: number[] | null; + initialPosition: number[]; + initialZoom: number; + isManualRefreshBackdropDisplayed: boolean; + labelsZoomThreshold: number; + lineFlowAlertThreshold: number; + lineFlowColorMode: 'nominalVoltage' | 'overloads'; + lineFlowHidden: boolean; + lineFlowMode: 'staticArrows' | 'animatedArrows' | 'feeders'; + lineFullPath: boolean; + lineParallelPath: boolean; + renderPopover: (eId: any) => any; + tooltipZoomThreshold: number; + // With mapboxgl v2 (not a problem with maplibre), we need to call + // map.resize() when the parent size has changed, otherwise the map is not + // redrawn. It seems like this is autodetected when the browser window is + // resized, but not for programmatic resizes of the parent. For now in our + // app, only study display mode resizes programmatically + // use this prop to make the map resize when needed, each time this prop changes, map.resize() is trigged + triggerMapResizeOnChange: any; + updatedLines: any[]; + useName: boolean; + visible: boolean; + shouldDisableToolTip: boolean; + + onHvdcLineMenuClick: (hvdcLine: HvdcLine, x: number, y: number) => void; + onLineMenuClick: (line: Line, x: number, y: number) => void; + onTieLineMenuClick: (tieLine: TieLine, x: number, y: number) => void; + onManualRefreshClick: () => void; + onSubstationClick: (voltageLevelId: any) => void; + onSubstationClickChooseVoltageLevel: ( + substationId: any, + x: number, + y: number + ) => void; + onSubstationMenuClick: ( + substation: Substation, + x: number, + y: number + ) => void; + onVoltageLevelMenuClick: ( + voltageLevel: VoltageLevel, + x: number, + y: number + ) => void; + onDrawPolygonModeActive: (polygon_draw: boolean) => void; + onPolygonChanged: (polygonFeatures: any) => void; + onDrawEvent: (drawEvent: number) => void; +}; + +export type NetworkMapRef = { + getSelectedSubstations: () => any; + getSelectedLines: () => any; + cleanDraw: () => any; + getMapDrawer: () => any; +}; + +const NetworkMap = forwardRef>( + ( + { + areFlowsValid = true, + arrowsZoomThreshold = 7, + centerOnSubstation = null, + disabled = false, + displayOverlayLoader = false, + filteredNominalVoltages = null, + geoData = null, + initialPosition = [0, 0], + initialZoom = 5, + isManualRefreshBackdropDisplayed = false, + labelsZoomThreshold = 9, + lineFlowAlertThreshold = 100, + lineFlowColorMode = LineFlowColorMode.NOMINAL_VOLTAGE, + // lineFlowHidden = true, + lineFlowMode = LineFlowMode.FEEDERS, + lineFullPath = true, + lineParallelPath = true, + mapBoxToken = null, + mapEquipments = null, + mapLibrary = CARTO, + tooltipZoomThreshold = 7, + mapTheme = DARK, + triggerMapResizeOnChange = false, + updatedLines = [], + useName = true, + visible = true, + shouldDisableToolTip = false, + + onSubstationClick = () => {}, + onSubstationClickChooseVoltageLevel = () => {}, + onSubstationMenuClick = () => {}, + onVoltageLevelMenuClick = () => {}, + onLineMenuClick = () => {}, + onTieLineMenuClick = () => {}, + onHvdcLineMenuClick = () => {}, + onManualRefreshClick = () => {}, + renderPopover = (eId) => { + return eId; + }, + onDrawPolygonModeActive = (_drawMode: DRAW_MODES) => {}, + onPolygonChanged = () => {}, + onDrawEvent = () => {}, + }, + ref + ) => { + const [labelsVisible, setLabelsVisible] = useState(false); + const [showLineFlow, setShowLineFlow] = useState(true); + const [showTooltip, setShowTooltip] = useState(true); + const mapRef = useMap(); + const deckRef = useRef(null); + const [centered, setCentered] = useState(INITIAL_CENTERED); + const lastViewStateRef = useRef(); + const [tooltip, setTooltip] = useState({}); + const theme = useTheme(); + const foregroundNeutralColor = useMemo(() => { + const labelColor = decomposeColor(theme.palette.text.primary) + .values as [number, number, number, number]; + labelColor[3] *= 255; + return labelColor; + }, [theme]); + const [cursorType, setCursorType] = useState('grab'); + const [isDragging, setDragging] = useState(false); + + //NOTE these constants are moved to the component's parameters list + //const currentNode = useSelector((state) => state.currentTreeNode); + // const { + // onPolygonChanged, + // centerOnSubstation, + // onDrawEvent, + // shouldDisableToolTip, + // } = props; + + const { getNameOrId } = useNameOrId(useName); + + const readyToDisplay = + mapEquipments !== null && geoData !== null && !disabled; + + const readyToDisplaySubstations = + readyToDisplay && + mapEquipments.substations && + geoData.substationPositionsById.size > 0; + + const readyToDisplayLines = + readyToDisplay && + (mapEquipments?.lines || + mapEquipments?.hvdcLines || + mapEquipments?.tieLines) && + mapEquipments.voltageLevels && + geoData.substationPositionsById.size > 0; + + const mapEquipmentsLines = useMemo(() => { + return [ + ...(mapEquipments?.lines.map( + (line) => + ({ + ...line, + equipmentType: EQUIPMENT_TYPES.LINE, + } as LineEquimentLine) + ) ?? []), + ...(mapEquipments?.tieLines.map( + (tieLine) => + ({ + ...tieLine, + equipmentType: EQUIPMENT_TYPES.TIE_LINE, + } as TieLineEquimentLine) + ) ?? []), + ...(mapEquipments?.hvdcLines.map( + (hvdcLine) => + ({ + ...hvdcLine, + equipmentType: EQUIPMENT_TYPES.HVDC_LINE, + } as HvdcLineEquimentLine) + ) ?? []), + ]; + }, [ + mapEquipments?.hvdcLines, + mapEquipments?.tieLines, + mapEquipments?.lines, + ]) as EquimentLine[]; + + const divRef = useRef(); + + const mToken = !mapBoxToken ? FALLBACK_MAPBOX_TOKEN : mapBoxToken; + + useEffect(() => { + if (centerOnSubstation === null) { + return; + } + setCentered({ + lastCenteredSubstation: null, + centeredSubstationId: centerOnSubstation?.to, + centered: true, + }); + }, [centerOnSubstation]); + + const mapLib = useMap(); + + // TODO simplify this, now we use Map as the camera controlling component + // so we don't need the deckgl ref anymore. The following comments are + // probably outdated, cleanup everything: + // Do this in onAfterRender because when doing it in useEffect (triggered by calling setDeck()), + // it doesn't work in the case of using the browser backward/forward buttons (because in this particular case, + // we get the ref to the deck and it has not yet initialized..) + function onAfterRender() { + // TODO outdated comment + //use centered and deck to execute this block only once when the data is ready and deckgl is initialized + //TODO, replace the next lines with setProps( { initialViewState } ) when we upgrade to 8.1.0 + //see https://github.com/uber/deck.gl/pull/4038 + //This is a hack because it accesses the properties of deck directly but for now it works + if ( + (!centered.centered || + (centered.centeredSubstationId && + centered.centeredSubstationId !== + centered.lastCenteredSubstation)) && + geoData !== null + ) { + if (geoData.substationPositionsById.size > 0) { + if (centered.centeredSubstationId) { + const geodata = geoData.substationPositionsById.get( + centered.centeredSubstationId + ); + if (!geodata) { + return; + } // can't center on substation if no coordinate. + mapLib.current?.flyTo({ + center: [geodata.lon, geodata.lat], + duration: 2000, + }); + setCentered({ + lastCenteredSubstation: + centered.centeredSubstationId, + centeredSubstationId: centered.centeredSubstationId, + centered: true, + }); + } else { + const coords = Array.from( + geoData.substationPositionsById.entries() + ).map((x) => x[1]); + const maxlon = Math.max.apply( + null, + coords.map((x) => x.lon) + ); + const minlon = Math.min.apply( + null, + coords.map((x) => x.lon) + ); + const maxlat = Math.max.apply( + null, + coords.map((x) => x.lat) + ); + const minlat = Math.min.apply( + null, + coords.map((x) => x.lat) + ); + const marginlon = (maxlon - minlon) / 10; + const marginlat = (maxlat - minlat) / 10; + mapLib.current?.fitBounds( + [ + [ + minlon - marginlon / 2, + minlat - marginlat / 2, + ], + [ + maxlon + marginlon / 2, + maxlat + marginlat / 2, + ], + ], + { animate: false } + ); + setCentered({ + lastCenteredSubstation: null, + centered: true, + }); + } + } + } + } + + function onViewStateChange(info: ViewStateChangeEvent) { + lastViewStateRef.current = info.viewState; + if ( + !info.interactionState || // first event of before an animation (e.g. clicking the +/- buttons of the navigation controls, gives the target + (info.interactionState && !info.interactionState.inTransition) // Any event not part of a animation (mouse panning or zooming) + ) { + if ( + info.viewState.zoom >= labelsZoomThreshold && + !labelsVisible + ) { + setLabelsVisible(true); + } else if ( + info.viewState.zoom < labelsZoomThreshold && + labelsVisible + ) { + setLabelsVisible(false); + } + setShowTooltip(info.viewState.zoom >= tooltipZoomThreshold); + setShowLineFlow(info.viewState.zoom >= arrowsZoomThreshold); + } + } + + function renderTooltip() { + return ( + tooltip && + tooltip.visible && + !shouldDisableToolTip && + //As of now only LINE tooltip is implemented, the following condition is to be removed or tweaked once other types of line tooltip are implemented + tooltip.equipmentType === EQUIPMENT_TYPES.LINE && ( +
+ {renderPopover(tooltip.equipmentId, divRef.current)} +
+ ) + ); + } + + function onClickHandler( + info: PickingInfo, + event: mapboxgl.MapLayerMouseEvent, + network: MapEquipments + ) { + const leftButton = + event.originalEvent.button === MOUSE_EVENT_BUTTON_LEFT; + const rightButton = + event.originalEvent.button === MOUSE_EVENT_BUTTON_RIGHT; + if ( + info.layer && + info.layer.id.startsWith(SUBSTATION_LAYER_PREFIX) && + info.object && + (info.object.substationId || info.object.voltageLevels) // is a voltage level marker, or a substation text + ) { + let idVl; + let idSubstation; + if (info.object.substationId) { + idVl = info.object.id; + } else if (info.object.voltageLevels) { + if (info.object.voltageLevels.length === 1) { + const idS = info.object.voltageLevels[0].substationId; + const substation = network.getSubstation(idS); + if (substation && substation.voltageLevels.length > 1) { + idSubstation = idS; + } else { + idVl = info.object.voltageLevels[0].id; + } + } else { + idSubstation = + info.object.voltageLevels[0].substationId; + } + } + if (idVl !== undefined) { + if (onSubstationClick && leftButton) { + onSubstationClick(idVl); + } else if (onVoltageLevelMenuClick && rightButton) { + onVoltageLevelMenuClick( + network.getVoltageLevel(idVl), + event.originalEvent.x, + event.originalEvent.y + ); + } + } + if (idSubstation !== undefined) { + if (onSubstationClickChooseVoltageLevel && leftButton) { + onSubstationClickChooseVoltageLevel( + idSubstation, + event.originalEvent.x, + event.originalEvent.y + ); + } else if (onSubstationMenuClick && rightButton) { + onSubstationMenuClick( + network.getSubstation(idSubstation), + event.originalEvent.x, + event.originalEvent.y + ); + } + } + } + if ( + rightButton && + info.layer && + info.layer.id.startsWith(LINE_LAYER_PREFIX) && + info.object && + info.object.id && + info.object.voltageLevelId1 && + info.object.voltageLevelId2 + ) { + // picked line properties are retrieved from network data and not from pickable object infos, + // because pickable object infos might not be up to date + const line = network.getLine(info.object.id); + const tieLine = network.getTieLine(info.object.id); + const hvdcLine = network.getHvdcLine(info.object.id); + + const equipment = line || tieLine || hvdcLine; + if (equipment) { + const menuClickFunction = + equipment === line + ? onLineMenuClick + : equipment === tieLine + ? onTieLineMenuClick + : onHvdcLineMenuClick; + + menuClickFunction( + equipment, + event.originalEvent.x, + event.originalEvent.y + ); + } + } + } + + function onMapContextMenu(event: mapboxgl.MapLayerMouseEvent) { + const info = + deckRef.current && + deckRef.current.pickObject({ + x: event.point.x, + y: event.point.y, + radius: PICKING_RADIUS, + }); + info && onClickHandler(info, event, mapEquipments); + } + + function cursorHandler() { + return isDragging ? 'grabbing' : cursorType; + } + + const layers = []; + + if (readyToDisplaySubstations) { + layers.push( + new SubstationLayer({ + id: SUBSTATION_LAYER_PREFIX, + data: mapEquipments?.substations, + network: mapEquipments, + geoData: geoData, + getNominalVoltageColor: getNominalVoltageColor, + filteredNominalVoltages: filteredNominalVoltages, + labelsVisible: labelsVisible, + labelColor: foregroundNeutralColor, + labelSize: LABEL_SIZE, + pickable: true, + onHover: ({ object }) => { + setCursorType(object ? 'pointer' : 'grab'); + }, + getNameOrId: getNameOrId, + }) + ); + } + + if (readyToDisplayLines) { + layers.push( + new LineLayer({ + areFlowsValid: areFlowsValid, + id: LINE_LAYER_PREFIX, + data: mapEquipmentsLines, + network: mapEquipments, + updatedLines: updatedLines, + geoData: geoData, + getNominalVoltageColor: getNominalVoltageColor, + disconnectedLineColor: foregroundNeutralColor, + filteredNominalVoltages: filteredNominalVoltages, + lineFlowMode: lineFlowMode, + showLineFlow: visible && showLineFlow, + lineFlowColorMode: lineFlowColorMode, + lineFlowAlertThreshold: lineFlowAlertThreshold, + lineFullPath: + geoData.linePositionsById.size > 0 && lineFullPath, + lineParallelPath: lineParallelPath, + labelsVisible: labelsVisible, + labelColor: foregroundNeutralColor, + labelSize: LABEL_SIZE, + pickable: true, + onHover: ({ object, x, y }) => { + if (object) { + setCursorType('pointer'); + const lineObject = object?.line ?? object; + setTooltip({ + equipmentId: lineObject?.id, + equipmentType: lineObject?.equipmentType, + pointerX: x, + pointerY: y, + visible: showTooltip, + }); + } else { + setCursorType('grab'); + setTooltip(null); + } + }, + }) + ); + } + + const initialViewState = { + longitude: initialPosition[0], + latitude: initialPosition[1], + zoom: initialZoom, + maxZoom: 14, + pitch: 0, + bearing: 0, + }; + + const renderOverlay = () => ( + + ); + + useEffect(() => { + mapRef.current?.resize(); + }, [triggerMapResizeOnChange]); + + const getMapStyle = (mapLibrary: MapLibrary, mapTheme: MapTheme) => { + switch (mapLibrary) { + case MAPBOX: + if (mapTheme === LIGHT) { + return 'mapbox://styles/mapbox/light-v9'; + } else { + return 'mapbox://styles/mapbox/dark-v9'; + } + case CARTO: + if (mapTheme === LIGHT) { + return 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json'; + } else { + return 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json'; + } + case CARTO_NOLABEL: + if (mapTheme === LIGHT) { + return 'https://basemaps.cartocdn.com/gl/positron-nolabels-gl-style/style.json'; + } else { + return 'https://basemaps.cartocdn.com/gl/dark-matter-nolabels-gl-style/style.json'; + } + default: + return 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json'; + } + }; + + const mapStyle = useMemo( + () => getMapStyle(mapLibrary, mapTheme), + [mapLibrary, mapTheme] + ); + + const mapboxAccessToken = mToken; + + const key = mapLibrary === MAPBOX && mToken ? 'mapboxgl' : 'maplibregl'; + + // because the mapLib prop of react-map-gl is not reactive, we need to + // unmount/mount the Map with 'key', so we need also to reset all state + // associated with uncontrolled state of the map + useEffect(() => { + setCentered(INITIAL_CENTERED); + }, [key]); + + const onUpdate = useCallback(() => { + onPolygonChanged(getPolygonFeatures()); + onDrawEvent(DRAW_EVENT.UPDATE); + }, [onDrawEvent, onPolygonChanged]); + + const onCreate = useCallback(() => { + onPolygonChanged(getPolygonFeatures()); + onDrawEvent(DRAW_EVENT.CREATE); + }, [onDrawEvent, onPolygonChanged]); + const getSelectedLines = useCallback(() => { + const polygonFeatures = getPolygonFeatures(); + const polygonCoordinates = polygonFeatures?.geometry; + if ( + !polygonCoordinates || + 'geometries' in polygonCoordinates || + polygonCoordinates.coordinates.length < 3 + ) { + return []; + } + //for each line, check if it is in the polygon + const selectedLines = getSelectedLinesInPolygon( + mapEquipments, + mapEquipmentsLines, + geoData, + polygonCoordinates + ); + return selectedLines.filter((line) => { + return filteredNominalVoltages!.some((nv) => { + return ( + nv === + mapEquipments!.getVoltageLevel( + line.voltageLevelId1 + )!.nominalV || + nv === + mapEquipments!.getVoltageLevel( + line.voltageLevelId2 + )!.nominalV + ); + }); + }); + }, [ + mapEquipments, + mapEquipmentsLines, + geoData, + filteredNominalVoltages, + ]); + + const getSelectedSubstations = useCallback(() => { + const substations = getSubstationsInPolygon( + getPolygonFeatures(), + mapEquipments, + geoData + ); + if (filteredNominalVoltages === null) { + return substations; + } + return ( + substations.filter((substation) => { + return substation.voltageLevels.some((vl) => + filteredNominalVoltages.includes(vl.nominalV) + ); + }) ?? [] + ); + }, [mapEquipments, geoData, filteredNominalVoltages]); + + useImperativeHandle( + ref, + () => ({ + getSelectedSubstations, + getSelectedLines, + cleanDraw() { + //because deleteAll does not trigger a update of the polygonFeature callback + getMapDrawer()?.deleteAll(); + onPolygonChanged(getPolygonFeatures()); + onDrawEvent(DRAW_EVENT.DELETE); + }, + getMapDrawer, + }), + [ + onPolygonChanged, + getSelectedSubstations, + getSelectedLines, + onDrawEvent, + ] + ); + + const onDelete = useCallback(() => { + onPolygonChanged(getPolygonFeatures()); + onDrawEvent(DRAW_EVENT.DELETE); + }, [onPolygonChanged, onDrawEvent]); + + return ( + setDragging(true)} + onDragEnd={() => setDragging(false)} + onContextMenu={onMapContextMenu} + > + {displayOverlayLoader && renderOverlay()} + {isManualRefreshBackdropDisplayed && ( + + + + )} + { + onClickHandler(info, event.srcEvent, mapEquipments); + }} + onAfterRender={onAfterRender} // TODO simplify this + layers={layers} + pickingRadius={PICKING_RADIUS} + /> + {showTooltip && renderTooltip()} + {/* visualizePitch true makes the compass reset the pitch when clicked in addition to visualizing it */} + + { + onDrawPolygonModeActive(polygon_draw); + }} + onCreate={onCreate} + onUpdate={onUpdate} + onDelete={onDelete} + /> + + ); + } +); + +export default React.memo(NetworkMap); + +function getSubstationsInPolygon( + features: Partial, // Feature from geojson + mapEquipments: MapEquipments | null, + geoData: GeoData | null +) { + const polygonCoordinates = features?.geometry; + if ( + !geoData || + !polygonCoordinates || + polygonCoordinates.type !== 'Polygon' || + polygonCoordinates.coordinates.length < 3 + ) { + return []; + } + //get the list of substation + const substationsList = mapEquipments?.substations ?? []; + //for each substation, check if it is in the polygon + return substationsList // keep only the sybstation in the polygon + .filter((substation) => { + const pos = geoData.getSubstationPosition(substation.id); + return booleanPointInPolygon(pos, polygonCoordinates); + }); +} + +function getSelectedLinesInPolygon( + network: MapEquipments | null, + lines: Line[], + geoData: GeoData | null, + polygonCoordinates: Polygon +) { + return lines.filter((line) => { + try { + const linePos = network + ? geoData?.getLinePositions(network, line) + : null; + if (!linePos) { + return false; + } + if (linePos.length < 2) { + return false; + } + const extremities = [linePos[0], linePos[linePos.length - 1]]; + return extremities.some((pos) => + booleanPointInPolygon(pos, polygonCoordinates) + ); + } catch (error) { + console.error(error); + return false; + } + }); +} diff --git a/src/components/network-map-viewer/network/substation-layer.js b/src/components/network-map-viewer/network/substation-layer.ts similarity index 69% rename from src/components/network-map-viewer/network/substation-layer.js rename to src/components/network-map-viewer/network/substation-layer.ts index f83aaab2..e85c0b82 100644 --- a/src/components/network-map-viewer/network/substation-layer.js +++ b/src/components/network-map-viewer/network/substation-layer.ts @@ -5,16 +5,30 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CompositeLayer, TextLayer } from 'deck.gl'; +import { DefaultProps } from '@deck.gl/core'; +import { + Color, + CompositeLayer, + LayerContext, + TextLayer, + UpdateParameters, +} from 'deck.gl'; import ScatterplotLayerExt from './layers/scatterplot-layer-ext'; +import { Substation, VoltageLevel } from '../utils/equipment-types'; import { SUBSTATION_RADIUS, SUBSTATION_RADIUS_MAX_PIXEL, SUBSTATION_RADIUS_MIN_PIXEL, } from './constants'; - -const voltageLevelNominalVoltageIndexer = (map, voltageLevel) => { +import { GeoData } from './geo-data'; +import { CompositeData } from './line-layer'; +import { MapEquipments } from './map-equipments'; + +const voltageLevelNominalVoltageIndexer = ( + map: Map, + voltageLevel: VoltageLevel +) => { let list = map.get(voltageLevel.nominalV); if (!list) { list = []; @@ -24,9 +38,48 @@ const voltageLevelNominalVoltageIndexer = (map, voltageLevel) => { return map; }; -export class SubstationLayer extends CompositeLayer { - initializeState() { - super.initializeState(); +type MetaVoltageLevel = { + nominalVoltageIndex: number; + voltageLevels: VoltageLevel[]; +}; + +type MetaVoltageLevelsByNominalVoltage = { + nominalV: number; + metaVoltageLevels: MetaVoltageLevel[]; +}; + +export type SubstationLayerProps = { + data: Substation[]; + network: MapEquipments; + geoData: GeoData; + getNominalVoltageColor: (nominalV: number) => Color; + filteredNominalVoltages: number[] | null; + labelsVisible: boolean; + labelColor: Color; + labelSize: number; + getNameOrId: (infos: Substation) => string | null; +}; + +const defaultProps: DefaultProps = { + getNominalVoltageColor: { type: 'function', value: () => [255, 255, 255] }, + filteredNominalVoltages: null, + labelsVisible: false, + labelColor: { type: 'color', value: [255, 255, 255] }, + labelSize: 12, +}; + +export class SubstationLayer extends CompositeLayer { + static layerName = 'SubstationLayer'; + static defaultProps = defaultProps; + + declare state: { + compositeData: CompositeData[]; + metaVoltageLevelsByNominalVoltage?: MetaVoltageLevelsByNominalVoltage[]; + substationsLabels: Substation[]; + }; + + initializeState(context: LayerContext) { + super.initializeState(context); this.state = { compositeData: [], @@ -34,16 +87,23 @@ export class SubstationLayer extends CompositeLayer { }; } - updateState({ props, oldProps, changeFlags }) { + updateState({ + props: { data, filteredNominalVoltages, geoData, getNameOrId, network }, + oldProps, + changeFlags, + }: UpdateParameters) { if (changeFlags.dataChanged) { - let metaVoltageLevelsByNominalVoltage = new Map(); + const metaVoltageLevelsByNominalVoltage = new Map< + number, + MetaVoltageLevel[] + >(); - if (props.network != null && props.geoData != null) { + if (network != null && geoData != null) { // create meta voltage levels // a meta voltage level is made of: // - a list of voltage level that belong to same substation and with same nominal voltage // - index of the voltage levels nominal voltage in the substation nominal voltage list - props.data.forEach((substation) => { + data.forEach((substation) => { // index voltage levels of this substation by its nominal voltage (this is because we might // have several voltage levels with the same nominal voltage in the same substation) const voltageLevelsByNominalVoltage = @@ -66,10 +126,7 @@ export class SubstationLayer extends CompositeLayer { // add to global map of meta voltage levels indexed by nominal voltage Array.from(voltageLevelsByNominalVoltage.entries()).forEach( - (e) => { - const nominalV = e[0]; - const voltageLevels = e[1]; - + ([nominalV, voltageLevels]) => { let metaVoltageLevels = metaVoltageLevelsByNominalVoltage.get(nominalV); if (!metaVoltageLevels) { @@ -106,22 +163,22 @@ export class SubstationLayer extends CompositeLayer { if ( changeFlags.dataChanged || - props.getNameOrId !== oldProps.getNameOrId || - props.filteredNominalVoltages !== oldProps.filteredNominalVoltages + getNameOrId !== oldProps.getNameOrId || + filteredNominalVoltages !== oldProps.filteredNominalVoltages ) { - let substationsLabels = props.data; + let substationsLabels = data; if ( - props.network != null && - props.geoData != null && - props.filteredNominalVoltages != null + network != null && + geoData != null && + filteredNominalVoltages != null ) { // we construct the substations where there is at least one voltage level with a nominal voltage // present in the filteredVoltageLevels property, in order to handle correctly the substations labels visibility substationsLabels = substationsLabels.filter( (substation) => substation.voltageLevels.find((v) => - props.filteredNominalVoltages.includes(v.nominalV) + filteredNominalVoltages.includes(v.nominalV) ) !== undefined ); } @@ -134,21 +191,21 @@ export class SubstationLayer extends CompositeLayer { const layers = []; // substations : create one layer per nominal voltage, starting from higher to lower nominal voltage - this.state.metaVoltageLevelsByNominalVoltage.forEach((e) => { + this.state.metaVoltageLevelsByNominalVoltage?.forEach((e) => { const substationsLayer = new ScatterplotLayerExt( this.getSubLayerProps({ id: 'NominalVoltage' + e.nominalV, data: e.metaVoltageLevels, radiusMinPixels: SUBSTATION_RADIUS_MIN_PIXEL, - getRadiusMaxPixels: (metaVoltageLevel) => + getRadiusMaxPixels: (metaVoltageLevel: MetaVoltageLevel) => SUBSTATION_RADIUS_MAX_PIXEL * (metaVoltageLevel.nominalVoltageIndex + 1), - getPosition: (metaVoltageLevel) => + getPosition: (metaVoltageLevel: MetaVoltageLevel) => this.props.geoData.getSubstationPosition( metaVoltageLevel.voltageLevels[0].substationId ), getFillColor: this.props.getNominalVoltageColor(e.nominalV), - getRadius: (voltageLevel) => + getRadius: (voltageLevel: MetaVoltageLevel) => SUBSTATION_RADIUS * (voltageLevel.nominalVoltageIndex + 1), visible: @@ -156,8 +213,8 @@ export class SubstationLayer extends CompositeLayer { this.props.filteredNominalVoltages.includes(e.nominalV), updateTriggers: { getPosition: [ - this.props.geoData.substationPositionsById, - this.props.network.substations, + this.props?.geoData?.substationPositionsById, + this.props?.network?.substations, ], }, }) @@ -170,9 +227,10 @@ export class SubstationLayer extends CompositeLayer { this.getSubLayerProps({ id: 'Label', data: this.state.substationsLabels, - getPosition: (substation) => + getPosition: (substation: Substation) => this.props.geoData.getSubstationPosition(substation.id), - getText: (substation) => this.props.getNameOrId(substation), + getText: (substation: Substation) => + this.props.getNameOrId(substation), getColor: this.props.labelColor, fontFamily: 'Roboto', getSize: this.props.labelSize, @@ -195,15 +253,3 @@ export class SubstationLayer extends CompositeLayer { return layers; } } - -SubstationLayer.layerName = 'SubstationLayer'; - -SubstationLayer.defaultProps = { - network: null, - geoData: null, - getNominalVoltageColor: { type: 'accessor', value: [255, 255, 255] }, - filteredNominalVoltages: null, - labelsVisible: false, - labelColor: { type: 'color', value: [255, 255, 255] }, - labelSize: 12, -}; diff --git a/src/components/network-map-viewer/utils/equipment-types.js b/src/components/network-map-viewer/utils/equipment-types.js deleted file mode 100644 index 0bc25e77..00000000 --- a/src/components/network-map-viewer/utils/equipment-types.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2023, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -export const EQUIPMENT_INFOS_TYPES = { - LIST: { type: 'LIST' }, - MAP: { type: 'MAP' }, - FORM: { type: 'FORM' }, - TAB: { type: 'TAB' }, - TOOLTIP: { type: 'TOOLTIP' }, -}; - -export const EQUIPMENT_TYPES = { - SUBSTATION: 'SUBSTATION', - VOLTAGE_LEVEL: 'VOLTAGE_LEVEL', - LINE: 'LINE', - TWO_WINDINGS_TRANSFORMER: 'TWO_WINDINGS_TRANSFORMER', - THREE_WINDINGS_TRANSFORMER: 'THREE_WINDINGS_TRANSFORMER', - HVDC_LINE: 'HVDC_LINE', - GENERATOR: 'GENERATOR', - BATTERY: 'BATTERY', - LOAD: 'LOAD', - SHUNT_COMPENSATOR: 'SHUNT_COMPENSATOR', - TIE_LINE: 'TIE_LINE', - DANGLING_LINE: 'DANGLING_LINE', - STATIC_VAR_COMPENSATOR: 'STATIC_VAR_COMPENSATOR', - HVDC_CONVERTER_STATION: 'HVDC_CONVERTER_STATION', - VSC_CONVERTER_STATION: 'VSC_CONVERTER_STATION', - LCC_CONVERTER_STATION: 'LCC_CONVERTER_STATION', - SWITCH: 'SWITCH', -}; diff --git a/src/components/network-map-viewer/utils/equipment-types.ts b/src/components/network-map-viewer/utils/equipment-types.ts new file mode 100644 index 00000000..0bbce63c --- /dev/null +++ b/src/components/network-map-viewer/utils/equipment-types.ts @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2023, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { LineStatus } from '../network/line-layer'; + +export const EQUIPMENT_INFOS_TYPES = { + LIST: { type: 'LIST' }, + MAP: { type: 'MAP' }, + FORM: { type: 'FORM' }, + TAB: { type: 'TAB' }, + TOOLTIP: { type: 'TOOLTIP' }, +}; + +export enum EQUIPMENT_TYPES { + SUBSTATION = 'SUBSTATION', + VOLTAGE_LEVEL = 'VOLTAGE_LEVEL', + LINE = 'LINE', + TWO_WINDINGS_TRANSFORMER = 'TWO_WINDINGS_TRANSFORMER', + THREE_WINDINGS_TRANSFORMER = 'THREE_WINDINGS_TRANSFORMER', + HVDC_LINE = 'HVDC_LINE', + GENERATOR = 'GENERATOR', + BATTERY = 'BATTERY', + LOAD = 'LOAD', + SHUNT_COMPENSATOR = 'SHUNT_COMPENSATOR', + TIE_LINE = 'TIE_LINE', + DANGLING_LINE = 'DANGLING_LINE', + STATIC_VAR_COMPENSATOR = 'STATIC_VAR_COMPENSATOR', + HVDC_CONVERTER_STATION = 'HVDC_CONVERTER_STATION', + VSC_CONVERTER_STATION = 'VSC_CONVERTER_STATION', + LCC_CONVERTER_STATION = 'LCC_CONVERTER_STATION', + SWITCH = 'SWITCH', +} + +export type LonLat = [number, number]; + +export type VoltageLevel = { + id: string; + nominalV: number; + substationId: string; + substationName: string; +}; + +export type Substation = { + id: string; + name: string; + voltageLevels: VoltageLevel[]; +}; + +export type Line = { + id: string; + voltageLevelId1: string; + voltageLevelId2: string; + name: string; + terminal1Connected: boolean; + terminal2Connected: boolean; + p1: number; + p2: number; + i1: number | undefined; + i2: number | undefined; + operatingStatus: LineStatus; + currentLimits1: { + permanentLimit: number; + } | null; + currentLimits2: { + permanentLimit: number; + } | null; + // additionnal from line-layer + origin: LonLat | undefined; + end: LonLat | undefined; + substationIndexStart: number | undefined; + substationIndexEnd: number | undefined; + angle: number | undefined; + angleStart: number | undefined; + angleEnd: number | undefined; + proximityFactorStart: number | undefined; + proximityFactorEnd: number | undefined; + parallelIndex: number; + cumulativeDistances: number[]; + positions: LonLat[]; +}; + +export type TieLine = { + id: string; +}; + +export enum ConvertersMode { + SIDE_1_RECTIFIER_SIDE_2_INVERTER, + SIDE_1_INVERTER_SIDE_2_RECTIFIER, +} + +export type HvdcLine = { + id: string; + convertersMode: ConvertersMode; + r: number; + nominalV: number; + activePowerSetpoint: number; + maxP: number; +}; + +export type Equiment = Line | Substation | TieLine | HvdcLine; + +// type EquimentLineTypes = EQUIPMENT_TYPES.LINE | EQUIPMENT_TYPES.TIE_LINE | EQUIPMENT_TYPES.HVDC_LINE; +export type LineEquimentLine = Line & { equipmentType: EQUIPMENT_TYPES.LINE }; +export type TieLineEquimentLine = TieLine & { + equipmentType: EQUIPMENT_TYPES.TIE_LINE; +}; +export type HvdcLineEquimentLine = HvdcLine & { + equipmentType: EQUIPMENT_TYPES.HVDC_LINE; +}; +export type EquimentLine = + | LineEquimentLine + | TieLineEquimentLine + | HvdcLineEquimentLine; diff --git a/src/components/network-map-viewer/utils/equipmentInfosHandler.js b/src/components/network-map-viewer/utils/equipmentInfosHandler.ts similarity index 83% rename from src/components/network-map-viewer/utils/equipmentInfosHandler.js rename to src/components/network-map-viewer/utils/equipmentInfosHandler.ts index 29283c45..7debcbb9 100644 --- a/src/components/network-map-viewer/utils/equipmentInfosHandler.js +++ b/src/components/network-map-viewer/utils/equipmentInfosHandler.ts @@ -6,10 +6,11 @@ */ import { useCallback } from 'react'; +import { Substation } from './equipment-types'; -export const useNameOrId = (useName) => { +export const useNameOrId = (useName: boolean) => { const getNameOrId = useCallback( - (infos) => { + (infos: Substation) => { if (infos != null) { const name = infos.name; return useName && name != null && name.trim() !== '' diff --git a/src/components/network-map-viewer/utils/loader-with-overlay.jsx b/src/components/network-map-viewer/utils/loader-with-overlay.tsx similarity index 85% rename from src/components/network-map-viewer/utils/loader-with-overlay.jsx rename to src/components/network-map-viewer/utils/loader-with-overlay.tsx index 39a4ab8c..7909e7a4 100644 --- a/src/components/network-map-viewer/utils/loader-with-overlay.jsx +++ b/src/components/network-map-viewer/utils/loader-with-overlay.tsx @@ -5,10 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import React from 'react'; import { CircularProgress } from '@mui/material'; -import { FormattedMessage } from 'react-intl'; import { Box } from '@mui/system'; +import { FormattedMessage } from 'react-intl'; const styles = { overlay: { @@ -28,12 +27,19 @@ const styles = { }, }; +type LoaderWithOverlayProps = { + color: 'primary' | 'secondary' | 'inherit'; + loaderSize: number; + loadingMessageText: string; + isFixed: boolean; +}; + const LoaderWithOverlay = ({ color, loaderSize, loadingMessageText, isFixed, -}) => { +}: LoaderWithOverlayProps) => { return ( { - return vlList?.indexOf(element.nextVId) === -1; + return vlList?.indexOf(element!.nextVId!) === -1; }); const highestY = new Map(); @@ -450,7 +468,7 @@ export class SingleLineDiagramViewer { )?.size.width || 0; this.createSvgArrow( elementById, - element.direction, + element!.direction!, x + feederWidth / 2, highestY.get(element.vid), lowestY.get(element.vid) @@ -514,7 +532,11 @@ export class SingleLineDiagramViewer { // handling the navigation between voltage levels group.style.cursor = 'pointer'; - this.setArrowsStyle(group, 'currentColor', this.selectionBackColor); + this.setArrowsStyle( + group, + 'currentColor', + this.selectionBackColor! + ); let dragged = false; group.addEventListener('mousedown', () => { dragged = false; @@ -530,7 +552,7 @@ export class SingleLineDiagramViewer { (other) => other.id === element.id ); if (meta !== undefined && meta !== null) { - this.onNextVoltageCallback?.(meta.nextVId); + this.onNextVoltageCallback?.(meta.nextVId!); } }); @@ -538,7 +560,7 @@ export class SingleLineDiagramViewer { group.addEventListener('mouseenter', (e: Event) => { this.setArrowsStyle( e.target as SVGElement, - this.selectionBackColor, + this.selectionBackColor!, 'currentColor' ); }); @@ -547,7 +569,7 @@ export class SingleLineDiagramViewer { this.setArrowsStyle( e.target as SVGElement, 'currentColor', - this.selectionBackColor + this.selectionBackColor! ); }); } @@ -557,7 +579,7 @@ export class SingleLineDiagramViewer { // handling the click on a switch if (this.onBreakerCallback != null) { const switches = this.svgMetadata?.nodes.filter((element) => - SWITCH_COMPONENT_TYPES.has(element.componentType) + SWITCH_COMPONENT_TYPES.has(element.componentType!) ); switches?.forEach((aSwitch) => { const domEl: HTMLElement | null = this.container.querySelector( @@ -579,7 +601,7 @@ export class SingleLineDiagramViewer { const switchId = aSwitch.equipmentId; const open = aSwitch.open; this.onBreakerCallback?.( - switchId, + switchId!, !open, event.currentTarget ); @@ -679,7 +701,7 @@ export class SingleLineDiagramViewer { const feeders = this.svgMetadata?.nodes.filter((element) => { return ( element.vid !== '' && - FEEDER_COMPONENT_TYPES.has(element.componentType) + FEEDER_COMPONENT_TYPES.has(element.componentType!) ); }); feeders?.forEach((feeder) => { @@ -690,7 +712,7 @@ export class SingleLineDiagramViewer { if (svgText !== undefined && svgText !== null) { svgText.style.cursor = 'pointer'; svgText.addEventListener('mouseenter', () => { - showFeederSelection(svgText, this.selectionBackColor); + showFeederSelection(svgText, this.selectionBackColor!); }); svgText.addEventListener('mouseleave', () => { hideFeederSelection(svgText); @@ -699,8 +721,8 @@ export class SingleLineDiagramViewer { event.preventDefault(); event.stopPropagation(); this.onFeederCallback?.( - feeder.equipmentId, - feeder.componentType, + feeder.equipmentId!, + feeder.componentType!, feeder.id, event.x, event.y @@ -720,7 +742,7 @@ export class SingleLineDiagramViewer { // handling the hover on the equipments const svgEquipments = this.svgMetadata?.nodes.filter((node) => - equipmentsWithPopover.includes(node.componentType) + equipmentsWithPopover.includes(node.componentType!) ); svgEquipments?.forEach((equipment) => { const svgEquipment = this.container?.querySelector( @@ -734,8 +756,8 @@ export class SingleLineDiagramViewer { this.handleTogglePopover?.( true, event.currentTarget, - equipment.equipmentId, - equipmentType + equipment.equipmentId!, + equipmentType! ); }); svgEquipment?.addEventListener('mouseout', () => { @@ -746,7 +768,7 @@ export class SingleLineDiagramViewer { private addBusHandler() { const buses = this.svgMetadata?.nodes.filter((element) => - BUSBAR_SECTION_TYPES.has(element.componentType) + BUSBAR_SECTION_TYPES.has(element.componentType!) ); buses?.forEach((bus) => { const svgBus: HTMLElement | null = this.container?.querySelector( @@ -758,7 +780,7 @@ export class SingleLineDiagramViewer { event.preventDefault(); event.stopPropagation(); this.onBusCallback?.( - bus.equipmentId, + bus.equipmentId!, bus.id, event.x, event.y diff --git a/src/index.d.ts b/src/index.d.ts deleted file mode 100644 index 352084f4..00000000 --- a/src/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) 2024, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -export { DRAW_MODES } from './components/network-map-viewer/network/draw-control'; diff --git a/src/index.js b/src/index.ts similarity index 100% rename from src/index.js rename to src/index.ts diff --git a/src/types/glsl.d.ts b/src/types/glsl.d.ts new file mode 100644 index 00000000..d15c624d --- /dev/null +++ b/src/types/glsl.d.ts @@ -0,0 +1,4 @@ +declare module '*.glsl' { + const value: string; + export default value; +} diff --git a/src/types/svg.d.ts b/src/types/svg.d.ts new file mode 100644 index 00000000..c2a2614b --- /dev/null +++ b/src/types/svg.d.ts @@ -0,0 +1,4 @@ +declare module '*.svg' { + const value: string; + export default value; +} diff --git a/src/utils/colors.js b/src/utils/colors.ts similarity index 89% rename from src/utils/colors.js rename to src/utils/colors.ts index f59b8bec..9cf8b6ee 100644 --- a/src/utils/colors.js +++ b/src/utils/colors.ts @@ -5,7 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -export function getNominalVoltageColor(nominalVoltage) { +import { Color } from 'deck.gl'; + +export function getNominalVoltageColor(nominalVoltage: number): Color { if (nominalVoltage >= 300) { return [255, 0, 0]; } else if (nominalVoltage >= 170 && nominalVoltage < 300) { diff --git a/tsconfig.json b/tsconfig.json index da928dc5..7a8b5d44 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,23 @@ { - "compilerOptions": { - "module": "esnext", - "target": "es6", - "declaration": true, - "outDir": "./dist", - "strict": true, - "skipLibCheck": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "allowSyntheticDefaultImports": true, - "noFallthroughCasesInSwitch": true, - "moduleResolution": "node", - "noEmit": true - }, - "include": ["src", "demo"] // we can let demo because the file generation is managed my vite and we have noEmit anyway -} \ No newline at end of file + "compilerOptions": { + "module": "esnext", + "lib": ["ES2022"], + "target": "ESNext", + "declaration": true, + "outDir": "./dist", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "noEmit": true, + "jsx": "react-jsx", + "resolveJsonModule": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "demo"] // we can let demo because the file generation is managed my vite and we have noEmit anyway +} diff --git a/vite.config.ts b/vite.config.ts index 4871cacf..6f818930 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,20 +5,21 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { defineConfig } from 'vite'; import { resolve } from 'path'; -import eslint from 'vite-plugin-eslint'; -import dts from 'vite-plugin-dts'; +import { defineConfig } from 'vite'; +// import eslint from 'vite-plugin-eslint'; import react from '@vitejs/plugin-react'; +import path from 'path'; +import dts from 'vite-plugin-dts'; import { externalizeDeps } from 'vite-plugin-externalize-deps'; export default defineConfig((config) => ({ plugins: [ react(), - eslint({ - failOnWarning: config.mode !== 'development', - lintOnStart: true, - }), + // eslint({ + // failOnWarning: config.mode !== 'development', + // lintOnStart: true, + // }), dts({ include: ['src'], }), @@ -34,11 +35,16 @@ export default defineConfig((config) => ({ ], }), ], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, build: { minify: false, lib: { // Could also be a dictionary or array of multiple entry points - entry: resolve(__dirname, 'src/index.js'), + entry: resolve(__dirname, 'src/index.ts'), name: 'Powsybl diagram viewer', // the proper extensions will be added fileName: 'powsybl-diagram-viewer', From 0277b3c68e8776b0cfc5c56414418ad6c435aa3e Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Thu, 25 Jul 2024 18:21:37 +0200 Subject: [PATCH 03/10] fix remaining ts errors --- .eslintrc.cjs | 14 +- .github/config/.licenserc.yaml | 48 +- demo/index.html | 49 +- demo/src/App.tsx | 15 +- demo/src/diagram-viewers/add-diagrams.ts | 43 +- demo/src/{index.jsx => index.tsx} | 2 +- package-lock.json | 666 +++++++++++++----- package.json | 6 +- .../network-area-diagram-viewer.test.ts | 2 +- .../network/draw-control.ts | 2 +- .../network-map-viewer/network/geo-data.ts | 258 ++++++- .../network/layers/arrow-layer-fragment.frag | 12 + .../layers/arrow-layer-fragment.glsl.ts | 22 - ...vertex.glsl.ts => arrow-layer-vertex.vert} | 12 +- .../network/layers/arrow-layer.ts | 12 +- .../network-map-viewer/network/line-layer.ts | 40 +- .../network/map-equipments.ts | 39 +- .../network/network-map.tsx | 208 +++--- .../utils/equipment-types.ts | 55 +- .../utils/equipmentInfosHandler.ts | 10 +- .../utils/loader-with-overlay.tsx | 28 +- .../single-line-diagram-viewer.ts | 6 +- src/index.ts | 20 +- src/types/glsl.d.ts | 4 - src/vite-env.d.ts | 2 + vite.config.ts | 36 +- 26 files changed, 1125 insertions(+), 486 deletions(-) rename demo/src/{index.jsx => index.tsx} (99%) create mode 100644 src/components/network-map-viewer/network/layers/arrow-layer-fragment.frag delete mode 100644 src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.ts rename src/components/network-map-viewer/network/layers/{arrow-layer-vertex.glsl.ts => arrow-layer-vertex.vert} (96%) delete mode 100644 src/types/glsl.d.ts create mode 100644 src/vite-env.d.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 3640af5a..b019a96d 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -6,12 +6,20 @@ module.exports = { 'plugin:react-hooks/recommended', 'eslint:recommended', 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended' + 'plugin:prettier/recommended', ], env: { - "browser": true + browser: true, }, rules: { - "prettier/prettier": "warn", + 'prettier/prettier': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], }, }; diff --git a/.github/config/.licenserc.yaml b/.github/config/.licenserc.yaml index 17acef94..c06861dc 100644 --- a/.github/config/.licenserc.yaml +++ b/.github/config/.licenserc.yaml @@ -1,26 +1,28 @@ header: - license: - spdx-id: MPL-2.0 - pattern: | - Copyright copyright \d{4}, RTE \(http:\/\/www\.rte-france\.com\) - This Source Code Form is subject to the terms of the Mozilla Public - License, v\. 2\.0\. If a copy of the MPL was not distributed with this - file, You can obtain one at http:\/\/mozilla\.org\/MPL\/2\.0\/\. + license: + spdx-id: MPL-2.0 + pattern: | + Copyright copyright \d{4}, RTE \(http:\/\/www\.rte-france\.com\) + This Source Code Form is subject to the terms of the Mozilla Public + License, v\. 2\.0\. If a copy of the MPL was not distributed with this + file, You can obtain one at http:\/\/mozilla\.org\/MPL\/2\.0\/\. - paths-ignore: - - 'dist' - - 'licenses' - - '**/*.md' - - 'LICENSE' - - 'NOTICE' - - 'Dockerfile' - - '**/.*' - - '**/*.txt' - - '**/*.json' - - '**/*.yaml' - - '**/*.yml' - - '**/*.svg' - - '**/*.css' - - '**/*.conf' + paths-ignore: + - 'dist' + - 'licenses' + - '**/*.md' + - 'LICENSE' + - 'NOTICE' + - 'Dockerfile' + - '**/.*' + - '**/*.txt' + - '**/*.json' + - '**/*.yaml' + - '**/*.yml' + - '**/*.svg' + - '**/*.css' + - '**/*.conf' + - '**/*.frag' + - '**/*.vert' - comment: on-failure + comment: on-failure diff --git a/demo/index.html b/demo/index.html index d389127c..106a03bf 100644 --- a/demo/index.html +++ b/demo/index.html @@ -4,29 +4,30 @@ License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - + - - - - - - SVG Viewers Examples - - - -
-
-
-
-
-
-
-
-
- - + + + + + + + SVG Viewers Examples + + + +
+
+
+
+
+
+
+
+
+ + diff --git a/demo/src/App.tsx b/demo/src/App.tsx index 848a171e..81d948ec 100644 --- a/demo/src/App.tsx +++ b/demo/src/App.tsx @@ -16,6 +16,7 @@ import { GeoData, NetworkMap } from '../../src'; import DemoMapEquipments from './map-viewer/demo-map-equipments'; import { NetworkMapRef } from '@/components/network-map-viewer/network/network-map'; +import { Equipment } from '@/components/network-map-viewer/utils/equipment-types'; import { addNadToDemo, addSldToDemo } from './diagram-viewers/add-diagrams'; import lmapdata from './map-viewer/data/lmap.json'; import lposdata from './map-viewer/data/lpos.json'; @@ -34,7 +35,12 @@ function App() { }, []); //called after a click (right mouse click) on an equipment (line or substation) - function showEquipmentMenu(equipment, x, y, type) { + function showEquipmentMenu( + equipment: Equipment, + x: number, + y: number, + type: string + ) { console.log( '# Show equipment menu: ' + JSON.stringify(equipment) + @@ -47,6 +53,7 @@ function App() { palette: { mode: 'dark', }, + // @ts-expect-error: TODO not present in ThemeOptions link: { color: 'green', }, @@ -70,7 +77,7 @@ function App() { const mapEquipments = new DemoMapEquipments(smapdata, lmapdata); useEffect(() => { - const handleContextmenu = (e) => { + const handleContextmenu = (e: MouseEvent) => { e.preventDefault(); }; document.addEventListener('contextmenu', handleContextmenu); @@ -139,12 +146,12 @@ function App() { onPolygonChanged={() => { console.log( 'Selected Substations: ', - networkMapRef.current!.getSelectedSubstations() + networkMapRef.current?.getSelectedSubstations() .length ); console.log( 'Selected Lines: ', - networkMapRef.current!.getSelectedLines() + networkMapRef.current?.getSelectedLines() .length ); }} diff --git a/demo/src/diagram-viewers/add-diagrams.ts b/demo/src/diagram-viewers/add-diagrams.ts index c72b38b4..56a4ca5f 100644 --- a/demo/src/diagram-viewers/add-diagrams.ts +++ b/demo/src/diagram-viewers/add-diagrams.ts @@ -12,7 +12,14 @@ import SldSvgSubExampleMeta from './data/sld-sub-example-meta.json' assert { typ import SldSvgSubExample from './data/sld-sub-example.svg'; import { NetworkAreaDiagramViewer } from '../../../src/components/network-area-diagram-viewer/network-area-diagram-viewer'; -import { SingleLineDiagramViewer } from '../../../src/components/single-line-diagram-viewer/single-line-diagram-viewer'; +import { + HandleTogglePopoverType, + OnBreakerCallbackType, + OnBusCallbackType, + OnFeederCallbackType, + OnNextVoltageCallbackType, + SingleLineDiagramViewer, +} from '../../../src/components/single-line-diagram-viewer/single-line-diagram-viewer'; export const addNadToDemo = () => { fetch(NadSvgExample) @@ -28,8 +35,8 @@ export const addNadToDemo = () => { ); document - .getElementById('svg-container')! - .getElementsByTagName('svg')[0] + .getElementById('svg-container') + ?.getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); }; @@ -56,8 +63,8 @@ export const addSldToDemo = () => { ); document - .getElementById('svg-container-sld')! - .getElementsByTagName('svg')[0] + .getElementById('svg-container-sld') + ?.getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); @@ -82,8 +89,8 @@ export const addSldToDemo = () => { ); document - .getElementById('svg-container-sld-with-callbacks')! - .getElementsByTagName('svg')[0] + .getElementById('svg-container-sld-with-callbacks') + ?.getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); @@ -108,18 +115,18 @@ export const addSldToDemo = () => { ); document - .getElementById('svg-container-sldsub-with-callbacks')! - .getElementsByTagName('svg')[0] + .getElementById('svg-container-sldsub-with-callbacks') + ?.getElementsByTagName('svg')[0] .setAttribute('style', 'border:2px; border-style:solid;'); }); }; -const handleNextVL = (id: string) => { +const handleNextVL: OnNextVoltageCallbackType = (id: string) => { const msg = 'Clicked on navigation arrow, dest VL is ' + id; console.log(msg); }; -const handleSwitch = ( +const handleSwitch: OnBreakerCallbackType = ( id: string, switch_status: boolean, element: EventTarget | null @@ -130,11 +137,12 @@ const handleSwitch = ( ', switch_status: ' + (switch_status ? 'close' : 'open') + '. elementId: ' + - element!.id; + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO no "id" prop existing + (element as any).id; console.log(msg); }; -const handleFeeder = ( +const handleFeeder: OnFeederCallbackType = ( id: string, feederType: string | null, svgId: string, @@ -155,13 +163,18 @@ const handleFeeder = ( console.log(msg); }; -const handleBus = (id: string, svgId: string, x: number, y: number) => { +const handleBus: OnBusCallbackType = ( + id: string, + svgId: string, + x: number, + y: number +) => { const msg = 'Clicked on bus: ' + id + ', svgId: ' + svgId + 'x: ' + x + ', y: ' + y; console.log(msg); }; -const handleTogglePopover = ( +const handleTogglePopover: HandleTogglePopoverType = ( shouldDisplay: boolean, anchorEl: EventTarget | null, equipmentId: string, diff --git a/demo/src/index.jsx b/demo/src/index.tsx similarity index 99% rename from demo/src/index.jsx rename to demo/src/index.tsx index 8fc40df2..ae3b8d65 100644 --- a/demo/src/index.jsx +++ b/demo/src/index.tsx @@ -9,7 +9,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; -const root = ReactDOM.createRoot(document.getElementById('root')); +const root = ReactDOM.createRoot(document.getElementById('root')!); root.render( diff --git a/package-lock.json b/package-lock.json index 83f08dc1..ea6fb84b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^9.0.21", + "deck.gl": "^9.0.24", "geolib": "^3.3.4", "mapbox-gl": "^3.4.0", "maplibre-gl": "^4.5.0", @@ -29,6 +29,7 @@ "@mui/system": "^5.15.20", "@types/eslint": "^7.29.0", "@types/eslint-config-prettier": "^6.11.3", + "@types/eslint-plugin-prettier": "^3.1.3", "@types/jest": "^29.5.12", "@types/license-checker": "^25.0.6", "@types/mapbox__mapbox-gl-draw": "^1.4.6", @@ -56,7 +57,8 @@ "vite": "^5.3.3", "vite-plugin-dts": "^3.9.1", "vite-plugin-eslint": "^1.8.1", - "vite-plugin-externalize-deps": "^0.8.0" + "vite-plugin-externalize-deps": "^0.8.0", + "vite-plugin-svgr": "^4.2.0" }, "peerDependencies": { "@emotion/styled": "^11.11.5", @@ -82,12 +84,12 @@ } }, "node_modules/@arcgis/core": { - "version": "4.30.5", - "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.30.5.tgz", - "integrity": "sha512-ES/L1e1MuSZgG4mj960n0VRc5F/cW1gRLXpzJvRdhxXjsLWC/zsc4syW6CdQ09NjQFM1pd5IxuXz9U/tpWbjJg==", + "version": "4.30.8", + "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.30.8.tgz", + "integrity": "sha512-nb1PwcPcqIKwSBb0wGF3DAHnA+G/2xcgXoZCVZQo4pvQSBTJQNvuXDxFhTCugsAAPh96FiQ4FL6ibEFO/jM9lA==", "peer": true, "dependencies": { - "@esri/arcgis-html-sanitizer": "~4.0.1", + "@esri/arcgis-html-sanitizer": "~4.0.3", "@esri/calcite-colors": "~6.1.0", "@esri/calcite-components": "^2.8.5", "@vaadin/grid": "~24.3.13", @@ -1899,9 +1901,9 @@ } }, "node_modules/@deck.gl/aggregation-layers": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.21.tgz", - "integrity": "sha512-vJzJhYjZD7Nk/d+aQ5rifv7fSeV7ThIgHVnpe3j9QAS8Yy5VfuHKcOqIMi0JlRNPdINqmXjokknRno5jrdBCJA==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.24.tgz", + "integrity": "sha512-Of6f/yZNqpfL8+j0+5J9z7RTGjxo8D3Lo1vK1bSbLe+zITcvCazwCw+0+DaedKjorFglZoXgdOnTGR30ukuVhg==", "dependencies": { "@luma.gl/constants": "^9.0.15", "@luma.gl/shadertools": "^9.0.15", @@ -1916,9 +1918,9 @@ } }, "node_modules/@deck.gl/arcgis": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.0.21.tgz", - "integrity": "sha512-Yki93Y6tV4N8MxBaal2wVFQLIb3UAlPkgmeAlWAuWrtWvAhCgdDZazwFao8SE5Ifoemi7U0faBMJR0BVX6ntMA==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.0.24.tgz", + "integrity": "sha512-5Xs0doIRaR2xutWffHX+avcD/mZmnWly3zH7d7iT+h9DcUtHMFypcF+apKxgm0LwSGV8oEH7xuCD7Fei3yJlTQ==", "dependencies": { "@luma.gl/constants": "^9.0.15", "esri-loader": "^3.7.0" @@ -1931,9 +1933,9 @@ } }, "node_modules/@deck.gl/carto": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.21.tgz", - "integrity": "sha512-UjP/CN5DhXgfvKgVjzHZkYY2fGwFc9vscP1DciNZIdpZqij9uoVTgP5QxYEXKUe2pbJ8NEZlE5jpn5VEyogrIw==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.24.tgz", + "integrity": "sha512-SvQVzxErHHAdvp7SOB7zF5oIILm+QY7xjsQjUhXCJ4NsjSGzt3J0pKi8wqtuMzcLnopjMfDv34y8rbbYizGaHA==", "dependencies": { "@loaders.gl/gis": "^4.2.0", "@loaders.gl/loader-utils": "^4.2.0", @@ -1967,9 +1969,9 @@ } }, "node_modules/@deck.gl/core": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.21.tgz", - "integrity": "sha512-RXVedj0n2Smt6xOqPD7Gb8QNz1MYGlVNvQ65N4uPZ7vUqmpKY+nO6R8Au5DbrK+4gQm/BNOuWtUbxJH2KhNCyQ==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.24.tgz", + "integrity": "sha512-S27HfFg9SqqMZ1v5LwFFKpDg1npFmR7kRJXVL0FckmRbqdSdXE0UE6srCsOa787urGREMPUvxi0WDG9HO8Ve7w==", "dependencies": { "@loaders.gl/core": "^4.2.0", "@loaders.gl/images": "^4.2.0", @@ -1990,9 +1992,9 @@ } }, "node_modules/@deck.gl/extensions": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.21.tgz", - "integrity": "sha512-ANiCPDN4tIR/e9eg7LWPvtqagQXIxD7AQkWKNDJz853js/YlVjxse2K1lhyrLgNLRaeacsOliglJI+1174ZY/Q==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.24.tgz", + "integrity": "sha512-iIGDN94dUe3OarjoSwemX6/bZhFX51wdzqelEPYuEe/F4xlYFFClsDMzROJ34QAdtXULKnG9Adgi101w4oYQgA==", "dependencies": { "@luma.gl/constants": "^9.0.15", "@luma.gl/shadertools": "^9.0.15", @@ -2005,9 +2007,9 @@ } }, "node_modules/@deck.gl/geo-layers": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.21.tgz", - "integrity": "sha512-87s6rqOcsJALjSxfc+bH0GBqHbVshISu4Ii6CRHQpBl0Hply1ERONrUj0lIgU8d9sGt71Ide4cH3yHeFw+ynhQ==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.24.tgz", + "integrity": "sha512-7HS9Y/EMs1KdIDtyCVaUf/0w7tklsjohbfalEd5KiGlCpYfkPypqFyL5otJq+QMYziWuuIsci71mfzKwBm63xQ==", "dependencies": { "@loaders.gl/3d-tiles": "^4.2.0", "@loaders.gl/gis": "^4.2.0", @@ -2037,9 +2039,9 @@ } }, "node_modules/@deck.gl/google-maps": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.21.tgz", - "integrity": "sha512-GqkuLxgqgr/SIPMtVQDX7ahDGvwAS+Kvm+ka5wJuktbi4ExKja3w26NKS/1avpUC8YkobdqHEC6toyv7tiPpCQ==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.24.tgz", + "integrity": "sha512-/c6ssGImqWNtJjQmc4o70ZVTRUHGo5zoNiDf90SosIsJKYhKeEPzc+t5jDpF5cP26lsbmA+N6fAgi1Oc6jJ+dQ==", "dependencies": { "@luma.gl/constants": "^9.0.15", "@math.gl/core": "^4.0.0", @@ -2051,9 +2053,9 @@ } }, "node_modules/@deck.gl/json": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.21.tgz", - "integrity": "sha512-qzCWh4RK1bioOU3sfLGb10yHR2+G8x7bUqHTFz6Rw4KGUInrF/FRokidUjLOy6Sa9E6o1S+7EAXb1xjNmx0L9w==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.24.tgz", + "integrity": "sha512-m+28f62en2eyt39xS7FkaEaqtog6stEKcKji9tmsAJPHGlLiymRMEqvJNMDHbMGpqTg8dZPiEJpivxZzVSOS4A==", "dependencies": { "expression-eval": "^5.0.0" }, @@ -2062,9 +2064,9 @@ } }, "node_modules/@deck.gl/layers": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.21.tgz", - "integrity": "sha512-R+Uoj2VpFW3QuRvZFQjjDcFQLfBP+zp+/8puJqrfDdQNG/d8MR96rzVXIxFfrKGCEh34qM7zbB4zSzc1SzhxgQ==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.24.tgz", + "integrity": "sha512-P34fCYGZhMMmoslDD182u4onTxGOH9/9MBDa420RM5fGXq9PkzV9RCFZoW6Rd2S4684b3K96zcwi5jy6pzkeBA==", "dependencies": { "@loaders.gl/images": "^4.2.0", "@loaders.gl/schema": "^4.2.0", @@ -2082,9 +2084,9 @@ } }, "node_modules/@deck.gl/mapbox": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.21.tgz", - "integrity": "sha512-9IxkjRAfDlqFxfVYDUeWb+YG5tnF6f8BRReogic/ImKAfe5Qk1aG1p47X0jSBWm8wRx45W+jvCpA/wPd0sfHQg==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.24.tgz", + "integrity": "sha512-uJpxCIfqUb5053C3xCANPptgJA3LnvBXz1h5NoB3CEqz9pLdrLOlcNggx0KchHyAsC5ZQgM8WfwxKuajhn9+ag==", "dependencies": { "@luma.gl/constants": "^9.0.15", "@math.gl/web-mercator": "^4.0.0" @@ -2095,9 +2097,9 @@ } }, "node_modules/@deck.gl/mesh-layers": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.21.tgz", - "integrity": "sha512-ywTKEun/QA8p2ZhfBAKjD3DgjMzztEdWF/xOtEJfdPTG03v7WDfd8jFiLDCwVxGAuoxljRuNOX/B5z6HhizbNg==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.24.tgz", + "integrity": "sha512-GkPE+lCHGyTd6XqJaOZxSgCAg5Ym/K6U+NJYAnYBoANyPDnkqsFIRYPt40Ymb8/21DQh0NRCXi2s8htbUIUJsg==", "dependencies": { "@loaders.gl/gltf": "^4.2.0", "@luma.gl/gltf": "^9.0.15", @@ -2110,9 +2112,9 @@ } }, "node_modules/@deck.gl/react": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.21.tgz", - "integrity": "sha512-u9CxlSU4boWKsAU0zcTzzn9gUTSJmlNjx1gQTP4ZB6aIw3DkaLMZYi+yWIuIuExXbQh6UlUan4n2PjhuPHlm1Q==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.24.tgz", + "integrity": "sha512-gVJTcE7IpIHnfgtu8XzoxQloy+rtyLs3tmzCjy90B4/gEkQCbhBh+hJBa13YgLUIhrkCZmgwiLVg/gCOV8UwRQ==", "peerDependencies": { "@deck.gl/core": "^9.0.0", "react": ">=16.3.0", @@ -2120,9 +2122,9 @@ } }, "node_modules/@deck.gl/widgets": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.21.tgz", - "integrity": "sha512-KJkCihnE3ZWxw1+vGAtFT/78Cfa3jgOGI1E8AX5wtlidIFyrba2D6jeek78OJhsO/9TB/26j3fnIbZPSdDo+Wg==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.24.tgz", + "integrity": "sha512-k6T3g4dVamXY/EnRjOHuI4M9DWLkgVb1sKc5u+aXODDFJZrYN0d8yR0TKMF5028FQ6XLfOb7cADlQ2F6bjYaqQ==", "dependencies": { "preact": "^10.17.0" }, @@ -3998,14 +4000,14 @@ } }, "node_modules/@luma.gl/constants": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.15.tgz", - "integrity": "sha512-gcvQmd5Nl0rnU/lXq2Rj214Mjc2XnyBJlfcQfRUGBngvcN4AtQvVtZVUveW6wCZA6JysB0ntvi4ovZm4GhJ/lw==" + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.16.tgz", + "integrity": "sha512-uVbtpTON0HYfX8MqgQ+wz+Hh9EvvTq0F1QXNtWjpizLsRFJIeWGO3a7uqz6Y6pzvzqCCYdN/GPGo/t+Vxt/D/w==" }, "node_modules/@luma.gl/core": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.15.tgz", - "integrity": "sha512-pogG6a91oM0ynSvBm0MsA7ABWu1QdqlaGyrb1mxvQrQA1NvgN/jflYlqBZ8YfckgJdJe7EZ4bNqnR5ABOu7wIA==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.16.tgz", + "integrity": "sha512-PutSJOJuVzZAlE1Jh4j0dr4+xyr9CQuoOPkK1XTwqQ+Yjo4Fyjz4Fx1Wnyh6KmAmCFrdnYxcztbIiBWONir49Q==", "dependencies": { "@math.gl/types": "^4.0.0", "@probe.gl/env": "^4.0.2", @@ -4015,11 +4017,11 @@ } }, "node_modules/@luma.gl/engine": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.15.tgz", - "integrity": "sha512-CTumSSnBoDbmLF4CvdDk3O8UKArv+cuWq6yiquuPNnJkpzPu1CCz8cIE21boHMNTkWzrxZNceS0RQwbATgQVRA==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.16.tgz", + "integrity": "sha512-A/gIQts5DeJTeuJyim6kxTNTOETEFcpGRZN5Ht7u/iP8CrTMJKPCTz/aaXEcvn926tsvLqneeARY80jjy3kKiQ==", "dependencies": { - "@luma.gl/shadertools": "9.0.15", + "@luma.gl/shadertools": "9.0.16", "@math.gl/core": "^4.0.0", "@probe.gl/log": "^4.0.2", "@probe.gl/stats": "^4.0.2" @@ -4029,12 +4031,12 @@ } }, "node_modules/@luma.gl/gltf": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.15.tgz", - "integrity": "sha512-gZsWzpYd+oj8W8Gsrr+Iq8Q05zSTyzbAHgmDvDFati4d7X++jnCUZL00KB4wwheQ755MXHU+//+10b5L1Nev1Q==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.16.tgz", + "integrity": "sha512-n7mfJVl/WgQ0/9h995p17x96LlLQ5Vb+af7RzkCgqW/Se5fwRFXp9+lGilPHLAdbPeaKKrt9IiOlKtZ0ruQ0Pg==", "dependencies": { "@loaders.gl/textures": "^4.2.0", - "@luma.gl/shadertools": "9.0.15", + "@luma.gl/shadertools": "9.0.16", "@math.gl/core": "^4.0.0" }, "peerDependencies": { @@ -4044,23 +4046,24 @@ } }, "node_modules/@luma.gl/shadertools": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.15.tgz", - "integrity": "sha512-U/W1Vh7HXlhw3T6edUMcLFPSO6OVlDZKPx8v6kSkJtjny37aFZaVeRupUgYfjsSxK1aEc5uTAN1w7+3lJMhUIg==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.16.tgz", + "integrity": "sha512-mWDrGxzI9dYTzTN8dEBifWmpFpTXq6sWF8JDj2KcB6Lza63jbxlFUZ/gkCydiZoFkgrh1QjDaJM8dayfYyV/wQ==", "dependencies": { "@math.gl/core": "^4.0.0", - "@math.gl/types": "^4.0.0" + "@math.gl/types": "^4.0.0", + "wgsl_reflect": "^1.0.1" }, "peerDependencies": { "@luma.gl/core": "^9.0.0" } }, "node_modules/@luma.gl/webgl": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.15.tgz", - "integrity": "sha512-hAwer8bCe3S5fL8/1Z/gWp5dinVNOxC7oFZQ7uYVr/BhUu7NbUA6P9ueVJDANtE9wAh+tl/uN43mcH9aP7YMfQ==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.16.tgz", + "integrity": "sha512-dfddcdGH8PuVYzecL/PDXGnEX1pWfVZ0Q/ALo1/h5S0gfmikyiQodyBK2S98JJUDc+qbL5db5LoiGGeeNm0uUg==", "dependencies": { - "@luma.gl/constants": "9.0.15", + "@luma.gl/constants": "9.0.16", "@probe.gl/env": "^4.0.2" }, "peerDependencies": { @@ -5144,6 +5147,275 @@ "@svgdotjs/svg.js": "^3.0.16" } }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/core/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -5404,6 +5676,15 @@ "integrity": "sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==", "dev": true }, + "node_modules/@types/eslint-plugin-prettier": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", + "integrity": "sha512-Jk+lgBZM0u9ETUyqe2HvykL1j6uE7L1oEqbInWtsVHT6sP+AdwLb4ncmQBqASTS+YzYOPF6hKX0zgEhblRMjqA==", + "dev": true, + "dependencies": { + "@types/eslint": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -5882,38 +6163,38 @@ } }, "node_modules/@vaadin/a11y-base": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.15.tgz", - "integrity": "sha512-gFLt2Hh49SGS1w7vni+txLhoSxLNpd89gBRzXyx61ug3G0u9ydKb96feyUR1eKjfN0gVDO9urRJy0h49+1p3WQ==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.18.tgz", + "integrity": "sha512-qa8oduy74CCPEe1ORF03ZSV91cCWePD/6dFuFkPn1t6oX2CZzsCm9vu0S0fGIbAIYfoJ4W0eVXnuEGwYdmIDQQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.15", + "@vaadin/component-base": "~24.3.18", "lit": "^3.0.0" } }, "node_modules/@vaadin/checkbox": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.15.tgz", - "integrity": "sha512-2LJ95fKBSgSi6dmuhFTXknp/zfmDGXnBV+e+ewdM8wYOFimSlCslhrkZNyXXb6T91TcZPx7qmjmGp4KF+PZR5Q==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.18.tgz", + "integrity": "sha512-bRJT6/hYODuue5mfE9D2eHiciEO6C69nFjo7ZoUM70+A66mTQ1DXX/8BujvjLAlH8jzmeHeS/AejmudowiC7Lg==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.15", - "@vaadin/component-base": "~24.3.15", - "@vaadin/field-base": "~24.3.15", - "@vaadin/vaadin-lumo-styles": "~24.3.15", - "@vaadin/vaadin-material-styles": "~24.3.15", - "@vaadin/vaadin-themable-mixin": "~24.3.15", + "@vaadin/a11y-base": "~24.3.18", + "@vaadin/component-base": "~24.3.18", + "@vaadin/field-base": "~24.3.18", + "@vaadin/vaadin-lumo-styles": "~24.3.18", + "@vaadin/vaadin-material-styles": "~24.3.18", + "@vaadin/vaadin-themable-mixin": "~24.3.18", "lit": "^3.0.0" } }, "node_modules/@vaadin/component-base": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.15.tgz", - "integrity": "sha512-b5wQhrRZw5Ur+mK7IDm/j441Vv0Ww+RpgjTJfBgW3kT+4mJu1gqsO6VkhmxafVfaWM6AorcMB2cHmQwCZJzhSQ==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.18.tgz", + "integrity": "sha512-PINsCNytvoysWL/oBe7HBIEJL1lcc3ihFVTwDM0PB/uVMTRcM0JPMkP4/A1f/qZbTKjZnF2RIXIotexHxumZAg==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", @@ -5924,88 +6205,88 @@ } }, "node_modules/@vaadin/field-base": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.15.tgz", - "integrity": "sha512-2om/73h41qC0S3AX6TgwZIEPikoGHUoPgFnBv0/30fjF5aqTMlQ7Ldw2g+oIaR+YDeCOfkB/3idoNogpz1QSQQ==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.18.tgz", + "integrity": "sha512-nVHXkaqT1LJVVjsAiWpg9bdEA3OAfERxA4fvKqkuFUK55aAVeQxCw3P8jWmVKRVd3m9UCmlLHnHuXmuD2R6ZwQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.15", - "@vaadin/component-base": "~24.3.15", + "@vaadin/a11y-base": "~24.3.18", + "@vaadin/component-base": "~24.3.18", "lit": "^3.0.0" } }, "node_modules/@vaadin/grid": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.15.tgz", - "integrity": "sha512-qJI1pZBfGvwAtiE5Zk9DmjVuw/2DAslzhouhgNziBxyHmEj3jb1BStLJ+aXGytgvJ0aHY6fMr92KAGVOmKcsAw==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.18.tgz", + "integrity": "sha512-Cvg+D4mizhs5Wh4JdX+wkWfJzHD/Jp1CeahhjLxUD13BKrgtgwNj1IofFQD47lMMufK/5wi2ppeeD/MaINaE5A==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.15", - "@vaadin/checkbox": "~24.3.15", - "@vaadin/component-base": "~24.3.15", - "@vaadin/lit-renderer": "~24.3.15", - "@vaadin/text-field": "~24.3.15", - "@vaadin/vaadin-lumo-styles": "~24.3.15", - "@vaadin/vaadin-material-styles": "~24.3.15", - "@vaadin/vaadin-themable-mixin": "~24.3.15" + "@vaadin/a11y-base": "~24.3.18", + "@vaadin/checkbox": "~24.3.18", + "@vaadin/component-base": "~24.3.18", + "@vaadin/lit-renderer": "~24.3.18", + "@vaadin/text-field": "~24.3.18", + "@vaadin/vaadin-lumo-styles": "~24.3.18", + "@vaadin/vaadin-material-styles": "~24.3.18", + "@vaadin/vaadin-themable-mixin": "~24.3.18" } }, "node_modules/@vaadin/icon": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.15.tgz", - "integrity": "sha512-KS36B+G9lIj0NBnwz1BDAXU5vNsRKQXEbV5SjXLbQC7PwP0HpAz8Y61W1U9lqHtd9hG/forQd+znQYeDaubs1A==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.18.tgz", + "integrity": "sha512-S0Vh8SgtpBrdWSB+dGUGtvku9Avj8PZ4e3CY+U9A8L1ArdS+X20Jwag5cY4I5d9GY/NOcoSkYBcJqgAMTem2kQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.15", - "@vaadin/vaadin-lumo-styles": "~24.3.15", - "@vaadin/vaadin-themable-mixin": "~24.3.15", + "@vaadin/component-base": "~24.3.18", + "@vaadin/vaadin-lumo-styles": "~24.3.18", + "@vaadin/vaadin-themable-mixin": "~24.3.18", "lit": "^3.0.0" } }, "node_modules/@vaadin/input-container": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.15.tgz", - "integrity": "sha512-5Bm8fMnIJRHfWBVIYVXGKcEF7NInJ9F1Z9k9fwBjJSFesd2KQ02IzqzOLd2+iVr8+ozp8dE0wQZQHXiAxoA4wg==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.18.tgz", + "integrity": "sha512-UwTOLa72UXHh9sTNqNwrfbKvUwcXTDM6naEh+tO/l+tbXXVcC+Bo8FnTKBugYVnlQQOpzC4jLvxMma3XUlSAuA==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.15", - "@vaadin/vaadin-lumo-styles": "~24.3.15", - "@vaadin/vaadin-material-styles": "~24.3.15", - "@vaadin/vaadin-themable-mixin": "~24.3.15", + "@vaadin/component-base": "~24.3.18", + "@vaadin/vaadin-lumo-styles": "~24.3.18", + "@vaadin/vaadin-material-styles": "~24.3.18", + "@vaadin/vaadin-themable-mixin": "~24.3.18", "lit": "^3.0.0" } }, "node_modules/@vaadin/lit-renderer": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.15.tgz", - "integrity": "sha512-nJxHRjXb1JgcgNF4MYtYopAtIs+9RLhQ56TKyEfcRWXC6Eq6yZcKPN0mxCRalSnCZYUORuc0gvzfnZCMIdfa1Q==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.18.tgz", + "integrity": "sha512-HlYrhVwagnYcbGuOJ3IP6YRxSaV6l7qbRfsZsTl+Xpt/ElaWRktwATzvGgYd0zvnvgAut555lja9/dl0T33yOg==", "peer": true, "dependencies": { "lit": "^3.0.0" } }, "node_modules/@vaadin/text-field": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.15.tgz", - "integrity": "sha512-x0Z7O4zf24+XL7Zs7qghL1twBs79JvhhiFCLfttKG8j1njxr01QsoxlrxPrUJDP9T9hTSZAlJ8WkDE/+wWU25g==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.18.tgz", + "integrity": "sha512-k7u7CKeLOg4RUZ94TGfXJ7DpU1GJJLxfAqPbG2YP5tDYL4g3XyVfILpW4jDUQr5gJhPJyS7L9roNadc0Q3Mp4g==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.15", - "@vaadin/component-base": "~24.3.15", - "@vaadin/field-base": "~24.3.15", - "@vaadin/input-container": "~24.3.15", - "@vaadin/vaadin-lumo-styles": "~24.3.15", - "@vaadin/vaadin-material-styles": "~24.3.15", - "@vaadin/vaadin-themable-mixin": "~24.3.15", + "@vaadin/a11y-base": "~24.3.18", + "@vaadin/component-base": "~24.3.18", + "@vaadin/field-base": "~24.3.18", + "@vaadin/input-container": "~24.3.18", + "@vaadin/vaadin-lumo-styles": "~24.3.18", + "@vaadin/vaadin-material-styles": "~24.3.18", + "@vaadin/vaadin-themable-mixin": "~24.3.18", "lit": "^3.0.0" } }, @@ -6016,32 +6297,32 @@ "peer": true }, "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.15.tgz", - "integrity": "sha512-W/CBtratSQrRzeren8R0rOtSlavSpy8FlLu4MM9E8CWzbPCVmg+jhATNKBSVQzcY991yE2qws44B/awuXpuhbg==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.18.tgz", + "integrity": "sha512-cgzVOnmBiqlGQIAoQs/k2iFSsgTfckUcmGScouCbTUx2AUWbTvVYPjGlac1dkO4CsSZELE3uf2WPdPVQPSw1dw==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.15", - "@vaadin/icon": "~24.3.15", - "@vaadin/vaadin-themable-mixin": "~24.3.15" + "@vaadin/component-base": "~24.3.18", + "@vaadin/icon": "~24.3.18", + "@vaadin/vaadin-themable-mixin": "~24.3.18" } }, "node_modules/@vaadin/vaadin-material-styles": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.15.tgz", - "integrity": "sha512-CSzHBunOYbfTOM9ZTl2xBAqU9FF9lGwog9p7wiSOxD1LEs2KqjlEnJ4sZ9tlwSjNEMQHopT0Fh5INUB1YBgUmw==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.18.tgz", + "integrity": "sha512-vNJ1fjuVpneqodh6uOSAlUWbZ6V2S2mxdwr++VsdPgDtNhqxwpOhY4X700XQhObbk28q6hvrNpSyvSRkhyLkEg==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.15", - "@vaadin/vaadin-themable-mixin": "~24.3.15" + "@vaadin/component-base": "~24.3.18", + "@vaadin/vaadin-themable-mixin": "~24.3.18" } }, "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.3.15", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.15.tgz", - "integrity": "sha512-V/AQj4EL5SiDtGImqhFYMgE4g3WNZdcvgWBa57wlny83ThdcxJtc/vLLC1bRYlaLV9DTa93wW9N9tyt2qsexcA==", + "version": "24.3.18", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.18.tgz", + "integrity": "sha512-4P9tjpyfRIXW+FKlnrjK0zSgguhIv1mKVjqEb55GnT9XXMZeAfYMkSBp8asWf6tLcKAVqYEq0/9cuPa5UmZBpQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", @@ -6169,9 +6450,9 @@ "peer": true }, "node_modules/@zip.js/zip.js": { - "version": "2.7.45", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.45.tgz", - "integrity": "sha512-Mm2EXF33DJQ/3GWWEWeP1UCqzpQ5+fiMvT3QWspsXY05DyqqxWu7a9awSzU4/spHMHVFrTjani1PR0vprgZpow==", + "version": "2.7.47", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.47.tgz", + "integrity": "sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg==", "peer": true, "engines": { "bun": ">=0.7.0", @@ -7574,23 +7855,23 @@ "dev": true }, "node_modules/deck.gl": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.21.tgz", - "integrity": "sha512-8DMlI4SO97PtAY42wPcvmgMizTKthnp+afaTEGiIyPXDzun0FF6wjc8G3CC71iYYvEZ2gFcyKjSOemCd5BQgug==", - "dependencies": { - "@deck.gl/aggregation-layers": "9.0.21", - "@deck.gl/arcgis": "9.0.21", - "@deck.gl/carto": "9.0.21", - "@deck.gl/core": "9.0.21", - "@deck.gl/extensions": "9.0.21", - "@deck.gl/geo-layers": "9.0.21", - "@deck.gl/google-maps": "9.0.21", - "@deck.gl/json": "9.0.21", - "@deck.gl/layers": "9.0.21", - "@deck.gl/mapbox": "9.0.21", - "@deck.gl/mesh-layers": "9.0.21", - "@deck.gl/react": "9.0.21", - "@deck.gl/widgets": "9.0.21", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.24.tgz", + "integrity": "sha512-e1cQ8TFAkMR9e73XdWbzRGQCdd8u9OmmzAZaPM8ViW/zEWn0gTNco2A3x0Uvu4oqq4SO9VBG0UozPNhO1WJN1w==", + "dependencies": { + "@deck.gl/aggregation-layers": "9.0.24", + "@deck.gl/arcgis": "9.0.24", + "@deck.gl/carto": "9.0.24", + "@deck.gl/core": "9.0.24", + "@deck.gl/extensions": "9.0.24", + "@deck.gl/geo-layers": "9.0.24", + "@deck.gl/google-maps": "9.0.24", + "@deck.gl/json": "9.0.24", + "@deck.gl/layers": "9.0.24", + "@deck.gl/mapbox": "9.0.24", + "@deck.gl/mesh-layers": "9.0.24", + "@deck.gl/react": "9.0.24", + "@deck.gl/widgets": "9.0.24", "@loaders.gl/core": "^4.2.0", "@luma.gl/core": "^9.0.15", "@luma.gl/engine": "^9.0.15" @@ -7777,6 +8058,16 @@ "node": ">=12" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/draco3d": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", @@ -12090,6 +12381,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12447,6 +12747,16 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -13868,6 +14178,16 @@ "node": "*" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/snappyjs": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", @@ -14266,6 +14586,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -14605,8 +14931,7 @@ "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "peer": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tweakpane": { "version": "4.0.3", @@ -15097,6 +15422,20 @@ "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" } }, + "node_modules/vite-plugin-svgr": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz", + "integrity": "sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.5", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": "^2.6.0 || 3 || 4 || 5" + } + }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", @@ -15181,6 +15520,11 @@ "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz", "integrity": "sha512-ANHlY4Rb5kHw40D0NJ6moaVfOCMrp9Gpd1R/AIQYg2ko4/jzcJ+TVXYYF6kXJqQwITvEZP4yEthjM7U6rYlljQ==" }, + "node_modules/wgsl_reflect": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/wgsl_reflect/-/wgsl_reflect-1.0.8.tgz", + "integrity": "sha512-0kdpA5H3SF2CMeCBijYqQz+ZT+uW310nJORFX8QPFOvrkfSGNPHFDE7aGPCUnsuDi1kzpj+9SEFIhqjf9iHGSQ==" + }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", diff --git a/package.json b/package.json index 3969b021..bb234dec 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^9.0.21", + "deck.gl": "^9.0.24", "geolib": "^3.3.4", "mapbox-gl": "^3.4.0", "maplibre-gl": "^4.5.0", @@ -57,6 +57,7 @@ "@mui/system": "^5.15.20", "@types/eslint": "^7.29.0", "@types/eslint-config-prettier": "^6.11.3", + "@types/eslint-plugin-prettier": "^3.1.3", "@types/jest": "^29.5.12", "@types/license-checker": "^25.0.6", "@types/mapbox__mapbox-gl-draw": "^1.4.6", @@ -84,6 +85,7 @@ "vite": "^5.3.3", "vite-plugin-dts": "^3.9.1", "vite-plugin-eslint": "^1.8.1", - "vite-plugin-externalize-deps": "^0.8.0" + "vite-plugin-externalize-deps": "^0.8.0", + "vite-plugin-svgr": "^4.2.0" } } diff --git a/src/components/network-area-diagram-viewer/network-area-diagram-viewer.test.ts b/src/components/network-area-diagram-viewer/network-area-diagram-viewer.test.ts index 7296025d..0be7d8e1 100644 --- a/src/components/network-area-diagram-viewer/network-area-diagram-viewer.test.ts +++ b/src/components/network-area-diagram-viewer/network-area-diagram-viewer.test.ts @@ -7,7 +7,7 @@ import { NetworkAreaDiagramViewer } from './network-area-diagram-viewer'; -describe('Test network-area-diagram-viewer.ts', () => { +describe('Test network-area-diagram-viewer', () => { // SVG aren't loaded properly in DOM with Jest. Has to be enriched... test('nad creation', () => { const container: HTMLDivElement = document.createElement('div'); diff --git a/src/components/network-map-viewer/network/draw-control.ts b/src/components/network-map-viewer/network/draw-control.ts index 9d710acd..256a9797 100644 --- a/src/components/network-map-viewer/network/draw-control.ts +++ b/src/components/network-map-viewer/network/draw-control.ts @@ -24,7 +24,7 @@ export enum DRAW_MODES { DIRECT_SELECT = 'direct_select', } -type DrawControlProps = ConstructorParameters[0] & { +export type DrawControlProps = ConstructorParameters[0] & { position?: ControlPosition; readyToDisplay: boolean; onDrawPolygonModeActive: (polygoneDrawing: DRAW_MODES) => void; diff --git a/src/components/network-map-viewer/network/geo-data.ts b/src/components/network-map-viewer/network/geo-data.ts index 3ac635d9..24deebc7 100644 --- a/src/components/network-map-viewer/network/geo-data.ts +++ b/src/components/network-map-viewer/network/geo-data.ts @@ -31,7 +31,262 @@ const linePositionByIdIndexer = ( return map; }; -type Coordinate = { +// https://github.com/powsybl/powsybl-core/blob/main/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/Country.java +export enum Country { + AF = 'AFGHANISTAN', + AX = 'ÅLAND ISLANDS', + AL = 'ALBANIA', + DZ = 'ALGERIA', + AS = 'AMERICAN SAMOA', + AD = 'ANDORRA', + AO = 'ANGOLA', + AI = 'ANGUILLA', + AQ = 'ANTARCTICA', + AG = 'ANTIGUA AND BARBUDA', + AR = 'ARGENTINA', + AM = 'ARMENIA', + AW = 'ARUBA', + AU = 'AUSTRALIA', + AT = 'AUSTRIA', + AZ = 'AZERBAIJAN', + BS = 'BAHAMAS', + BH = 'BAHRAIN', + BD = 'BANGLADESH', + BB = 'BARBADOS', + BY = 'BELARUS', + BE = 'BELGIUM', + BZ = 'BELIZE', + BJ = 'BENIN', + BM = 'BERMUDA', + BT = 'BHUTAN', + BO = 'BOLIVIA, PLURINATIONAL STATE OF', + BQ = 'BONAIRE, SINT EUSTATIUS AND SABA', + BA = 'BOSNIA AND HERZEGOVINA', + BW = 'BOTSWANA', + BV = 'BOUVET ISLAND', + BR = 'BRAZIL', + IO = 'BRITISH INDIAN OCEAN TERRITORY', + BN = 'BRUNEI DARUSSALAM', + BG = 'BULGARIA', + BF = 'BURKINA FASO', + BI = 'BURUNDI', + KH = 'CAMBODIA', + CM = 'CAMEROON', + CA = 'CANADA', + CV = 'CAPE VERDE', + KY = 'CAYMAN ISLANDS', + CF = 'CENTRAL AFRICAN REPUBLIC', + TD = 'CHAD', + CL = 'CHILE', + CN = 'CHINA', + CX = 'CHRISTMAS ISLAND', + CC = 'COCOS (KEELING) ISLANDS', + CO = 'COLOMBIA', + KM = 'COMOROS', + CG = 'CONGO', + CD = 'CONGO, THE DEMOCRATIC REPUBLIC OF THE', + CK = 'COOK ISLANDS', + CR = 'COSTA RICA', + CI = "CÔTE D'IVOIRE", + HR = 'CROATIA', + CU = 'CUBA', + CW = 'CURAÇAO', + CY = 'CYPRUS', + CZ = 'CZECH REPUBLIC', + DK = 'DENMARK', + DJ = 'DJIBOUTI', + DM = 'DOMINICA', + DO = 'DOMINICAN REPUBLIC', + EC = 'ECUADOR', + EG = 'EGYPT', + SV = 'EL SALVADOR', + GQ = 'EQUATORIAL GUINEA', + ER = 'ERITREA', + EE = 'ESTONIA', + ET = 'ETHIOPIA', + FK = 'FALKLAND ISLANDS (MALVINAS)', + FO = 'FAROE ISLANDS', + FJ = 'FIJI', + FI = 'FINLAND', + FR = 'FRANCE', + GF = 'FRENCH GUIANA', + PF = 'FRENCH POLYNESIA', + TF = 'FRENCH SOUTHERN TERRITORIES', + GA = 'GABON', + GM = 'GAMBIA', + GE = 'GEORGIA', + DE = 'GERMANY', + GH = 'GHANA', + GI = 'GIBRALTAR', + GR = 'GREECE', + GL = 'GREENLAND', + GD = 'GRENADA', + GP = 'GUADELOUPE', + GU = 'GUAM', + GT = 'GUATEMALA', + GG = 'GUERNSEY', + GN = 'GUINEA', + GW = 'GUINEA-BISSAU', + GY = 'GUYANA', + HT = 'HAITI', + HM = 'HEARD ISLAND AND MCDONALD ISLANDS', + VA = 'HOLY SEE (VATICAN CITY STATE)', + HN = 'HONDURAS', + HK = 'HONG KONG', + HU = 'HUNGARY', + IS = 'ICELAND', + IN = 'INDIA', + ID = 'INDONESIA', + IR = 'IRAN, ISLAMIC REPUBLIC OF', + IQ = 'IRAQ', + IE = 'IRELAND', + IM = 'ISLE OF MAN', + IL = 'ISRAEL', + IT = 'ITALY', + JM = 'JAMAICA', + JP = 'JAPAN', + JE = 'JERSEY', + JO = 'JORDAN', + KZ = 'KAZAKHSTAN', + KE = 'KENYA', + KI = 'KIRIBATI', + KP = "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF", + KR = 'KOREA, REPUBLIC OF', + XK = 'KOSOVO', + KW = 'KUWAIT', + KG = 'KYRGYZSTAN', + LA = "LAO PEOPLE'S DEMOCRATIC REPUBLIC", + LV = 'LATVIA', + LB = 'LEBANON', + LS = 'LESOTHO', + LR = 'LIBERIA', + LY = 'LIBYA', + LI = 'LIECHTENSTEIN', + LT = 'LITHUANIA', + LU = 'LUXEMBOURG', + MO = 'MACAO', + MK = 'MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF', + MG = 'MADAGASCAR', + MW = 'MALAWI', + MY = 'MALAYSIA', + MV = 'MALDIVES', + ML = 'MALI', + MT = 'MALTA', + MH = 'MARSHALL ISLANDS', + MQ = 'MARTINIQUE', + MR = 'MAURITANIA', + MU = 'MAURITIUS', + YT = 'MAYOTTE', + MX = 'MEXICO', + FM = 'MICRONESIA, FEDERATED STATES OF', + MD = 'MOLDOVA, REPUBLIC OF', + MC = 'MONACO', + MN = 'MONGOLIA', + ME = 'MONTENEGRO', + MS = 'MONTSERRAT', + MA = 'MOROCCO', + MZ = 'MOZAMBIQUE', + MM = 'MYANMAR', + NA = 'NAMIBIA', + NR = 'NAURU', + NP = 'NEPAL', + NL = 'NETHERLANDS', + NC = 'NEW CALEDONIA', + NZ = 'NEW ZEALAND', + NI = 'NICARAGUA', + NE = 'NIGER', + NG = 'NIGERIA', + NU = 'NIUE', + NF = 'NORFOLK ISLAND', + MP = 'NORTHERN MARIANA ISLANDS', + NO = 'NORWAY', + OM = 'OMAN', + PK = 'PAKISTAN', + PW = 'PALAU', + PS = 'PALESTINE, STATE OF', + PA = 'PANAMA', + PG = 'PAPUA NEW GUINEA', + PY = 'PARAGUAY', + PE = 'PERU', + PH = 'PHILIPPINES', + PN = 'PITCAIRN', + PL = 'POLAND', + PT = 'PORTUGAL', + PR = 'PUERTO RICO', + QA = 'QATAR', + RE = 'RÉUNION', + RO = 'ROMANIA', + RU = 'RUSSIAN FEDERATION', + RW = 'RWANDA', + BL = 'SAINT BARTHÉLEMY', + SH = 'SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA', + KN = 'SAINT KITTS AND NEVIS', + LC = 'SAINT LUCIA', + MF = 'SAINT MARTIN (FRENCH PART)', + PM = 'SAINT PIERRE AND MIQUELON', + VC = 'SAINT VINCENT AND THE GRENADINES', + WS = 'SAMOA', + SM = 'SAN MARINO', + ST = 'SAO TOME AND PRINCIPE', + SA = 'SAUDI ARABIA', + SN = 'SENEGAL', + RS = 'SERBIA', + SC = 'SEYCHELLES', + SL = 'SIERRA LEONE', + SG = 'SINGAPORE', + SX = 'SINT MAARTEN (DUTCH PART)', + SK = 'SLOVAKIA', + SI = 'SLOVENIA', + SB = 'SOLOMON ISLANDS', + SO = 'SOMALIA', + ZA = 'SOUTH AFRICA', + GS = 'SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS', + SS = 'SOUTH SUDAN', + ES = 'SPAIN', + LK = 'SRI LANKA', + SD = 'SUDAN', + SR = 'SURINAME', + SJ = 'SVALBARD AND JAN MAYEN', + SZ = 'SWAZILAND', + SE = 'SWEDEN', + CH = 'SWITZERLAND', + SY = 'SYRIAN ARAB REPUBLIC', + TW = 'TAIWAN, PROVINCE OF CHINA', + TJ = 'TAJIKISTAN', + TZ = 'TANZANIA, UNITED REPUBLIC OF', + TH = 'THAILAND', + TL = 'TIMOR-LESTE', + TG = 'TOGO', + TK = 'TOKELAU', + TO = 'TONGA', + TT = 'TRINIDAD AND TOBAGO', + TN = 'TUNISIA', + TR = 'TURKEY', + TM = 'TURKMENISTAN', + TC = 'TURKS AND CAICOS ISLANDS', + TV = 'TUVALU', + UG = 'UGANDA', + UA = 'UKRAINE', + AE = 'UNITED ARAB EMIRATES', + GB = 'UNITED KINGDOM', + US = 'UNITED STATES', + UM = 'UNITED STATES MINOR OUTLYING ISLANDS', + UY = 'URUGUAY', + UZ = 'UZBEKISTAN', + VU = 'VANUATU', + VE = 'VENEZUELA, BOLIVARIAN REPUBLIC OF', + VN = 'VIET NAM', + VG = 'VIRGIN ISLANDS, BRITISH', + VI = 'VIRGIN ISLANDS, U.S.', + WF = 'WALLIS AND FUTUNA', + EH = 'WESTERN SAHARA', + YE = 'YEMEN', + ZM = 'ZAMBIA', + ZW = 'ZIMBABWE', +} + +// https://github.com/powsybl/powsybl-core/blob/main/iidm/iidm-extensions/src/main/java/com/powsybl/iidm/network/extensions/Coordinate.java +export type Coordinate = { lon: number; lat: number; }; @@ -48,7 +303,6 @@ type LinePosition = { export class GeoData { substationPositionsById = new Map(); - linePositionsById = new Map(); constructor( diff --git a/src/components/network-map-viewer/network/layers/arrow-layer-fragment.frag b/src/components/network-map-viewer/network/layers/arrow-layer-fragment.frag new file mode 100644 index 00000000..9f926a5b --- /dev/null +++ b/src/components/network-map-viewer/network/layers/arrow-layer-fragment.frag @@ -0,0 +1,12 @@ +#version 300 es +#define SHADER_NAME arrow-layer-fragment-shader +precision highp float; +in vec4 vFillColor; +in float shouldDiscard; +out vec4 fragmentColor; +void main(void) { + if (shouldDiscard > 0.0) { + discard; + } + fragmentColor = vFillColor; +} diff --git a/src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.ts b/src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.ts deleted file mode 100644 index d646b48d..00000000 --- a/src/components/network-map-viewer/network/layers/arrow-layer-fragment.glsl.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2022, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -const fs = `\ -#version 300 es -#define SHADER_NAME arrow-layer-fragment-shader -precision highp float; -in vec4 vFillColor; -in float shouldDiscard; -out vec4 fragmentColor; -void main(void) { - if (shouldDiscard > 0.0) { - discard; - } - fragmentColor = vFillColor; -} -`; -export default fs; diff --git a/src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.ts b/src/components/network-map-viewer/network/layers/arrow-layer-vertex.vert similarity index 96% rename from src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.ts rename to src/components/network-map-viewer/network/layers/arrow-layer-vertex.vert index b20c6188..900c02b0 100644 --- a/src/components/network-map-viewer/network/layers/arrow-layer-vertex.glsl.ts +++ b/src/components/network-map-viewer/network/layers/arrow-layer-vertex.vert @@ -1,11 +1,3 @@ -/** - * Copyright (c) 2022, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -const vs = `\ #version 300 es #define SHADER_NAME arrow-layer-vertex-shader @@ -35,6 +27,7 @@ uniform float maxParallelOffset; uniform float minParallelOffset; uniform float opacity; uniform ivec2 linePositionsTextureSize; + uniform ivec2 lineDistancesTextureSize; out vec4 vFillColor; @@ -216,6 +209,3 @@ void main(void) { shouldDiscard = 0.0; } } -`; - -export default vs; diff --git a/src/components/network-map-viewer/network/layers/arrow-layer.ts b/src/components/network-map-viewer/network/layers/arrow-layer.ts index 083b8b19..3e92d066 100644 --- a/src/components/network-map-viewer/network/layers/arrow-layer.ts +++ b/src/components/network-map-viewer/network/layers/arrow-layer.ts @@ -31,8 +31,8 @@ import { UpdateParameters, } from 'deck.gl'; import { Line } from '../../utils/equipment-types'; -import fs from './arrow-layer-fragment.glsl'; -import vs from './arrow-layer-vertex.glsl'; +import fs from './arrow-layer-fragment.frag?raw'; +import vs from './arrow-layer-vertex.vert?raw'; const DEFAULT_COLOR = [0, 0, 0, 255] satisfies Color; @@ -171,7 +171,7 @@ export class ArrowLayer extends Layer> { const maxTextureSize = device.getParametersWebGL( GL.MAX_TEXTURE_SIZE - ) as number; + ) as unknown as number; this.state = { maxTextureSize, @@ -367,10 +367,10 @@ export class ArrowLayer extends Layer> { linePositionsTextureData.push(position[1]); linePointCount++; }); - lineDistancesTextureData.push(...line.cumulativeDistances); + lineDistancesTextureData.push(...line.cumulativeDistances!); lineDistance = - line.cumulativeDistances[ - line.cumulativeDistances.length - 1 + line.cumulativeDistances![ + line.cumulativeDistances!.length - 1 ]; } if (linePointCount > MAX_LINE_POINT_COUNT) { diff --git a/src/components/network-map-viewer/network/line-layer.ts b/src/components/network-map-viewer/network/line-layer.ts index c5ef6378..2e073a23 100644 --- a/src/components/network-map-viewer/network/line-layer.ts +++ b/src/components/network-map-viewer/network/line-layer.ts @@ -19,8 +19,8 @@ import { } from 'deck.gl'; import { getDistance } from 'geolib'; import { INVALID_FLOW_OPACITY } from '../../../utils/colors'; -import BoltIcon from '../images/bolt_black_24dp.svg'; -import PadlockIcon from '../images/lock_black_24dp.svg'; +import BoltIcon from '../images/bolt_black_24dp.svg?react'; +import PadlockIcon from '../images/lock_black_24dp.svg?react'; import { Line, LonLat } from '../utils/equipment-types'; import { SUBSTATION_RADIUS, @@ -38,16 +38,16 @@ const DISTANCE_BETWEEN_ARROWS = 10000.0; const START_ARROW_POSITION = 0.1; const END_ARROW_POSITION = 0.9; -export const LineFlowMode = { - STATIC_ARROWS: 'staticArrows', - ANIMATED_ARROWS: 'animatedArrows', - FEEDERS: 'feeders', -}; +export enum LineFlowMode { + STATIC_ARROWS = 'staticArrows', + ANIMATED_ARROWS = 'animatedArrows', + FEEDERS = 'feeders', +} -export const LineFlowColorMode = { - NOMINAL_VOLTAGE: 'nominalVoltage', - OVERLOADS: 'overloads', -}; +export enum LineFlowColorMode { + NOMINAL_VOLTAGE = 'nominalVoltage', + OVERLOADS = 'overloads', +} const noDashArray = [0, 0]; const dashArray = [15, 10]; @@ -276,8 +276,8 @@ type _LineLayerProps = { getNominalVoltageColor: (voltage: number) => Color; disconnectedLineColor: Color; filteredNominalVoltages: number[] | null; - lineFlowMode: string; - lineFlowColorMode: string; + lineFlowMode: LineFlowMode; + lineFlowColorMode: LineFlowColorMode; lineFlowAlertThreshold: number; showLineFlow: boolean; lineFullPath: boolean; @@ -425,7 +425,7 @@ export class LineLayer extends CompositeLayer> { }); linesStatus!.set(line.id, { - operatingStatus: line.operatingStatus, + operatingStatus: line.operatingStatus!, }); const key = this.genLineKey(line); @@ -450,7 +450,7 @@ export class LineLayer extends CompositeLayer> { terminal2Connected: line1.terminal2Connected, }); linesStatus!.set(line1.id, { - operatingStatus: line1.operatingStatus, + operatingStatus: line1.operatingStatus!, }); }); } @@ -523,7 +523,7 @@ export class LineLayer extends CompositeLayer> { lineData.cumulativeDistances, START_ARROW_POSITION, arrowDirection, - line.parallelIndex, + line.parallelIndex!, (line.angle! * 180) / Math.PI, (line.angleStart! * 180) / Math.PI, props.distanceBetweenLines, @@ -534,7 +534,7 @@ export class LineLayer extends CompositeLayer> { lineData.cumulativeDistances, END_ARROW_POSITION, arrowDirection, - line.parallelIndex, + line.parallelIndex!, (line.angle! * 180) / Math.PI, (line.angleEnd! * 180) / Math.PI, props.distanceBetweenLines, @@ -589,7 +589,7 @@ export class LineLayer extends CompositeLayer> { lineData.cumulativeDistances, 0.5, ArrowDirection.NONE, - line.parallelIndex, + line.parallelIndex!, (line.angle! * 180) / Math.PI, (line.angleEnd! * 180) / Math.PI, props.distanceBetweenLines, @@ -846,7 +846,7 @@ export class LineLayer extends CompositeLayer> { line.angleStart, line.angle, line.angleEnd, - line.parallelIndex * 2 + + line.parallelIndex! * 2 + 31 + 64 * (Math.ceil(line.proximityFactorStart! * 512) - @@ -1029,7 +1029,7 @@ export class LineLayer extends CompositeLayer> { ), getWidth: 2, getProximityFactor: (line: Line) => line.proximityFactorEnd, - getLineParallelIndex: (line: Line) => -line.parallelIndex, + getLineParallelIndex: (line: Line) => -line.parallelIndex!, getLineAngle: (line: Line) => line.angleEnd! + Math.PI, getDistanceBetweenLines: this.props.distanceBetweenLines, getMaxParallelOffset: this.props.maxParallelOffset, diff --git a/src/components/network-map-viewer/network/map-equipments.ts b/src/components/network-map-viewer/network/map-equipments.ts index 1e39118a..297fbb4d 100644 --- a/src/components/network-map-viewer/network/map-equipments.ts +++ b/src/components/network-map-viewer/network/map-equipments.ts @@ -6,15 +6,13 @@ */ import { - HvdcLine, Line, Substation, - TieLine, VoltageLevel, } from '@/components/network-map-viewer/utils/equipment-types'; -import { EQUIPMENT_TYPES, Equiment } from '../utils/equipment-types'; +import { EQUIPMENT_TYPES, Equipment } from '../utils/equipment-types'; -const elementIdIndexer = ( +const elementIdIndexer = ( map: Map, element: T ) => { @@ -24,39 +22,28 @@ const elementIdIndexer = ( export class MapEquipments { substations: Substation[] = []; - substationsById = new Map(); - lines: Line[] = []; - linesById = new Map(); - - tieLines: TieLine[] = []; - - tieLinesById = new Map(); - - hvdcLines: HvdcLine[] = []; - - hvdcLinesById = new Map(); - + tieLines: Line[] = []; + tieLinesById = new Map(); + hvdcLines: Line[] = []; + hvdcLinesById = new Map(); voltageLevels: VoltageLevel[] = []; - voltageLevelsById = new Map(); - nominalVoltages: number[] = []; - intlRef = undefined; constructor() { // dummy constructor, to make children classes constructors happy } - newMapEquipmentForUpdate() { + newMapEquipmentForUpdate(): MapEquipments { /* shallow clone of the map-equipment https://stackoverflow.com/a/44782052 */ return Object.assign(Object.create(Object.getPrototypeOf(this)), this); } - checkAndGetValues(equipments: Equiment[]) { + checkAndGetValues(equipments: Equipment[]) { return equipments ? equipments : []; } @@ -94,7 +81,7 @@ export class MapEquipments { ); } - updateEquipments( + updateEquipments( currentEquipments: T[], newEquipements: T[], _equipmentType: EQUIPMENT_TYPES @@ -170,7 +157,7 @@ export class MapEquipments { } } - completeTieLinesInfos(equipementsToIndex: Equiment[]) { + completeTieLinesInfos(equipementsToIndex: Line[]) { if (equipementsToIndex?.length > 0) { equipementsToIndex.forEach((tieLine) => { this.tieLinesById?.set(tieLine.id, tieLine); @@ -195,7 +182,7 @@ export class MapEquipments { this.completeLinesInfos(fullReload ? [] : lines); } - updateTieLines(tieLines: TieLine[], fullReload: boolean) { + updateTieLines(tieLines: Line[], fullReload: boolean) { if (fullReload) { this.tieLines = []; } @@ -207,7 +194,7 @@ export class MapEquipments { this.completeTieLinesInfos(fullReload ? [] : tieLines); } - updateHvdcLines(hvdcLines: HvdcLine[], fullReload: boolean) { + updateHvdcLines(hvdcLines: Line[], fullReload: boolean) { if (fullReload) { this.hvdcLines = []; } @@ -219,7 +206,7 @@ export class MapEquipments { this.completeHvdcLinesInfos(fullReload ? [] : hvdcLines); } - completeHvdcLinesInfos(equipementsToIndex: HvdcLine[]) { + completeHvdcLinesInfos(equipementsToIndex: Line[]) { if (equipementsToIndex?.length > 0) { equipementsToIndex.forEach((hvdcLine) => { this.hvdcLinesById?.set(hvdcLine.id, hvdcLine); diff --git a/src/components/network-map-viewer/network/network-map.tsx b/src/components/network-map-viewer/network/network-map.tsx index 89befe66..f761d8ab 100644 --- a/src/components/network-map-viewer/network/network-map.tsx +++ b/src/components/network-map-viewer/network/network-map.tsx @@ -6,6 +6,7 @@ */ import React, { + ReactNode, forwardRef, useCallback, useEffect, @@ -20,7 +21,7 @@ import LoaderWithOverlay from '../utils/loader-with-overlay'; import { MapboxOverlay, MapboxOverlayProps } from '@deck.gl/mapbox'; import { Replay } from '@mui/icons-material'; -import { Button, useTheme } from '@mui/material'; +import { Button, ButtonProps, useTheme } from '@mui/material'; import { FormattedMessage } from 'react-intl'; import { Map, @@ -31,10 +32,20 @@ import { useMap, } from 'react-map-gl/maplibre'; import { getNominalVoltageColor } from '../../../utils/colors'; +import { isLine, isSubstation, isVoltageLevel } from '../utils/equipment-types'; import { useNameOrId } from '../utils/equipmentInfosHandler'; -import DrawControl, { DRAW_MODES, getMapDrawer } from './draw-control'; +import DrawControl, { + DRAW_MODES, + DrawControlProps, + getMapDrawer, +} from './draw-control'; import { GeoData } from './geo-data'; -import { LineFlowColorMode, LineFlowMode, LineLayer } from './line-layer'; +import { + LineFlowColorMode, + LineFlowMode, + LineLayer, + LineLayerProps, +} from './line-layer'; import { MapEquipments } from './map-equipments'; import { SubstationLayer } from './substation-layer'; @@ -47,12 +58,11 @@ import 'maplibre-gl/dist/maplibre-gl.css'; import { EQUIPMENT_TYPES, EquimentLine, - HvdcLine, + Equipment, HvdcLineEquimentLine, Line, LineEquimentLine, Substation, - TieLine, TieLineEquimentLine, VoltageLevel, } from '../utils/equipment-types'; @@ -66,11 +76,17 @@ const MOUSE_EVENT_BUTTON_RIGHT = 2; * when a draw event is triggered, the event type is passed to the onDrawEvent callback * On create, when the user create a new polygon (shape finished) */ -export const DRAW_EVENT = { - CREATE: 1, - UPDATE: 2, - DELETE: 0, -}; +export enum DRAW_EVENT { + CREATE = 1, + UPDATE = 2, + DELETE = 0, +} + +export type MenuClickFunction = ( + equipment: T, + eventX: number, + eventY: number +) => void; // Small boilerplate recommended by deckgl, to bridge to a react-map-gl control declaratively // see https://deck.gl/docs/api-reference/mapbox/mapbox-overlay#using-with-react-map-gl @@ -83,6 +99,14 @@ const DeckGLOverlay = React.forwardRef( } ); +type TooltipType = { + equipmentId: string; + equipmentType: string; + pointerX: number; + pointerY: number; + visible: boolean; +}; + const PICKING_RADIUS = 5; const CARTO = 'carto'; @@ -129,79 +153,74 @@ const INITIAL_CENTERED = { } satisfies Centered; // get polygon coordinates (features) or an empty object -function getPolygonFeatures(): Partial { +function getPolygonFeatures(): Feature | Record { return getMapDrawer()?.getAll()?.features[0] ?? {}; } type NetworkMapProps = { - disabled: boolean; - geoData: GeoData; - mapBoxToken: string; - mapEquipments: MapEquipments; - mapLibrary: 'carto' | 'cartonolabel' | 'mapbox'; - mapTheme: 'light' | 'dark'; - - areFlowsValid: boolean; - arrowsZoomThreshold: number; - centerOnSubstation: any; - displayOverlayLoader: boolean; - filteredNominalVoltages: number[] | null; - initialPosition: number[]; - initialZoom: number; - isManualRefreshBackdropDisplayed: boolean; - labelsZoomThreshold: number; - lineFlowAlertThreshold: number; - lineFlowColorMode: 'nominalVoltage' | 'overloads'; - lineFlowHidden: boolean; - lineFlowMode: 'staticArrows' | 'animatedArrows' | 'feeders'; - lineFullPath: boolean; - lineParallelPath: boolean; - renderPopover: (eId: any) => any; - tooltipZoomThreshold: number; + disabled?: boolean; + geoData?: GeoData | null; + mapBoxToken?: string | null; + mapEquipments?: MapEquipments | null; + mapLibrary?: 'carto' | 'cartonolabel' | 'mapbox'; + mapTheme?: 'light' | 'dark'; + areFlowsValid?: boolean; + arrowsZoomThreshold?: number; + centerOnSubstation?: { to: string } | null; + displayOverlayLoader?: boolean; + filteredNominalVoltages?: number[] | null; + initialPosition?: [number, number]; + initialZoom?: number; + isManualRefreshBackdropDisplayed?: boolean; + labelsZoomThreshold?: number; + lineFlowAlertThreshold?: number; + lineFlowColorMode?: LineFlowColorMode; + lineFlowHidden?: boolean; + lineFlowMode?: LineFlowMode; + lineFullPath?: boolean; + lineParallelPath?: boolean; + renderPopover?: ( + equipmentId: string, + divRef: HTMLDivElement | null + ) => ReactNode; + tooltipZoomThreshold?: number; // With mapboxgl v2 (not a problem with maplibre), we need to call // map.resize() when the parent size has changed, otherwise the map is not // redrawn. It seems like this is autodetected when the browser window is // resized, but not for programmatic resizes of the parent. For now in our // app, only study display mode resizes programmatically // use this prop to make the map resize when needed, each time this prop changes, map.resize() is trigged - triggerMapResizeOnChange: any; - updatedLines: any[]; - useName: boolean; - visible: boolean; - shouldDisableToolTip: boolean; - - onHvdcLineMenuClick: (hvdcLine: HvdcLine, x: number, y: number) => void; - onLineMenuClick: (line: Line, x: number, y: number) => void; - onTieLineMenuClick: (tieLine: TieLine, x: number, y: number) => void; - onManualRefreshClick: () => void; - onSubstationClick: (voltageLevelId: any) => void; - onSubstationClickChooseVoltageLevel: ( - substationId: any, - x: number, - y: number + triggerMapResizeOnChange?: unknown; + updatedLines?: LineLayerProps['updatedLines']; + useName?: boolean; + visible?: boolean; + shouldDisableToolTip?: boolean; + onHvdcLineMenuClick?: MenuClickFunction; + onLineMenuClick?: MenuClickFunction; + onTieLineMenuClick?: MenuClickFunction; + onManualRefreshClick?: ButtonProps['onClick']; + onSubstationClick?: (idVoltageLevel: string) => void; + onSubstationClickChooseVoltageLevel?: ( + idSubstation: string, + eventX: number, + eventY: number ) => void; - onSubstationMenuClick: ( - substation: Substation, - x: number, - y: number + onSubstationMenuClick?: MenuClickFunction; + onVoltageLevelMenuClick?: MenuClickFunction; + onDrawPolygonModeActive?: DrawControlProps['onDrawPolygonModeActive']; + onPolygonChanged?: ( + polygoneFeature: Feature | Record ) => void; - onVoltageLevelMenuClick: ( - voltageLevel: VoltageLevel, - x: number, - y: number - ) => void; - onDrawPolygonModeActive: (polygon_draw: boolean) => void; - onPolygonChanged: (polygonFeatures: any) => void; - onDrawEvent: (drawEvent: number) => void; + onDrawEvent?: (drawEvent: DRAW_EVENT) => void; }; export type NetworkMapRef = { - getSelectedSubstations: () => any; - getSelectedLines: () => any; - cleanDraw: () => any; - getMapDrawer: () => any; + getSelectedSubstations: () => Substation[]; + getSelectedLines: () => Line[]; + cleanDraw: () => void; + getMapDrawer: () => MapboxDraw | undefined; }; -const NetworkMap = forwardRef>( +const NetworkMap = forwardRef( ( { areFlowsValid = true, @@ -256,7 +275,9 @@ const NetworkMap = forwardRef>( const deckRef = useRef(null); const [centered, setCentered] = useState(INITIAL_CENTERED); const lastViewStateRef = useRef(); - const [tooltip, setTooltip] = useState({}); + const [tooltip, setTooltip] = useState< + TooltipType | Record | null + >({}); const theme = useTheme(); const foregroundNeutralColor = useMemo(() => { const labelColor = decomposeColor(theme.palette.text.primary) @@ -324,7 +345,7 @@ const NetworkMap = forwardRef>( mapEquipments?.lines, ]) as EquimentLine[]; - const divRef = useRef(); + const divRef = useRef(null); const mToken = !mapBoxToken ? FALLBACK_MAPBOX_TOKEN : mapBoxToken; @@ -425,7 +446,9 @@ const NetworkMap = forwardRef>( function onViewStateChange(info: ViewStateChangeEvent) { lastViewStateRef.current = info.viewState; if ( + // @ts-expect-error: TODO fix interactionState !info.interactionState || // first event of before an animation (e.g. clicking the +/- buttons of the navigation controls, gives the target + // @ts-expect-error: TODO fix interactionState (info.interactionState && !info.interactionState.inTransition) // Any event not part of a animation (mouse panning or zooming) ) { if ( @@ -462,15 +485,17 @@ const NetworkMap = forwardRef>( top: tooltip.pointerY, }} > - {renderPopover(tooltip.equipmentId, divRef.current)} + {tooltip.equipmentId && + divRef.current && + renderPopover(tooltip.equipmentId, divRef.current)} ) ); } function onClickHandler( - info: PickingInfo, - event: mapboxgl.MapLayerMouseEvent, + info: PickingInfo>, + event: mapboxgl.MapLayerMouseEvent | maplibregl.MapLayerMouseEvent, network: MapEquipments ) { const leftButton = @@ -481,16 +506,16 @@ const NetworkMap = forwardRef>( info.layer && info.layer.id.startsWith(SUBSTATION_LAYER_PREFIX) && info.object && - (info.object.substationId || info.object.voltageLevels) // is a voltage level marker, or a substation text + (isSubstation(info.object) || isVoltageLevel(info.object)) // is a voltage level marker, or a substation text ) { let idVl; let idSubstation; - if (info.object.substationId) { + if (isVoltageLevel(info.object)) { idVl = info.object.id; - } else if (info.object.voltageLevels) { + } else if (isSubstation(info.object)) { if (info.object.voltageLevels.length === 1) { const idS = info.object.voltageLevels[0].substationId; - const substation = network.getSubstation(idS); + const substation = network?.getSubstation(idS); if (substation && substation.voltageLevels.length > 1) { idSubstation = idS; } else { @@ -506,7 +531,7 @@ const NetworkMap = forwardRef>( onSubstationClick(idVl); } else if (onVoltageLevelMenuClick && rightButton) { onVoltageLevelMenuClick( - network.getVoltageLevel(idVl), + network.getVoltageLevel(idVl)!, event.originalEvent.x, event.originalEvent.y ); @@ -521,7 +546,7 @@ const NetworkMap = forwardRef>( ); } else if (onSubstationMenuClick && rightButton) { onSubstationMenuClick( - network.getSubstation(idSubstation), + network.getSubstation(idSubstation)!, event.originalEvent.x, event.originalEvent.y ); @@ -533,9 +558,7 @@ const NetworkMap = forwardRef>( info.layer && info.layer.id.startsWith(LINE_LAYER_PREFIX) && info.object && - info.object.id && - info.object.voltageLevelId1 && - info.object.voltageLevelId2 + isLine(info.object) ) { // picked line properties are retrieved from network data and not from pickable object infos, // because pickable object infos might not be up to date @@ -561,7 +584,9 @@ const NetworkMap = forwardRef>( } } - function onMapContextMenu(event: mapboxgl.MapLayerMouseEvent) { + function onMapContextMenu( + event: mapboxgl.MapLayerMouseEvent | maplibregl.MapLayerMouseEvent + ) { const info = deckRef.current && deckRef.current.pickObject({ @@ -569,7 +594,7 @@ const NetworkMap = forwardRef>( y: event.point.y, radius: PICKING_RADIUS, }); - info && onClickHandler(info, event, mapEquipments); + info && mapEquipments && onClickHandler(info, event, mapEquipments); } function cursorHandler() { @@ -622,13 +647,17 @@ const NetworkMap = forwardRef>( labelColor: foregroundNeutralColor, labelSize: LABEL_SIZE, pickable: true, - onHover: ({ object, x, y }) => { - if (object) { + onHover: ({ + object: lineObject, + x, + y, + }: PickingInfo) => { + if (lineObject) { setCursorType('pointer'); - const lineObject = object?.line ?? object; setTooltip({ equipmentId: lineObject?.id, - equipmentType: lineObject?.equipmentType, + equipmentType: (lineObject as EquimentLine) + ?.equipmentType, pointerX: x, pointerY: y, visible: showTooltip, @@ -662,7 +691,7 @@ const NetworkMap = forwardRef>( useEffect(() => { mapRef.current?.resize(); - }, [triggerMapResizeOnChange]); + }, [mapRef, triggerMapResizeOnChange]); const getMapStyle = (mapLibrary: MapLibrary, mapTheme: MapTheme) => { switch (mapLibrary) { @@ -729,7 +758,7 @@ const NetworkMap = forwardRef>( mapEquipments, mapEquipmentsLines, geoData, - polygonCoordinates + polygonCoordinates as Polygon ); return selectedLines.filter((line) => { return filteredNominalVoltages!.some((nv) => { @@ -828,6 +857,7 @@ const NetworkMap = forwardRef>( { + //@ts-expect-error: TODO fix srcEvent onClickHandler(info, event.srcEvent, mapEquipments); }} onAfterRender={onAfterRender} // TODO simplify this diff --git a/src/components/network-map-viewer/utils/equipment-types.ts b/src/components/network-map-viewer/utils/equipment-types.ts index 0bbce63c..65952503 100644 --- a/src/components/network-map-viewer/utils/equipment-types.ts +++ b/src/components/network-map-viewer/utils/equipment-types.ts @@ -41,7 +41,7 @@ export type VoltageLevel = { id: string; nominalV: number; substationId: string; - substationName: string; + substationName?: string; }; export type Substation = { @@ -50,6 +50,14 @@ export type Substation = { voltageLevels: VoltageLevel[]; }; +export const isVoltageLevel = ( + object: Record +): object is VoltageLevel => 'substationId' in object; + +export const isSubstation = ( + object: Record +): object is Substation => 'voltageLevels' in object; + export type Line = { id: string; voltageLevelId1: string; @@ -59,30 +67,35 @@ export type Line = { terminal2Connected: boolean; p1: number; p2: number; - i1: number | undefined; - i2: number | undefined; - operatingStatus: LineStatus; - currentLimits1: { + i1?: number; + i2?: number; + operatingStatus?: LineStatus; + currentLimits1?: { permanentLimit: number; } | null; - currentLimits2: { + currentLimits2?: { permanentLimit: number; } | null; // additionnal from line-layer - origin: LonLat | undefined; - end: LonLat | undefined; - substationIndexStart: number | undefined; - substationIndexEnd: number | undefined; - angle: number | undefined; - angleStart: number | undefined; - angleEnd: number | undefined; - proximityFactorStart: number | undefined; - proximityFactorEnd: number | undefined; - parallelIndex: number; - cumulativeDistances: number[]; - positions: LonLat[]; + origin?: LonLat; + end?: LonLat; + substationIndexStart?: number; + substationIndexEnd?: number; + angle?: number; + angleStart?: number; + angleEnd?: number; + proximityFactorStart?: number; + proximityFactorEnd?: number; + parallelIndex?: number; + cumulativeDistances?: number[]; + positions?: LonLat[]; }; +export const isLine = (object: Record): object is Line => + 'id' in object && + 'voltageLevelId1' in object && + 'voltageLevelId2' in object; + export type TieLine = { id: string; }; @@ -101,14 +114,14 @@ export type HvdcLine = { maxP: number; }; -export type Equiment = Line | Substation | TieLine | HvdcLine; +export type Equipment = Line | Substation | TieLine | HvdcLine; // type EquimentLineTypes = EQUIPMENT_TYPES.LINE | EQUIPMENT_TYPES.TIE_LINE | EQUIPMENT_TYPES.HVDC_LINE; export type LineEquimentLine = Line & { equipmentType: EQUIPMENT_TYPES.LINE }; -export type TieLineEquimentLine = TieLine & { +export type TieLineEquimentLine = Line & { equipmentType: EQUIPMENT_TYPES.TIE_LINE; }; -export type HvdcLineEquimentLine = HvdcLine & { +export type HvdcLineEquimentLine = Line & { equipmentType: EQUIPMENT_TYPES.HVDC_LINE; }; export type EquimentLine = diff --git a/src/components/network-map-viewer/utils/equipmentInfosHandler.ts b/src/components/network-map-viewer/utils/equipmentInfosHandler.ts index 7debcbb9..57a55565 100644 --- a/src/components/network-map-viewer/utils/equipmentInfosHandler.ts +++ b/src/components/network-map-viewer/utils/equipmentInfosHandler.ts @@ -6,16 +6,20 @@ */ import { useCallback } from 'react'; -import { Substation } from './equipment-types'; + +type EquipmentInfos = { + id: string; + name: string | null; +}; export const useNameOrId = (useName: boolean) => { const getNameOrId = useCallback( - (infos: Substation) => { + (infos: EquipmentInfos | null) => { if (infos != null) { const name = infos.name; return useName && name != null && name.trim() !== '' ? name - : infos?.id; + : infos?.id ?? null; } return null; }, diff --git a/src/components/network-map-viewer/utils/loader-with-overlay.tsx b/src/components/network-map-viewer/utils/loader-with-overlay.tsx index 7909e7a4..c78ca5e1 100644 --- a/src/components/network-map-viewer/utils/loader-with-overlay.tsx +++ b/src/components/network-map-viewer/utils/loader-with-overlay.tsx @@ -5,11 +5,18 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { CircularProgress } from '@mui/material'; -import { Box } from '@mui/system'; +import { CircularProgress, CircularProgressProps } from '@mui/material'; +import { Box, SxProps, Theme } from '@mui/system'; import { FormattedMessage } from 'react-intl'; -const styles = { +type LoaderWithOverlayProps = { + color: CircularProgressProps['color']; + loaderSize: CircularProgressProps['size']; + loadingMessageText: string; + isFixed: boolean; +}; + +const styles: Record> = { overlay: { top: 0, bottom: 0, @@ -27,19 +34,12 @@ const styles = { }, }; -type LoaderWithOverlayProps = { - color: 'primary' | 'secondary' | 'inherit'; - loaderSize: number; - loadingMessageText: string; - isFixed: boolean; -}; - -const LoaderWithOverlay = ({ +export default function LoaderWithOverlay({ color, loaderSize, loadingMessageText, isFixed, -}: LoaderWithOverlayProps) => { +}: Readonly) { return ( ); -}; - -export default LoaderWithOverlay; +} diff --git a/src/components/single-line-diagram-viewer/single-line-diagram-viewer.ts b/src/components/single-line-diagram-viewer/single-line-diagram-viewer.ts index 966e40eb..7e92b5ec 100644 --- a/src/components/single-line-diagram-viewer/single-line-diagram-viewer.ts +++ b/src/components/single-line-diagram-viewer/single-line-diagram-viewer.ts @@ -127,7 +127,7 @@ export type OnBusCallbackType = ( y: number ) => void; -export type handleTogglePopoverType = ( +export type HandleTogglePopoverType = ( shouldDisplay: boolean, anchorEl: EventTarget | null, equipmentId: string, @@ -151,7 +151,7 @@ export class SingleLineDiagramViewer { arrowSvg: string; arrowHoverSvg: string; svgDraw: Svg | undefined; - handleTogglePopover: handleTogglePopoverType | null; + handleTogglePopover: HandleTogglePopoverType | null; constructor( container: HTMLElement, @@ -167,7 +167,7 @@ export class SingleLineDiagramViewer { onFeederCallback: OnFeederCallbackType | null, onBusCallback: OnBusCallbackType | null, selectionBackColor: string | null, - handleTogglePopover: handleTogglePopoverType | null + handleTogglePopover: HandleTogglePopoverType | null ) { this.container = container; this.svgType = svgType; diff --git a/src/index.ts b/src/index.ts index 109c8184..12624c86 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,18 +6,28 @@ */ export { NetworkAreaDiagramViewer } from './components/network-area-diagram-viewer/network-area-diagram-viewer'; -export { SingleLineDiagramViewer } from './components/single-line-diagram-viewer/single-line-diagram-viewer'; export { GeoData } from './components/network-map-viewer/network/geo-data'; export { - LineFlowMode, LineFlowColorMode, - LineLoadingZone, - getLineLoadingZone, + LineFlowMode, } from './components/network-map-viewer/network/line-layer'; export { MapEquipments } from './components/network-map-viewer/network/map-equipments'; export { - default as NetworkMap, DRAW_EVENT, + default as NetworkMap, } from './components/network-map-viewer/network/network-map'; +export type { NetworkMapRef } from './components/network-map-viewer/network/network-map'; +export { SingleLineDiagramViewer } from './components/single-line-diagram-viewer/single-line-diagram-viewer'; +export type { + HandleTogglePopoverType, + OnBreakerCallbackType, + OnBusCallbackType, + OnFeederCallbackType, + OnNextVoltageCallbackType, + SLDMetadata, + SLDMetadataComponent, + SLDMetadataComponentSize, + SLDMetadataNode, +} from './components/single-line-diagram-viewer/single-line-diagram-viewer'; export { DRAW_MODES } from './components/network-map-viewer/network/draw-control'; diff --git a/src/types/glsl.d.ts b/src/types/glsl.d.ts deleted file mode 100644 index d15c624d..00000000 --- a/src/types/glsl.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.glsl' { - const value: string; - export default value; -} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..ee9857a6 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/vite.config.ts b/vite.config.ts index 6f818930..45c20bbe 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,35 +5,19 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { resolve } from 'path'; -import { defineConfig } from 'vite'; -// import eslint from 'vite-plugin-eslint'; import react from '@vitejs/plugin-react'; -import path from 'path'; -import dts from 'vite-plugin-dts'; -import { externalizeDeps } from 'vite-plugin-externalize-deps'; +import * as path from 'node:path'; +import { defineConfig } from 'vite'; +import svgr from 'vite-plugin-svgr'; -export default defineConfig((config) => ({ +export default defineConfig((_config) => ({ plugins: [ react(), + svgr(), // works on every import with the pattern "**/*.svg?react" // eslint({ // failOnWarning: config.mode !== 'development', // lintOnStart: true, // }), - dts({ - include: ['src'], - }), - //https://stackoverflow.com/questions/59134241/using-deck-gl-as-webpack-external - //https://github.com/visgl/deck.gl/blob/94bad4bb209a5da0686fb03f107e86b18199c108/website/webpack.config.js#L128-L141 - externalizeDeps({ - include: [ - /^@deck.gl(?:\/.*)?$/, - /^@loaders.gl(?:\/.*)?$/, - /^@luma.gl(?:\/.*)?$/, - /^@probe.gl(?:\/.*)?$/, - 'prop-types', - ], - }), ], resolve: { alias: { @@ -41,15 +25,19 @@ export default defineConfig((config) => ({ }, }, build: { - minify: false, + minify: false, // easier to debug on the apps using this lib lib: { // Could also be a dictionary or array of multiple entry points - entry: resolve(__dirname, 'src/index.ts'), - name: 'Powsybl diagram viewer', + entry: path.resolve(__dirname, 'src/index.ts'), + name: 'PowSyBl diagram viewer', // the proper extensions will be added fileName: 'powsybl-diagram-viewer', }, rollupOptions: { + //https://stackoverflow.com/questions/59134241/using-deck-gl-as-webpack-external + //https://github.com/visgl/deck.gl/blob/94bad4bb209a5da0686fb03f107e86b18199c108/website/webpack.config.js#L128-L141 + external: (id: string) => + !id.startsWith('.') && !path.isAbsolute(id), output: { // preserveModules: true, // entryFileNames: '[name].js', // override vite and allow to keep the original tree and .js extension even in ESM From 421d0c78f6d300eea5a4658024df1ab2f12ba897 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Fri, 26 Jul 2024 08:58:07 +0200 Subject: [PATCH 04/10] export layers to their own package --- .gitignore | 3 + package-lock.json | 619 +- package.json | 4 + .../network-map-layers/dist/constants.d.ts | 9 + packages/network-map-layers/dist/index.d.ts | 6 + .../dist/network/geo-data.d.ts | 304 + .../dist/network/layers/arrow-layer.d.ts | 86 + .../dist/network/layers/fork-line-layer.d.ts | 43 + .../network/layers/parallel-path-layer.d.ts | 35 + .../network/layers/scatterplot-layer-ext.d.ts | 17 + .../dist/network/line-layer.d.ts | 150 + .../dist/network/map-equipments.d.ts | 41 + .../dist/network/substation-layer.d.ts | 39 + .../dist/powsybl-network-map-layers.js | 5548 +++++++++++++++++ .../network-map-layers/dist/utils/colors.d.ts | 5 + .../dist/utils/equipment-types.d.ts | 110 + packages/network-map-layers/package.json | 38 + .../network-map-layers/src}/constants.ts | 0 .../src}/images/bolt_black_24dp.svg | 0 .../src}/images/lock_black_24dp.svg | 0 packages/network-map-layers/src/index.ts | 10 + .../src}/network/geo-data.ts | 2 +- .../network/layers/arrow-layer-fragment.frag | 0 .../network/layers/arrow-layer-vertex.vert | 0 .../src}/network/layers/arrow-layer.ts | 5 +- .../src}/network/layers/fork-line-layer.ts | 4 +- .../network/layers/parallel-path-layer.ts | 4 +- .../network/layers/scatterplot-layer-ext.ts | 4 +- .../src}/network/line-layer.ts | 25 +- .../src}/network/map-equipments.ts | 5 +- .../src}/network/substation-layer.ts | 10 +- .../network-map-layers/src}/utils/colors.ts | 2 +- .../src}/utils/equipment-types.ts | 2 +- packages/network-map-layers/src/vite-env.d.ts | 2 + packages/network-map-layers/tsconfig.json | 22 + packages/network-map-layers/vite.config.ts | 34 + .../network/network-map.tsx | 28 +- src/index.ts | 8 +- vite.config.ts | 5 + 39 files changed, 7177 insertions(+), 52 deletions(-) create mode 100644 packages/network-map-layers/dist/constants.d.ts create mode 100644 packages/network-map-layers/dist/index.d.ts create mode 100644 packages/network-map-layers/dist/network/geo-data.d.ts create mode 100644 packages/network-map-layers/dist/network/layers/arrow-layer.d.ts create mode 100644 packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts create mode 100644 packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts create mode 100644 packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts create mode 100644 packages/network-map-layers/dist/network/line-layer.d.ts create mode 100644 packages/network-map-layers/dist/network/map-equipments.d.ts create mode 100644 packages/network-map-layers/dist/network/substation-layer.d.ts create mode 100644 packages/network-map-layers/dist/powsybl-network-map-layers.js create mode 100644 packages/network-map-layers/dist/utils/colors.d.ts create mode 100644 packages/network-map-layers/dist/utils/equipment-types.d.ts create mode 100644 packages/network-map-layers/package.json rename {src/components/network-map-viewer/network => packages/network-map-layers/src}/constants.ts (100%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/images/bolt_black_24dp.svg (100%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/images/lock_black_24dp.svg (100%) create mode 100644 packages/network-map-layers/src/index.ts rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/geo-data.ts (99%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/layers/arrow-layer-fragment.frag (100%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/layers/arrow-layer-vertex.vert (100%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/layers/arrow-layer.ts (98%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/layers/fork-line-layer.ts (98%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/layers/parallel-path-layer.ts (98%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/layers/scatterplot-layer-ext.ts (92%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/line-layer.ts (99%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/map-equipments.ts (98%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/network/substation-layer.ts (98%) rename {src => packages/network-map-layers/src}/utils/colors.ts (96%) rename {src/components/network-map-viewer => packages/network-map-layers/src}/utils/equipment-types.ts (98%) create mode 100644 packages/network-map-layers/src/vite-env.d.ts create mode 100644 packages/network-map-layers/tsconfig.json create mode 100644 packages/network-map-layers/vite.config.ts diff --git a/.gitignore b/.gitignore index 9902e3c0..50782a86 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ /demo/dist +# packages +/packages/*/node_modules + diff --git a/package-lock.json b/package-lock.json index ea6fb84b..b4f90edb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,12 @@ "name": "@powsybl/diagram-viewer", "version": "0.5.1", "license": "MPL-2.0", + "workspaces": [ + "packages/network-map-layers" + ], "dependencies": { "@mapbox/mapbox-gl-draw": "^1.4.3", + "@powsybl/network-map-layers": "^0.6.0", "@svgdotjs/svg.js": "^3.2.4", "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", @@ -4726,6 +4730,10 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@powsybl/network-map-layers": { + "resolved": "packages/network-map-layers", + "link": true + }, "node_modules/@probe.gl/env": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.0.9.tgz", @@ -6553,6 +6561,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -7439,6 +7486,12 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true + }, "node_modules/composed-offset-position": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.4.tgz", @@ -7457,6 +7510,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -7823,9 +7882,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -9008,6 +9067,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fast-xml-parser": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", @@ -12298,6 +12363,22 @@ "@types/trusted-types": "^2.0.2" } }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12688,6 +12769,30 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -13140,6 +13245,12 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, "node_modules/pbf": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", @@ -13190,6 +13301,17 @@ "node": ">=8" } }, + "node_modules/pkg-types": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", + "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -15088,6 +15210,12 @@ "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -15436,6 +15564,12 @@ "vite": "^2.6.0 || 3 || 4 || 5" } }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", @@ -15892,6 +16026,485 @@ "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.4.tgz", "integrity": "sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A==", "optional": true + }, + "packages/network-map-layers": { + "name": "@powsybl/network-map-layers", + "version": "0.6", + "license": "MPL-2.0", + "dependencies": { + "@deck.gl/core": "^9.0.0", + "@deck.gl/extensions": "9.0.0", + "@deck.gl/layers": "^9.0.0", + "@luma.gl/constants": "9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "9.0.0" + }, + "devDependencies": { + "typescript": "5.5.3", + "vite": "^5.3.3", + "vite-plugin-dts": "^3.9.1", + "vite-plugin-externalize-deps": "^0.8.0", + "vite-plugin-svgr": "^4.2.0" + } + }, + "packages/network-map-layers/node_modules/@deck.gl/extensions": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.0.tgz", + "integrity": "sha512-2QcWLXuQVdlOWCV/vqpZtIhAkYjv7Pvcd5bxI3b02mtkoICpryWSWYJDP6+vNxNvviwe9rVSvwTL6vqd/dwWDQ==", + "dependencies": { + "@luma.gl/constants": "^9.0.6", + "@luma.gl/shadertools": "^9.0.6", + "@math.gl/core": "^4.0.0" + }, + "peerDependencies": { + "@deck.gl/core": "^9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" + } + }, + "packages/network-map-layers/node_modules/@deck.gl/extensions/node_modules/@luma.gl/constants": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.16.tgz", + "integrity": "sha512-uVbtpTON0HYfX8MqgQ+wz+Hh9EvvTq0F1QXNtWjpizLsRFJIeWGO3a7uqz6Y6pzvzqCCYdN/GPGo/t+Vxt/D/w==" + }, + "packages/network-map-layers/node_modules/@luma.gl/constants": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.0.tgz", + "integrity": "sha512-0oVddffzzkYeHs2CKwehezQ0R5IkqM9Jq2FVYdnOAa02rAtqytWwvmhn4zs0Q/kYtHVn51OnkqIcB1vk5MsLJA==" + }, + "packages/network-map-layers/node_modules/@luma.gl/engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.0.tgz", + "integrity": "sha512-I5OUFvqkYlsz1zn0u9EcF+NDtWSCvtSA3Ki8dRcbhx3ff2f1UuMZ8w0H2f/0Dz4pfnRaSXFaxfx6EslbXK2TzQ==", + "dependencies": { + "@luma.gl/shadertools": "9.0.0", + "@math.gl/core": "^4.0.0", + "@probe.gl/log": "^4.0.2", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@luma.gl/core": "^9.0.0-beta" + } + }, + "packages/network-map-layers/node_modules/@luma.gl/engine/node_modules/@luma.gl/shadertools": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.0.tgz", + "integrity": "sha512-m8IdrG+bFz8P2onLDD0fdaH12ibMzShxZ4I/DDrz9HFq4CitdiMABQiqRmAzZNv0RxnyJ6xIYxvudgvUk18B3Q==", + "dependencies": { + "@math.gl/core": "^4.0.0", + "@math.gl/types": "^4.0.0" + }, + "peerDependencies": { + "@luma.gl/core": "^9.0.0-beta" + } + }, + "packages/network-map-layers/node_modules/@microsoft/api-extractor": { + "version": "7.47.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.47.2.tgz", + "integrity": "sha512-YWE2HGrSTZaPPSr7xiNizSuViZpC7Jsa7+DwRW5rYVgrMXNbfX/PpBOoSkl5uaz9I2sv2JKLJ75kVNt64BvS3g==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.29.3", + "@microsoft/tsdoc": "~0.15.0", + "@microsoft/tsdoc-config": "~0.17.0", + "@rushstack/node-core-library": "5.5.0", + "@rushstack/rig-package": "0.5.2", + "@rushstack/terminal": "0.13.2", + "@rushstack/ts-command-line": "4.22.2", + "lodash": "~4.17.15", + "minimatch": "~3.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.4.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "packages/network-map-layers/node_modules/@microsoft/api-extractor-model": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.29.3.tgz", + "integrity": "sha512-kEWjLr2ygL3ku9EGyjeTnL2S5IxyH9NaF1k1UoI0Nzwr4xEJBSWCVsWuF2+0lPUrRPA6mTY95fR264SJ5ETKQA==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "~0.15.0", + "@microsoft/tsdoc-config": "~0.17.0", + "@rushstack/node-core-library": "5.5.0" + } + }, + "packages/network-map-layers/node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/network-map-layers/node_modules/@microsoft/tsdoc": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", + "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", + "dev": true + }, + "packages/network-map-layers/node_modules/@microsoft/tsdoc-config": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", + "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.15.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "packages/network-map-layers/node_modules/@rushstack/node-core-library": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.5.0.tgz", + "integrity": "sha512-Cl3MYQ74Je5Y/EngMxcA3SpHjGZ/022nKbAO1aycGfQ+7eKyNCBu0oywj5B1f367GCzuHBgy+3BlVLKysHkXZw==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "packages/network-map-layers/node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/network-map-layers/node_modules/@rushstack/terminal": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.13.2.tgz", + "integrity": "sha512-t8i0PsGvBHmFBY8pryO3badqFlxQsm2rw3KYrzjcmVkG/WGklKg1qVkr9beAS1Oe8XWDRgj6SkoHkpNjs7aaNw==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "5.5.0", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "packages/network-map-layers/node_modules/@rushstack/ts-command-line": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.22.2.tgz", + "integrity": "sha512-xkvrGd6D9dPlI3I401Thc640WNsEPB1sGEmy12a2VJaPQPwhE6Ik0gEVPZJ/2G1w213eaCAdxUY1xpiTulsmpA==", + "dev": true, + "dependencies": { + "@rushstack/terminal": "0.13.2", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "packages/network-map-layers/node_modules/@volar/language-core": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.4.tgz", + "integrity": "sha512-wXBhY11qG6pCDAqDnbBRFIDSIwbqkWI7no+lj5+L7IlA7HRIjRP7YQLGzT0LF4lS6eHkMSsclXqy9DwYJasZTQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.3.4" + } + }, + "packages/network-map-layers/node_modules/@volar/source-map": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.4.tgz", + "integrity": "sha512-C+t63nwcblqLIVTYXaVi/+gC8NukDaDIQI72J3R7aXGvtgaVB16c+J8Iz7/VfOy7kjYv7lf5GhBny6ACw9fTGQ==", + "dev": true + }, + "packages/network-map-layers/node_modules/@volar/typescript": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.4.tgz", + "integrity": "sha512-acCvt7dZECyKcvO5geNybmrqOsu9u8n5XP1rfiYsOLYGPxvHRav9BVmEdRyZ3vvY6mNyQ1wLL5Hday4IShe17w==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.3.4", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "packages/network-map-layers/node_modules/@vue/language-core": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.19.tgz", + "integrity": "sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==", + "dev": true, + "dependencies": { + "@volar/language-core": "~2.2.4", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/network-map-layers/node_modules/@vue/language-core/node_modules/@volar/language-core": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.5.tgz", + "integrity": "sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.2.5" + } + }, + "packages/network-map-layers/node_modules/@vue/language-core/node_modules/@volar/source-map": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.5.tgz", + "integrity": "sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==", + "dev": true, + "dependencies": { + "muggle-string": "^0.4.0" + } + }, + "packages/network-map-layers/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/network-map-layers/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "packages/network-map-layers/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/network-map-layers/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "packages/network-map-layers/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "packages/network-map-layers/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/network-map-layers/node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "packages/network-map-layers/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/network-map-layers/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/network-map-layers/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "packages/network-map-layers/node_modules/typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/network-map-layers/node_modules/vite-plugin-dts": { + "version": "4.0.0-beta.1", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.0.0-beta.1.tgz", + "integrity": "sha512-4ILGS8ClSYiNMtSRo4YxJ+JeC2P4uZgo9cQ7Yav+CLSxcoWBffjJ6B1QKcn5BhniXJQkb1j6Bi0MCj5C5+i4Sg==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor": "7.47.2", + "@rollup/pluginutils": "^5.1.0", + "@volar/typescript": "^2.3.4", + "@vue/language-core": "2.0.19", + "compare-versions": "^6.1.1", + "debug": "^4.3.5", + "kolorist": "^1.8.0", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.10", + "vue-tsc": "2.0.19" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "packages/network-map-layers/node_modules/vue-tsc": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.19.tgz", + "integrity": "sha512-JWay5Zt2/871iodGF72cELIbcAoPyhJxq56mPPh+M2K7IwI688FMrFKc/+DvB05wDWEuCPexQJ6L10zSwzzapg==", + "dev": true, + "dependencies": { + "@volar/typescript": "~2.2.4", + "@vue/language-core": "2.0.19", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "packages/network-map-layers/node_modules/vue-tsc/node_modules/@volar/language-core": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.5.tgz", + "integrity": "sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.2.5" + } + }, + "packages/network-map-layers/node_modules/vue-tsc/node_modules/@volar/source-map": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.5.tgz", + "integrity": "sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==", + "dev": true, + "dependencies": { + "muggle-string": "^0.4.0" + } + }, + "packages/network-map-layers/node_modules/vue-tsc/node_modules/@volar/typescript": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.5.tgz", + "integrity": "sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.2.5", + "path-browserify": "^1.0.1" + } + }, + "packages/network-map-layers/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/package.json b/package.json index bb234dec..533e704d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,11 @@ "lint": "eslint . --ext js,mjs,jsx,ts,mts,tsx --max-warnings 0", "licenses-check": "license-checker --summary --excludePrivatePackages --production --onlyAllow \"$( jq -r .onlyAllow[] license-checker-config.json | tr '\n' ';')\" --excludePackages \"$( jq -r .excludePackages[] license-checker-config.json | tr '\n' ';')\"" }, + "workspaces": [ + "packages/network-map-layers" + ], "dependencies": { + "@powsybl/network-map-layers": "^0.6.0", "@mapbox/mapbox-gl-draw": "^1.4.3", "@svgdotjs/svg.js": "^3.2.4", "@svgdotjs/svg.panzoom.js": "^2.1.2", diff --git a/packages/network-map-layers/dist/constants.d.ts b/packages/network-map-layers/dist/constants.d.ts new file mode 100644 index 00000000..46d8370d --- /dev/null +++ b/packages/network-map-layers/dist/constants.d.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2020, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +export declare const SUBSTATION_RADIUS = 500; +export declare const SUBSTATION_RADIUS_MAX_PIXEL = 5; +export declare const SUBSTATION_RADIUS_MIN_PIXEL = 1; diff --git a/packages/network-map-layers/dist/index.d.ts b/packages/network-map-layers/dist/index.d.ts new file mode 100644 index 00000000..d22bee1f --- /dev/null +++ b/packages/network-map-layers/dist/index.d.ts @@ -0,0 +1,6 @@ +export { GeoData } from './network/geo-data'; +export { LineFlowColorMode, LineFlowMode, LineLayer, } from './network/line-layer'; +export { MapEquipments } from './network/map-equipments'; +export { SubstationLayer } from './network/substation-layer'; +export { getNominalVoltageColor } from './utils/colors'; +export * from './utils/equipment-types'; diff --git a/packages/network-map-layers/dist/network/geo-data.d.ts b/packages/network-map-layers/dist/network/geo-data.d.ts new file mode 100644 index 00000000..fcf4fa44 --- /dev/null +++ b/packages/network-map-layers/dist/network/geo-data.d.ts @@ -0,0 +1,304 @@ +import { Line, LonLat } from '../utils/equipment-types'; +import { ArrowDirection } from './layers/arrow-layer'; +import { MapEquipments } from './map-equipments'; + +export declare enum Country { + AF = "AFGHANISTAN", + AX = "\u00C5LAND ISLANDS", + AL = "ALBANIA", + DZ = "ALGERIA", + AS = "AMERICAN SAMOA", + AD = "ANDORRA", + AO = "ANGOLA", + AI = "ANGUILLA", + AQ = "ANTARCTICA", + AG = "ANTIGUA AND BARBUDA", + AR = "ARGENTINA", + AM = "ARMENIA", + AW = "ARUBA", + AU = "AUSTRALIA", + AT = "AUSTRIA", + AZ = "AZERBAIJAN", + BS = "BAHAMAS", + BH = "BAHRAIN", + BD = "BANGLADESH", + BB = "BARBADOS", + BY = "BELARUS", + BE = "BELGIUM", + BZ = "BELIZE", + BJ = "BENIN", + BM = "BERMUDA", + BT = "BHUTAN", + BO = "BOLIVIA, PLURINATIONAL STATE OF", + BQ = "BONAIRE, SINT EUSTATIUS AND SABA", + BA = "BOSNIA AND HERZEGOVINA", + BW = "BOTSWANA", + BV = "BOUVET ISLAND", + BR = "BRAZIL", + IO = "BRITISH INDIAN OCEAN TERRITORY", + BN = "BRUNEI DARUSSALAM", + BG = "BULGARIA", + BF = "BURKINA FASO", + BI = "BURUNDI", + KH = "CAMBODIA", + CM = "CAMEROON", + CA = "CANADA", + CV = "CAPE VERDE", + KY = "CAYMAN ISLANDS", + CF = "CENTRAL AFRICAN REPUBLIC", + TD = "CHAD", + CL = "CHILE", + CN = "CHINA", + CX = "CHRISTMAS ISLAND", + CC = "COCOS (KEELING) ISLANDS", + CO = "COLOMBIA", + KM = "COMOROS", + CG = "CONGO", + CD = "CONGO, THE DEMOCRATIC REPUBLIC OF THE", + CK = "COOK ISLANDS", + CR = "COSTA RICA", + CI = "C\u00D4TE D'IVOIRE", + HR = "CROATIA", + CU = "CUBA", + CW = "CURA\u00C7AO", + CY = "CYPRUS", + CZ = "CZECH REPUBLIC", + DK = "DENMARK", + DJ = "DJIBOUTI", + DM = "DOMINICA", + DO = "DOMINICAN REPUBLIC", + EC = "ECUADOR", + EG = "EGYPT", + SV = "EL SALVADOR", + GQ = "EQUATORIAL GUINEA", + ER = "ERITREA", + EE = "ESTONIA", + ET = "ETHIOPIA", + FK = "FALKLAND ISLANDS (MALVINAS)", + FO = "FAROE ISLANDS", + FJ = "FIJI", + FI = "FINLAND", + FR = "FRANCE", + GF = "FRENCH GUIANA", + PF = "FRENCH POLYNESIA", + TF = "FRENCH SOUTHERN TERRITORIES", + GA = "GABON", + GM = "GAMBIA", + GE = "GEORGIA", + DE = "GERMANY", + GH = "GHANA", + GI = "GIBRALTAR", + GR = "GREECE", + GL = "GREENLAND", + GD = "GRENADA", + GP = "GUADELOUPE", + GU = "GUAM", + GT = "GUATEMALA", + GG = "GUERNSEY", + GN = "GUINEA", + GW = "GUINEA-BISSAU", + GY = "GUYANA", + HT = "HAITI", + HM = "HEARD ISLAND AND MCDONALD ISLANDS", + VA = "HOLY SEE (VATICAN CITY STATE)", + HN = "HONDURAS", + HK = "HONG KONG", + HU = "HUNGARY", + IS = "ICELAND", + IN = "INDIA", + ID = "INDONESIA", + IR = "IRAN, ISLAMIC REPUBLIC OF", + IQ = "IRAQ", + IE = "IRELAND", + IM = "ISLE OF MAN", + IL = "ISRAEL", + IT = "ITALY", + JM = "JAMAICA", + JP = "JAPAN", + JE = "JERSEY", + JO = "JORDAN", + KZ = "KAZAKHSTAN", + KE = "KENYA", + KI = "KIRIBATI", + KP = "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF", + KR = "KOREA, REPUBLIC OF", + XK = "KOSOVO", + KW = "KUWAIT", + KG = "KYRGYZSTAN", + LA = "LAO PEOPLE'S DEMOCRATIC REPUBLIC", + LV = "LATVIA", + LB = "LEBANON", + LS = "LESOTHO", + LR = "LIBERIA", + LY = "LIBYA", + LI = "LIECHTENSTEIN", + LT = "LITHUANIA", + LU = "LUXEMBOURG", + MO = "MACAO", + MK = "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF", + MG = "MADAGASCAR", + MW = "MALAWI", + MY = "MALAYSIA", + MV = "MALDIVES", + ML = "MALI", + MT = "MALTA", + MH = "MARSHALL ISLANDS", + MQ = "MARTINIQUE", + MR = "MAURITANIA", + MU = "MAURITIUS", + YT = "MAYOTTE", + MX = "MEXICO", + FM = "MICRONESIA, FEDERATED STATES OF", + MD = "MOLDOVA, REPUBLIC OF", + MC = "MONACO", + MN = "MONGOLIA", + ME = "MONTENEGRO", + MS = "MONTSERRAT", + MA = "MOROCCO", + MZ = "MOZAMBIQUE", + MM = "MYANMAR", + NA = "NAMIBIA", + NR = "NAURU", + NP = "NEPAL", + NL = "NETHERLANDS", + NC = "NEW CALEDONIA", + NZ = "NEW ZEALAND", + NI = "NICARAGUA", + NE = "NIGER", + NG = "NIGERIA", + NU = "NIUE", + NF = "NORFOLK ISLAND", + MP = "NORTHERN MARIANA ISLANDS", + NO = "NORWAY", + OM = "OMAN", + PK = "PAKISTAN", + PW = "PALAU", + PS = "PALESTINE, STATE OF", + PA = "PANAMA", + PG = "PAPUA NEW GUINEA", + PY = "PARAGUAY", + PE = "PERU", + PH = "PHILIPPINES", + PN = "PITCAIRN", + PL = "POLAND", + PT = "PORTUGAL", + PR = "PUERTO RICO", + QA = "QATAR", + RE = "R\u00C9UNION", + RO = "ROMANIA", + RU = "RUSSIAN FEDERATION", + RW = "RWANDA", + BL = "SAINT BARTH\u00C9LEMY", + SH = "SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA", + KN = "SAINT KITTS AND NEVIS", + LC = "SAINT LUCIA", + MF = "SAINT MARTIN (FRENCH PART)", + PM = "SAINT PIERRE AND MIQUELON", + VC = "SAINT VINCENT AND THE GRENADINES", + WS = "SAMOA", + SM = "SAN MARINO", + ST = "SAO TOME AND PRINCIPE", + SA = "SAUDI ARABIA", + SN = "SENEGAL", + RS = "SERBIA", + SC = "SEYCHELLES", + SL = "SIERRA LEONE", + SG = "SINGAPORE", + SX = "SINT MAARTEN (DUTCH PART)", + SK = "SLOVAKIA", + SI = "SLOVENIA", + SB = "SOLOMON ISLANDS", + SO = "SOMALIA", + ZA = "SOUTH AFRICA", + GS = "SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS", + SS = "SOUTH SUDAN", + ES = "SPAIN", + LK = "SRI LANKA", + SD = "SUDAN", + SR = "SURINAME", + SJ = "SVALBARD AND JAN MAYEN", + SZ = "SWAZILAND", + SE = "SWEDEN", + CH = "SWITZERLAND", + SY = "SYRIAN ARAB REPUBLIC", + TW = "TAIWAN, PROVINCE OF CHINA", + TJ = "TAJIKISTAN", + TZ = "TANZANIA, UNITED REPUBLIC OF", + TH = "THAILAND", + TL = "TIMOR-LESTE", + TG = "TOGO", + TK = "TOKELAU", + TO = "TONGA", + TT = "TRINIDAD AND TOBAGO", + TN = "TUNISIA", + TR = "TURKEY", + TM = "TURKMENISTAN", + TC = "TURKS AND CAICOS ISLANDS", + TV = "TUVALU", + UG = "UGANDA", + UA = "UKRAINE", + AE = "UNITED ARAB EMIRATES", + GB = "UNITED KINGDOM", + US = "UNITED STATES", + UM = "UNITED STATES MINOR OUTLYING ISLANDS", + UY = "URUGUAY", + UZ = "UZBEKISTAN", + VU = "VANUATU", + VE = "VENEZUELA, BOLIVARIAN REPUBLIC OF", + VN = "VIET NAM", + VG = "VIRGIN ISLANDS, BRITISH", + VI = "VIRGIN ISLANDS, U.S.", + WF = "WALLIS AND FUTUNA", + EH = "WESTERN SAHARA", + YE = "YEMEN", + ZM = "ZAMBIA", + ZW = "ZIMBABWE" +} +export type Coordinate = { + lon: number; + lat: number; +}; +type SubstationPosition = { + id: string; + coordinate: Coordinate; +}; +type LinePosition = { + id: string; + coordinates: Coordinate[]; +}; +export declare class GeoData { + substationPositionsById: Map; + linePositionsById: Map; + constructor(substationPositionsById: Map, linePositionsById: Map); + setSubstationPositions(positions: SubstationPosition[]): void; + updateSubstationPositions(substationIdsToUpdate: string[], fetchedPositions: SubstationPosition[]): void; + getSubstationPosition(substationId: string): LonLat; + setLinePositions(positions: LinePosition[]): void; + updateLinePositions(lineIdsToUpdate: string[], fetchedPositions: LinePosition[]): void; + /** + * Get line positions always ordered from side 1 to side 2. + */ + getLinePositions(network: MapEquipments, line: Line, detailed?: boolean): LonLat[]; + getLineDistances(positions: LonLat[]): number[] | null; + /** + * Find the segment in which we reach the wanted distance and return the segment + * along with the remaining distance to travel on this segment to be at the exact wanted distance + * (implemented using a binary search) + */ + findSegment(positions: LonLat[], cumulativeDistances: number[], wantedDistance: number): { + idx: number; + segment: [LonLat, LonLat]; + remainingDistance: number; + }; + labelDisplayPosition(positions: LonLat[], cumulativeDistances: number[], arrowPosition: number, arrowDirection: ArrowDirection, lineParallelIndex: number, lineAngle: number, proximityAngle: number, distanceBetweenLines: number, proximityFactor: number): { + position: { + latitude: number; + longitude: number; + }; + angle: number; + offset: [number, number]; + } | null; + getLabelOffset(angle: number, offsetDistance: number, arrowDirection: ArrowDirection): [number, number]; + getMapAngle(point1: LonLat, point2: LonLat): number; +} +export {}; diff --git a/packages/network-map-layers/dist/network/layers/arrow-layer.d.ts b/packages/network-map-layers/dist/network/layers/arrow-layer.d.ts new file mode 100644 index 00000000..81b27b5b --- /dev/null +++ b/packages/network-map-layers/dist/network/layers/arrow-layer.d.ts @@ -0,0 +1,86 @@ +import { Accessor, DefaultProps, Layer } from '@deck.gl/core'; +import { Texture, Device, RenderPass, TextureFormat, TextureProps, UniformValue } from '@luma.gl/core'; +import { Model } from '@luma.gl/engine'; +import { Line } from '../../utils/equipment-types'; +import { Color, LayerContext, LayerProps, Position, UpdateParameters } from 'deck.gl'; + +export declare enum ArrowDirection { + NONE = "none", + FROM_SIDE_1_TO_SIDE_2 = "fromSide1ToSide2", + FROM_SIDE_2_TO_SIDE_1 = "fromSide2ToSide1" +} +export type Arrow = { + line: Line; + distance: number; +}; +export type LayerDataSource = DataType[]; +type _ArrowLayerProps = { + data: Arrow[]; + sizeMinPixels?: number; + sizeMaxPixels?: number; + getDistance: Accessor; + getLine: (arrow: Arrow) => Line; + getLinePositions: (line: Line) => Position[]; + getSize?: Accessor; + getColor?: Accessor; + getSpeedFactor?: Accessor; + getDirection?: Accessor; + animated?: boolean; + getLineParallelIndex?: Accessor; + getLineAngles?: Accessor; + getDistanceBetweenLines?: Accessor; + maxParallelOffset?: number; + minParallelOffset?: number; + opacity?: number; +} & LayerProps; +type ArrowLayerProps = _ArrowLayerProps & LayerProps; +type LineAttributes = { + distance: number; + positionsTextureOffset: number; + distancesTextureOffset: number; + pointCount: number; +}; +/** + * A layer that draws arrows over the lines between voltage levels. The arrows are drawn on a direct line + * or with a parallel offset. The initial point is also shifted to coincide with the fork line ends. + * Needs to be kept in sync with ForkLineLayer and ParallelPathLayer because they draw the lines. + * props : getLineParallelIndex: accessor for real number representing the parallel translation, normalized to distanceBetweenLines + * getLineAngles: accessor for line angle in radian (3 angle substation1 / first pylon ; substation1/substation2 ; last pylon / substation2 + * distanceBetweenLines: distance in meters between line when no pixel clamping is applied + * maxParallelOffset: max pixel distance + * minParallelOffset: min pixel distance + */ +export declare class ArrowLayer extends Layer> { + static layerName: string; + static defaultProps: DefaultProps; + state: { + linePositionsTexture: Texture; + lineDistancesTexture: Texture; + lineAttributes: Map; + model?: Model; + timestamp: number; + stop: boolean; + maxTextureSize: number; + }; + getShaders(): any; + getArrowLineAttributes(arrow: Arrow): LineAttributes; + initializeState(): void; + finalizeState(context: LayerContext): void; + createTexture2D(device: Device, data: Array, elementSize: number, format: TextureFormat): Texture; + createTexturesStructure(props: this['props']): { + linePositionsTextureData: number[]; + lineDistancesTextureData: number[]; + lineAttributes: Map; + }; + updateGeometry({ props, changeFlags }: UpdateParameters): void; + updateModel({ changeFlags }: UpdateParameters): void; + updateState(updateParams: UpdateParameters): void; + animate(timestamp: number): void; + startAnimation(): void; + draw({ uniforms, renderPass, }: { + uniforms: Record; + renderPass: RenderPass; + }): void; + _getModel(device: Device): Model; +} +export {}; diff --git a/packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts b/packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts new file mode 100644 index 00000000..6178dde1 --- /dev/null +++ b/packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts @@ -0,0 +1,43 @@ +import { Accessor, DefaultProps } from '@deck.gl/core'; +import { LineLayer, LineLayerProps } from '@deck.gl/layers'; + +export type ForkLineLayerProps = _ForkLineLayerProps & LineLayerProps; +type _ForkLineLayerProps = { + getLineParallelIndex: Accessor; + getLineAngle: Accessor; + distanceBetweenLines: Accessor; + maxParallelOffset: Accessor; + minParallelOffset: Accessor; + substationRadius: Accessor; + substationMaxPixel: Accessor; + minSubstationRadiusPixel: Accessor; + getDistanceBetweenLines: Accessor; + getMaxParallelOffset: Accessor; + getMinParallelOffset: Accessor; + getSubstationRadius: Accessor; + getSubstationMaxPixel: Accessor; + getMinSubstationRadiusPixel: Accessor; +}; +/** + * A layer based on LineLayer that draws a fork line at a substation when there are multiple parallel lines + * Needs to be kept in sync with ArrowLayer and ParallelPathLayer because connect to the end of the fork lines. + * props : getLineParallelIndex: real number representing the parallel translation, normalized to distanceBetweenLines + * getLineAngle: line angle in radian + * distanceBetweenLines: distance in meters between line when no pixel clamping is applied + * maxParallelOffset: max pixel distance + * minParallelOffset: min pixel distance + * instanceOffsetStart: distance from the origin point + * substationRadius: radius for a voltage level in substation + * substationMaxPixel: max pixel for a voltage level in substation + * minSubstationRadiusPixel : min pixel for a substation + */ +export default class ForkLineLayer extends LineLayer>> { + static layerName: string; + static defaultProps: DefaultProps>; + getShaders(): any; + initializeState(): void; + draw({ uniforms, }: { + uniforms: Record; + }): void; +} +export {}; diff --git a/packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts b/packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts new file mode 100644 index 00000000..c383be93 --- /dev/null +++ b/packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts @@ -0,0 +1,35 @@ +import { Accessor, DefaultProps } from '@deck.gl/core'; +import { PathLayer, PathLayerProps } from '@deck.gl/layers'; +import { RenderPass, UniformValue } from '@luma.gl/core'; + +type _ParallelPathLayerProps = { + getLineParallelIndex?: Accessor; + getLineAngle?: Accessor; + distanceBetweenLines?: number; + maxParallelOffset?: number; + minParallelOffset?: number; +}; +export type ParallelPathLayerProps = _ParallelPathLayerProps & PathLayerProps; +/** + * A layer based on PathLayer allowing to shift path by an offset + angle + * In addition to the shift for all points, the first point is also shifted + * to coincide to the end of "fork lines" starting from the substations. + * Needs to be kept in sync with ForkLineLayer and ArrowLayer because + * ForkLineLayer must connect to this and the arrows must overlap on this. + * props : getLineParallelIndex: real number representing the parallel translation, normalized to distanceBetweenLines + * getLineAngle: line angle in radian + * distanceBetweenLines: distance in meters between line when no pixel clamping is applied + * maxParallelOffset: max pixel distance + * minParallelOffset: min pixel distance + */ +export default class ParallelPathLayer extends PathLayer>> { + static layerName: string; + static defaultProps: DefaultProps>; + getShaders(): any; + initializeState(): void; + draw({ uniforms, }: { + uniforms: Record; + renderPass: RenderPass; + }): void; +} +export {}; diff --git a/packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts b/packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts new file mode 100644 index 00000000..18d511b4 --- /dev/null +++ b/packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts @@ -0,0 +1,17 @@ +import { Accessor, DefaultProps } from '@deck.gl/core'; +import { ScatterplotLayer, ScatterplotLayerProps } from '@deck.gl/layers'; + +type _ScatterplotLayerExtProps = { + getRadiusMaxPixels: Accessor; +}; +export type ScatterplotLayerExtProps = _ScatterplotLayerExtProps & ScatterplotLayerProps; +/** + * An extended scatter plot layer that allows a radius max pixels to be different for each object. + */ +export default class ScatterplotLayerExt extends ScatterplotLayer>> { + static layerName: string; + static defaultProps: DefaultProps>; + getShaders(): any; + initializeState(): void; +} +export {}; diff --git a/packages/network-map-layers/dist/network/line-layer.d.ts b/packages/network-map-layers/dist/network/line-layer.d.ts new file mode 100644 index 00000000..c33998c0 --- /dev/null +++ b/packages/network-map-layers/dist/network/line-layer.d.ts @@ -0,0 +1,150 @@ +import { Line, LonLat } from '../utils/equipment-types'; +import { Color, CompositeLayer, CompositeLayerProps, Layer, LayerContext, Position, UpdateParameters } from '@deck.gl/core'; +import { GeoData } from './geo-data'; +import { Arrow } from './layers/arrow-layer'; +import { MapEquipments } from './map-equipments'; + +export declare enum LineFlowMode { + STATIC_ARROWS = "staticArrows", + ANIMATED_ARROWS = "animatedArrows", + FEEDERS = "feeders" +} +export declare enum LineFlowColorMode { + NOMINAL_VOLTAGE = "nominalVoltage", + OVERLOADS = "overloads" +} +export declare enum LineLoadingZone { + UNKNOWN = 0, + SAFE = 1, + WARNING = 2, + OVERLOAD = 3 +} +export declare function getLineLoadingZoneOfSide(limit: number | undefined, intensity: number | undefined, lineFlowAlertThreshold: number): LineLoadingZone; +export declare function getLineLoadingZone(line: Line, lineFlowAlertThreshold: number): number; +export declare const ArrowSpeed: { + STOPPED: number; + SLOW: number; + MEDIUM: number; + FAST: number; + CRAZY: number; +}; +type LineConnection = { + terminal1Connected: boolean; + terminal2Connected: boolean; +}; +export declare enum LineStatus { + PLANNED_OUTAGE = "PLANNED_OUTAGE", + FORCED_OUTAGE = "FORCED_OUTAGE", + IN_OPERATION = "IN_OPERATION" +} +type LinesStatus = { + operatingStatus: LineStatus; +}; +type CompositeDataLine = { + nominalV: number; + lines: Line[]; + arrows: Arrow[]; + positions: LonLat[]; + cumulativeDistances: number[]; +}; +type ActivePower = { + p: number | undefined; + printPosition: Position; + offset: [number, number]; + line: Line; +}; +type OperatingStatus = { + status: LineStatus; + printPosition: Position; + offset: [number, number]; +}; +export type CompositeData = { + nominalV: number; + mapOriginDestination?: Map>; + lines: Line[]; + lineMap?: Map; + activePower: ActivePower[]; + operatingStatus: OperatingStatus[]; + arrows: Arrow[]; +}; +type _LineLayerProps = { + data: Line[]; + network: MapEquipments; + geoData: GeoData; + getNominalVoltageColor: (voltage: number) => Color; + disconnectedLineColor: Color; + filteredNominalVoltages: number[] | null; + lineFlowMode: LineFlowMode; + lineFlowColorMode: LineFlowColorMode; + lineFlowAlertThreshold: number; + showLineFlow: boolean; + lineFullPath: boolean; + lineParallelPath: boolean; + labelSize: number; + iconSize: number; + distanceBetweenLines: number; + maxParallelOffset: number; + minParallelOffset: number; + substationRadius: number; + substationMaxPixel: number; + minSubstationRadiusPixel: number; + areFlowsValid: boolean; + updatedLines: Line[]; + labelsVisible: boolean; + labelColor: Color; +}; +export type LineLayerProps = _LineLayerProps & CompositeLayerProps; +export declare class LineLayer extends CompositeLayer> { + static layerName: string; + static defaultProps: { + network: null; + geoData: null; + getNominalVoltageColor: { + type: string; + value: number[]; + }; + disconnectedLineColor: { + type: string; + value: number[]; + }; + filteredNominalVoltages: null; + lineFlowMode: LineFlowMode; + lineFlowColorMode: LineFlowColorMode; + lineFlowAlertThreshold: number; + showLineFlow: boolean; + lineFullPath: boolean; + lineParallelPath: boolean; + labelSize: number; + iconSize: number; + distanceBetweenLines: number; + maxParallelOffset: number; + minParallelOffset: number; + substationRadius: { + type: string; + value: number; + }; + substationMaxPixel: { + type: string; + value: number; + }; + minSubstationRadiusPixel: { + type: string; + value: number; + }; + }; + state: { + compositeData: CompositeData[]; + linesConnection: Map; + linesStatus: Map; + }; + initializeState(context: LayerContext): void; + getVoltageLevelIndex(voltageLevelId: string): number | undefined; + updateState({ props, oldProps, changeFlags }: UpdateParameters): void; + genLineKey(line: Line): string; + recomputeParallelLinesIndex(compositeData: CompositeData[], props: this['props']): void; + recomputeForkLines(compositeData: CompositeData[], props: this['props']): void; + getProximityFactor(firstPosition: LonLat, secondPosition: LonLat): number; + computeAngle(props: this['props'], position1: LonLat, position2: LonLat): number; + renderLayers(): Layer<{}>[]; +} +export {}; diff --git a/packages/network-map-layers/dist/network/map-equipments.d.ts b/packages/network-map-layers/dist/network/map-equipments.d.ts new file mode 100644 index 00000000..e928074e --- /dev/null +++ b/packages/network-map-layers/dist/network/map-equipments.d.ts @@ -0,0 +1,41 @@ +import { EQUIPMENT_TYPES, Equipment, Line, Substation, VoltageLevel } from '../utils/equipment-types'; + +export declare class MapEquipments { + substations: Substation[]; + substationsById: Map; + lines: Line[]; + linesById: Map; + tieLines: Line[]; + tieLinesById: Map; + hvdcLines: Line[]; + hvdcLinesById: Map; + voltageLevels: VoltageLevel[]; + voltageLevelsById: Map; + nominalVoltages: number[]; + intlRef: undefined; + constructor(); + newMapEquipmentForUpdate(): MapEquipments; + checkAndGetValues(equipments: Equipment[]): Equipment[]; + completeSubstationsInfos(equipementsToIndex: Substation[]): void; + updateEquipments(currentEquipments: T[], newEquipements: T[], _equipmentType: EQUIPMENT_TYPES): T[]; + updateSubstations(substations: Substation[], fullReload: boolean): void; + completeLinesInfos(equipementsToIndex: Line[]): void; + completeTieLinesInfos(equipementsToIndex: Line[]): void; + updateLines(lines: Line[], fullReload: boolean): void; + updateTieLines(tieLines: Line[], fullReload: boolean): void; + updateHvdcLines(hvdcLines: Line[], fullReload: boolean): void; + completeHvdcLinesInfos(equipementsToIndex: Line[]): void; + removeBranchesOfVoltageLevel(branchesList: Line[], voltageLevelId: string): Line[]; + removeEquipment(equipmentType: EQUIPMENT_TYPES, equipmentId: string): void; + getVoltageLevels(): VoltageLevel[]; + getVoltageLevel(id: string): VoltageLevel | undefined; + getSubstations(): Substation[]; + getSubstation(id: string): Substation | undefined; + getNominalVoltages(): number[]; + getLines(): Line[]; + getLine(id: string): Line | undefined; + getHvdcLines(): Line[]; + getHvdcLine(id: string): Line | undefined; + getTieLines(): Line[]; + getTieLine(id: string): Line | undefined; +} diff --git a/packages/network-map-layers/dist/network/substation-layer.d.ts b/packages/network-map-layers/dist/network/substation-layer.d.ts new file mode 100644 index 00000000..65d78aaf --- /dev/null +++ b/packages/network-map-layers/dist/network/substation-layer.d.ts @@ -0,0 +1,39 @@ +import { Color, CompositeLayer, DefaultProps, LayerContext, UpdateParameters } from '@deck.gl/core'; +import { TextLayer } from '@deck.gl/layers'; +import { Substation, VoltageLevel } from '../utils/equipment-types'; +import { GeoData } from './geo-data'; +import { CompositeData } from './line-layer'; +import { MapEquipments } from './map-equipments'; + +type MetaVoltageLevel = { + nominalVoltageIndex: number; + voltageLevels: VoltageLevel[]; +}; +type MetaVoltageLevelsByNominalVoltage = { + nominalV: number; + metaVoltageLevels: MetaVoltageLevel[]; +}; +export type SubstationLayerProps = { + data: Substation[]; + network: MapEquipments; + geoData: GeoData; + getNominalVoltageColor: (nominalV: number) => Color; + filteredNominalVoltages: number[] | null; + labelsVisible: boolean; + labelColor: Color; + labelSize: number; + getNameOrId: (infos: Substation) => string | null; +}; +export declare class SubstationLayer extends CompositeLayer { + static layerName: string; + static defaultProps: DefaultProps; + state: { + compositeData: CompositeData[]; + metaVoltageLevelsByNominalVoltage?: MetaVoltageLevelsByNominalVoltage[]; + substationsLabels: Substation[]; + }; + initializeState(context: LayerContext): void; + updateState({ props: { data, filteredNominalVoltages, geoData, getNameOrId, network }, oldProps, changeFlags, }: UpdateParameters): void; + renderLayers(): TextLayer[]; +} +export {}; diff --git a/packages/network-map-layers/dist/powsybl-network-map-layers.js b/packages/network-map-layers/dist/powsybl-network-map-layers.js new file mode 100644 index 00000000..275de495 --- /dev/null +++ b/packages/network-map-layers/dist/powsybl-network-map-layers.js @@ -0,0 +1,5548 @@ +import { Layer, project32, picking, CompositeLayer } from '@deck.gl/core'; +import { GL } from '@luma.gl/constants'; +import { Model, Geometry } from '@luma.gl/engine'; +import { PathStyleExtension } from '@deck.gl/extensions'; +import { LineLayer as LineLayer$1, PathLayer, TextLayer, IconLayer, ScatterplotLayer } from '@deck.gl/layers'; + +const factors = { + kilometers: 1, + miles: 1000 / 1609.344, + nauticalmiles: 1000 / 1852, + meters: 1000, + metres: 1000, + yards: 1000 / 0.9144, + feet: 1000 / 0.3048, + inches: 1000 / 0.0254 +}; + +// Values that define WGS84 ellipsoid model of the Earth +const RE = 6378.137; // equatorial radius +const FE = 1 / 298.257223563; // flattening + +const E2 = FE * (2 - FE); +const RAD = Math.PI / 180; + +/** + * A collection of very fast approximations to common geodesic measurements. Useful for performance-sensitive code that measures things on a city scale. + * + * @param {number} lat latitude + * @param {string} [units='kilometers'] + * @returns {CheapRuler} + * @example + * const ruler = cheapRuler(35.05, 'miles'); + * //=ruler + */ +class CheapRuler { + /** + * Creates a ruler object from tile coordinates (y and z). + * + * @param {number} y + * @param {number} z + * @param {string} [units='kilometers'] + * @returns {CheapRuler} + * @example + * const ruler = cheapRuler.fromTile(1567, 12); + * //=ruler + */ + static fromTile(y, z, units) { + const n = Math.PI * (1 - 2 * (y + 0.5) / Math.pow(2, z)); + const lat = Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))) / RAD; + return new CheapRuler(lat, units); + } + + /** + * Multipliers for converting between units. + * + * @example + * // convert 50 meters to yards + * 50 * CheapRuler.units.yards / CheapRuler.units.meters; + */ + static get units() { + return factors; + } + + /** + * Creates a ruler instance for very fast approximations to common geodesic measurements around a certain latitude. + * + * @param {number} lat latitude + * @param {string} [units='kilometers'] + * @returns {CheapRuler} + * @example + * const ruler = cheapRuler(35.05, 'miles'); + * //=ruler + */ + constructor(lat, units) { + if (lat === undefined) throw new Error('No latitude given.'); + if (units && !factors[units]) throw new Error(`Unknown unit ${ units }. Use one of: ${ Object.keys(factors).join(', ')}`); + + // Curvature formulas from https://en.wikipedia.org/wiki/Earth_radius#Meridional + const m = RAD * RE * (units ? factors[units] : 1); + const coslat = Math.cos(lat * RAD); + const w2 = 1 / (1 - E2 * (1 - coslat * coslat)); + const w = Math.sqrt(w2); + + // multipliers for converting longitude and latitude degrees into distance + this.kx = m * w * coslat; // based on normal radius of curvature + this.ky = m * w * w2 * (1 - E2); // based on meridonal radius of curvature + } + + /** + * Given two points of the form [longitude, latitude], returns the distance. + * + * @param {Array} a point [longitude, latitude] + * @param {Array} b point [longitude, latitude] + * @returns {number} distance + * @example + * const distance = ruler.distance([30.5, 50.5], [30.51, 50.49]); + * //=distance + */ + distance(a, b) { + const dx = wrap(a[0] - b[0]) * this.kx; + const dy = (a[1] - b[1]) * this.ky; + return Math.sqrt(dx * dx + dy * dy); + } + + /** + * Returns the bearing between two points in angles. + * + * @param {Array} a point [longitude, latitude] + * @param {Array} b point [longitude, latitude] + * @returns {number} bearing + * @example + * const bearing = ruler.bearing([30.5, 50.5], [30.51, 50.49]); + * //=bearing + */ + bearing(a, b) { + const dx = wrap(b[0] - a[0]) * this.kx; + const dy = (b[1] - a[1]) * this.ky; + return Math.atan2(dx, dy) / RAD; + } + + /** + * Returns a new point given distance and bearing from the starting point. + * + * @param {Array} p point [longitude, latitude] + * @param {number} dist distance + * @param {number} bearing + * @returns {Array} point [longitude, latitude] + * @example + * const point = ruler.destination([30.5, 50.5], 0.1, 90); + * //=point + */ + destination(p, dist, bearing) { + const a = bearing * RAD; + return this.offset(p, + Math.sin(a) * dist, + Math.cos(a) * dist); + } + + /** + * Returns a new point given easting and northing offsets (in ruler units) from the starting point. + * + * @param {Array} p point [longitude, latitude] + * @param {number} dx easting + * @param {number} dy northing + * @returns {Array} point [longitude, latitude] + * @example + * const point = ruler.offset([30.5, 50.5], 10, 10); + * //=point + */ + offset(p, dx, dy) { + return [ + p[0] + dx / this.kx, + p[1] + dy / this.ky + ]; + } + + /** + * Given a line (an array of points), returns the total line distance. + * + * @param {Array>} points [longitude, latitude] + * @returns {number} total line distance + * @example + * const length = ruler.lineDistance([ + * [-67.031, 50.458], [-67.031, 50.534], + * [-66.929, 50.534], [-66.929, 50.458] + * ]); + * //=length + */ + lineDistance(points) { + let total = 0; + for (let i = 0; i < points.length - 1; i++) { + total += this.distance(points[i], points[i + 1]); + } + return total; + } + + /** + * Given a polygon (an array of rings, where each ring is an array of points), returns the area. + * + * @param {Array>>} polygon + * @returns {number} area value in the specified units (square kilometers by default) + * @example + * const area = ruler.area([[ + * [-67.031, 50.458], [-67.031, 50.534], [-66.929, 50.534], + * [-66.929, 50.458], [-67.031, 50.458] + * ]]); + * //=area + */ + area(polygon) { + let sum = 0; + + for (let i = 0; i < polygon.length; i++) { + const ring = polygon[i]; + + for (let j = 0, len = ring.length, k = len - 1; j < len; k = j++) { + sum += wrap(ring[j][0] - ring[k][0]) * (ring[j][1] + ring[k][1]) * (i ? -1 : 1); + } + } + + return (Math.abs(sum) / 2) * this.kx * this.ky; + } + + /** + * Returns the point at a specified distance along the line. + * + * @param {Array>} line + * @param {number} dist distance + * @returns {Array} point [longitude, latitude] + * @example + * const point = ruler.along(line, 2.5); + * //=point + */ + along(line, dist) { + let sum = 0; + + if (dist <= 0) return line[0]; + + for (let i = 0; i < line.length - 1; i++) { + const p0 = line[i]; + const p1 = line[i + 1]; + const d = this.distance(p0, p1); + sum += d; + if (sum > dist) return interpolate(p0, p1, (dist - (sum - d)) / d); + } + + return line[line.length - 1]; + } + + /** + * Returns the distance from a point `p` to a line segment `a` to `b`. + * + * @pointToSegmentDistance + * @param {Array} p point [longitude, latitude] + * @param {Array} p1 segment point 1 [longitude, latitude] + * @param {Array} p2 segment point 2 [longitude, latitude] + * @returns {number} distance + * @example + * const distance = ruler.pointToSegmentDistance([-67.04, 50.5], [-67.05, 50.57], [-67.03, 50.54]); + * //=distance + */ + pointToSegmentDistance(p, a, b) { + let [x, y] = a; + let dx = wrap(b[0] - x) * this.kx; + let dy = (b[1] - y) * this.ky; + let t = 0; + + if (dx !== 0 || dy !== 0) { + t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = b[0]; + y = b[1]; + + } else if (t > 0) { + x += (dx / this.kx) * t; + y += (dy / this.ky) * t; + } + } + + dx = wrap(p[0] - x) * this.kx; + dy = (p[1] - y) * this.ky; + + return Math.sqrt(dx * dx + dy * dy); + } + + /** + * Returns an object of the form {point, index, t}, where point is closest point on the line + * from the given point, index is the start index of the segment with the closest point, + * and t is a parameter from 0 to 1 that indicates where the closest point is on that segment. + * + * @param {Array>} line + * @param {Array} p point [longitude, latitude] + * @returns {Object} {point, index, t} + * @example + * const point = ruler.pointOnLine(line, [-67.04, 50.5]).point; + * //=point + */ + pointOnLine(line, p) { + let minDist = Infinity; + let minX, minY, minI, minT; + + for (let i = 0; i < line.length - 1; i++) { + + let x = line[i][0]; + let y = line[i][1]; + let dx = wrap(line[i + 1][0] - x) * this.kx; + let dy = (line[i + 1][1] - y) * this.ky; + let t = 0; + + if (dx !== 0 || dy !== 0) { + t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = line[i + 1][0]; + y = line[i + 1][1]; + + } else if (t > 0) { + x += (dx / this.kx) * t; + y += (dy / this.ky) * t; + } + } + + dx = wrap(p[0] - x) * this.kx; + dy = (p[1] - y) * this.ky; + + const sqDist = dx * dx + dy * dy; + if (sqDist < minDist) { + minDist = sqDist; + minX = x; + minY = y; + minI = i; + minT = t; + } + } + + return { + point: [minX, minY], + index: minI, + t: Math.max(0, Math.min(1, minT)) + }; + } + + /** + * Returns a part of the given line between the start and the stop points (or their closest points on the line). + * + * @param {Array} start point [longitude, latitude] + * @param {Array} stop point [longitude, latitude] + * @param {Array>} line + * @returns {Array>} line part of a line + * @example + * const line2 = ruler.lineSlice([-67.04, 50.5], [-67.05, 50.56], line1); + * //=line2 + */ + lineSlice(start, stop, line) { + let p1 = this.pointOnLine(line, start); + let p2 = this.pointOnLine(line, stop); + + if (p1.index > p2.index || (p1.index === p2.index && p1.t > p2.t)) { + const tmp = p1; + p1 = p2; + p2 = tmp; + } + + const slice = [p1.point]; + + const l = p1.index + 1; + const r = p2.index; + + if (!equals(line[l], slice[0]) && l <= r) + slice.push(line[l]); + + for (let i = l + 1; i <= r; i++) { + slice.push(line[i]); + } + + if (!equals(line[r], p2.point)) + slice.push(p2.point); + + return slice; + } + + /** + * Returns a part of the given line between the start and the stop points indicated by distance along the line. + * + * @param {number} start distance + * @param {number} stop distance + * @param {Array>} line + * @returns {Array>} line part of a line + * @example + * const line2 = ruler.lineSliceAlong(10, 20, line1); + * //=line2 + */ + lineSliceAlong(start, stop, line) { + let sum = 0; + const slice = []; + + for (let i = 0; i < line.length - 1; i++) { + const p0 = line[i]; + const p1 = line[i + 1]; + const d = this.distance(p0, p1); + + sum += d; + + if (sum > start && slice.length === 0) { + slice.push(interpolate(p0, p1, (start - (sum - d)) / d)); + } + + if (sum >= stop) { + slice.push(interpolate(p0, p1, (stop - (sum - d)) / d)); + return slice; + } + + if (sum > start) slice.push(p1); + } + + return slice; + } + + /** + * Given a point, returns a bounding box object ([w, s, e, n]) created from the given point buffered by a given distance. + * + * @param {Array} p point [longitude, latitude] + * @param {number} buffer + * @returns {Array} box object ([w, s, e, n]) + * @example + * const bbox = ruler.bufferPoint([30.5, 50.5], 0.01); + * //=bbox + */ + bufferPoint(p, buffer) { + const v = buffer / this.ky; + const h = buffer / this.kx; + return [ + p[0] - h, + p[1] - v, + p[0] + h, + p[1] + v + ]; + } + + /** + * Given a bounding box, returns the box buffered by a given distance. + * + * @param {Array} box object ([w, s, e, n]) + * @param {number} buffer + * @returns {Array} box object ([w, s, e, n]) + * @example + * const bbox = ruler.bufferBBox([30.5, 50.5, 31, 51], 0.2); + * //=bbox + */ + bufferBBox(bbox, buffer) { + const v = buffer / this.ky; + const h = buffer / this.kx; + return [ + bbox[0] - h, + bbox[1] - v, + bbox[2] + h, + bbox[3] + v + ]; + } + + /** + * Returns true if the given point is inside in the given bounding box, otherwise false. + * + * @param {Array} p point [longitude, latitude] + * @param {Array} box object ([w, s, e, n]) + * @returns {boolean} + * @example + * const inside = ruler.insideBBox([30.5, 50.5], [30, 50, 31, 51]); + * //=inside + */ + insideBBox(p, bbox) { + return wrap(p[0] - bbox[0]) >= 0 && + wrap(p[0] - bbox[2]) <= 0 && + p[1] >= bbox[1] && + p[1] <= bbox[3]; + } +} + +function equals(a, b) { + return a[0] === b[0] && a[1] === b[1]; +} + +function interpolate(a, b, t) { + const dx = wrap(b[0] - a[0]); + const dy = b[1] - a[1]; + return [ + a[0] + dx * t, + a[1] + dy * t + ]; +} + +// normalize a degree value into [-180..180] range +function wrap(deg) { + while (deg < -180) deg += 360; + while (deg > 180) deg -= 360; + return deg; +} + +var es = {}; + +var computeDestinationPoint$1 = {}; + +var getLatitude$1 = {}; + +var constants = {}; + +Object.defineProperty(constants,"__esModule",{value:true});constants.areaConversion=constants.timeConversion=constants.distanceConversion=constants.altitudeKeys=constants.latitudeKeys=constants.longitudeKeys=constants.MAXLON=constants.MINLON=constants.MAXLAT=constants.MINLAT=constants.earthRadius=constants.sexagesimalPattern=void 0;var sexagesimalPattern=/^([0-9]{1,3})°\s*([0-9]{1,3}(?:\.(?:[0-9]{1,}))?)['′]\s*(([0-9]{1,3}(\.([0-9]{1,}))?)["″]\s*)?([NEOSW]?)$/;constants.sexagesimalPattern=sexagesimalPattern;var earthRadius=6378137;constants.earthRadius=earthRadius;var MINLAT=-90;constants.MINLAT=MINLAT;var MAXLAT=90;constants.MAXLAT=MAXLAT;var MINLON=-180;constants.MINLON=MINLON;var MAXLON=180;constants.MAXLON=MAXLON;var longitudeKeys=["lng","lon","longitude",0];constants.longitudeKeys=longitudeKeys;var latitudeKeys=["lat","latitude",1];constants.latitudeKeys=latitudeKeys;var altitudeKeys=["alt","altitude","elevation","elev",2];constants.altitudeKeys=altitudeKeys;var distanceConversion={m:1,km:0.001,cm:100,mm:1000,mi:1/1609.344,sm:1/1852.216,ft:100/30.48,in:100/2.54,yd:1/0.9144};constants.distanceConversion=distanceConversion;var timeConversion={m:60,h:3600,d:86400};constants.timeConversion=timeConversion;var areaConversion={m2:1,km2:0.000001,ha:0.0001,a:0.01,ft2:10.763911,yd2:1.19599,in2:1550.0031};constants.areaConversion=areaConversion;areaConversion.sqm=areaConversion.m2;areaConversion.sqkm=areaConversion.km2;areaConversion.sqft=areaConversion.ft2;areaConversion.sqyd=areaConversion.yd2;areaConversion.sqin=areaConversion.in2; + +var getCoordinateKey$1 = {}; + +Object.defineProperty(getCoordinateKey$1,"__esModule",{value:true});getCoordinateKey$1.default=void 0;var getCoordinateKey=function getCoordinateKey(point,keysToLookup){return keysToLookup.reduce(function(foundKey,key){if(typeof point==="undefined"||point===null){throw new Error("'".concat(point,"' is no valid coordinate."))}if(Object.prototype.hasOwnProperty.call(point,key)&&typeof key!=="undefined"&&typeof foundKey==="undefined"){foundKey=key;return key}return foundKey},undefined)};var _default$D=getCoordinateKey;getCoordinateKey$1.default=_default$D; + +var toDecimal$1 = {}; + +var isDecimal$1 = {}; + +Object.defineProperty(isDecimal$1,"__esModule",{value:true});isDecimal$1.default=void 0;var isDecimal=function isDecimal(value){var checkedValue=value.toString().trim();if(isNaN(parseFloat(checkedValue))){return false}return parseFloat(checkedValue)===Number(checkedValue)};var _default$C=isDecimal;isDecimal$1.default=_default$C; + +var isSexagesimal$1 = {}; + +Object.defineProperty(isSexagesimal$1,"__esModule",{value:true});isSexagesimal$1.default=void 0;var _constants$e=constants;var isSexagesimal=function isSexagesimal(value){return _constants$e.sexagesimalPattern.test(value.toString().trim())};var _default$B=isSexagesimal;isSexagesimal$1.default=_default$B; + +var sexagesimalToDecimal$1 = {}; + +Object.defineProperty(sexagesimalToDecimal$1,"__esModule",{value:true});sexagesimalToDecimal$1.default=void 0;var _constants$d=constants;var sexagesimalToDecimal=function sexagesimalToDecimal(sexagesimal){var data=new RegExp(_constants$d.sexagesimalPattern).exec(sexagesimal.toString().trim());if(typeof data==="undefined"||data===null){throw new Error("Given value is not in sexagesimal format")}var min=Number(data[2])/60||0;var sec=Number(data[4])/3600||0;var decimal=parseFloat(data[1])+min+sec;return ["S","W"].includes(data[7])?-decimal:decimal};var _default$A=sexagesimalToDecimal;sexagesimalToDecimal$1.default=_default$A; + +var isValidCoordinate$1 = {}; + +var getCoordinateKeys$1 = {}; + +Object.defineProperty(getCoordinateKeys$1,"__esModule",{value:true});getCoordinateKeys$1.default=void 0;var _constants$c=constants;var _getCoordinateKey$2=_interopRequireDefault$q(getCoordinateKey$1);function _interopRequireDefault$q(obj){return obj&&obj.__esModule?obj:{default:obj}}function ownKeys$1(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly)symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable});keys.push.apply(keys,symbols);}return keys}function _objectSpread$1(target){for(var i=1;i1&&arguments[1]!==undefined?arguments[1]:{longitude:_constants$c.longitudeKeys,latitude:_constants$c.latitudeKeys,altitude:_constants$c.altitudeKeys};var longitude=(0, _getCoordinateKey$2.default)(point,keysToLookup.longitude);var latitude=(0, _getCoordinateKey$2.default)(point,keysToLookup.latitude);var altitude=(0, _getCoordinateKey$2.default)(point,keysToLookup.altitude);return _objectSpread$1({latitude:latitude,longitude:longitude},altitude?{altitude:altitude}:{})};var _default$z=getCoordinateKeys;getCoordinateKeys$1.default=_default$z; + +var isValidLatitude$1 = {}; + +Object.defineProperty(isValidLatitude$1,"__esModule",{value:true});isValidLatitude$1.default=void 0;var _isDecimal$2=_interopRequireDefault$p(isDecimal$1);var _isSexagesimal$2=_interopRequireDefault$p(isSexagesimal$1);var _sexagesimalToDecimal$2=_interopRequireDefault$p(sexagesimalToDecimal$1);var _constants$b=constants;function _interopRequireDefault$p(obj){return obj&&obj.__esModule?obj:{default:obj}}var isValidLatitude=function isValidLatitude(value){if((0, _isDecimal$2.default)(value)){if(parseFloat(value)>_constants$b.MAXLAT||value<_constants$b.MINLAT){return false}return true}if((0, _isSexagesimal$2.default)(value)){return isValidLatitude((0, _sexagesimalToDecimal$2.default)(value))}return false};var _default$y=isValidLatitude;isValidLatitude$1.default=_default$y; + +var isValidLongitude$1 = {}; + +Object.defineProperty(isValidLongitude$1,"__esModule",{value:true});isValidLongitude$1.default=void 0;var _isDecimal$1=_interopRequireDefault$o(isDecimal$1);var _isSexagesimal$1=_interopRequireDefault$o(isSexagesimal$1);var _sexagesimalToDecimal$1=_interopRequireDefault$o(sexagesimalToDecimal$1);var _constants$a=constants;function _interopRequireDefault$o(obj){return obj&&obj.__esModule?obj:{default:obj}}var isValidLongitude=function isValidLongitude(value){if((0, _isDecimal$1.default)(value)){if(parseFloat(value)>_constants$a.MAXLON||value<_constants$a.MINLON){return false}return true}if((0, _isSexagesimal$1.default)(value)){return isValidLongitude((0, _sexagesimalToDecimal$1.default)(value))}return false};var _default$x=isValidLongitude;isValidLongitude$1.default=_default$x; + +Object.defineProperty(isValidCoordinate$1,"__esModule",{value:true});isValidCoordinate$1.default=void 0;var _getCoordinateKeys2=_interopRequireDefault$n(getCoordinateKeys$1);var _isValidLatitude=_interopRequireDefault$n(isValidLatitude$1);var _isValidLongitude=_interopRequireDefault$n(isValidLongitude$1);function _interopRequireDefault$n(obj){return obj&&obj.__esModule?obj:{default:obj}}var isValidCoordinate=function isValidCoordinate(point){var _getCoordinateKeys=(0, _getCoordinateKeys2.default)(point),latitude=_getCoordinateKeys.latitude,longitude=_getCoordinateKeys.longitude;if(Array.isArray(point)&&point.length>=2){return (0, _isValidLongitude.default)(point[0])&&(0, _isValidLatitude.default)(point[1])}if(typeof latitude==="undefined"||typeof longitude==="undefined"){return false}var lon=point[longitude];var lat=point[latitude];if(typeof lat==="undefined"||typeof lon==="undefined"){return false}if((0, _isValidLatitude.default)(lat)===false||(0, _isValidLongitude.default)(lon)===false){return false}return true};var _default$w=isValidCoordinate;isValidCoordinate$1.default=_default$w; + +Object.defineProperty(toDecimal$1,"__esModule",{value:true});toDecimal$1.default=void 0;var _isDecimal=_interopRequireDefault$m(isDecimal$1);var _isSexagesimal=_interopRequireDefault$m(isSexagesimal$1);var _sexagesimalToDecimal=_interopRequireDefault$m(sexagesimalToDecimal$1);var _isValidCoordinate=_interopRequireDefault$m(isValidCoordinate$1);var _getCoordinateKeys=_interopRequireDefault$m(getCoordinateKeys$1);function _interopRequireDefault$m(obj){return obj&&obj.__esModule?obj:{default:obj}}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly)symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable});keys.push.apply(keys,symbols);}return keys}function _objectSpread(target){for(var i=1;i3&&arguments[3]!==undefined?arguments[3]:6371000;var lat=(0, _getLatitude$9.default)(start);var lng=(0, _getLongitude$9.default)(start);var delta=distance/radius;var theta=(0, _toRad$7.default)(bearing);var phi1=(0, _toRad$7.default)(lat);var lambda1=(0, _toRad$7.default)(lng);var phi2=Math.asin(Math.sin(phi1)*Math.cos(delta)+Math.cos(phi1)*Math.sin(delta)*Math.cos(theta));var lambda2=lambda1+Math.atan2(Math.sin(theta)*Math.sin(delta)*Math.cos(phi1),Math.cos(delta)-Math.sin(phi1)*Math.sin(phi2));var longitude=(0, _toDeg$4.default)(lambda2);if(longitude<_constants$7.MINLON||longitude>_constants$7.MAXLON){lambda2=(lambda2+3*Math.PI)%(2*Math.PI)-Math.PI;longitude=(0, _toDeg$4.default)(lambda2);}return {latitude:(0, _toDeg$4.default)(phi2),longitude:longitude}};var _default$q=computeDestinationPoint;computeDestinationPoint$1.default=_default$q; + +var convertArea$1 = {}; + +Object.defineProperty(convertArea$1,"__esModule",{value:true});convertArea$1.default=void 0;var _constants$6=constants;var convertArea=function convertArea(squareMeters){var targetUnit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"m";var factor=_constants$6.areaConversion[targetUnit];if(factor){return squareMeters*factor}throw new Error("Invalid unit used for area conversion.")};var _default$p=convertArea;convertArea$1.default=_default$p; + +var convertDistance$1 = {}; + +Object.defineProperty(convertDistance$1,"__esModule",{value:true});convertDistance$1.default=void 0;var _constants$5=constants;var convertDistance=function convertDistance(meters){var targetUnit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"m";var factor=_constants$5.distanceConversion[targetUnit];if(factor){return meters*factor}throw new Error("Invalid unit used for distance conversion.")};var _default$o=convertDistance;convertDistance$1.default=_default$o; + +var convertSpeed$1 = {}; + +Object.defineProperty(convertSpeed$1,"__esModule",{value:true});convertSpeed$1.default=void 0;var _constants$4=constants;var convertSpeed=function convertSpeed(metersPerSecond){var targetUnit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"kmh";switch(targetUnit){case"kmh":return metersPerSecond*_constants$4.timeConversion.h*_constants$4.distanceConversion.km;case"mph":return metersPerSecond*_constants$4.timeConversion.h*_constants$4.distanceConversion.mi;default:return metersPerSecond;}};var _default$n=convertSpeed;convertSpeed$1.default=_default$n; + +var decimalToSexagesimal = {}; + +Object.defineProperty(decimalToSexagesimal,"__esModule",{value:true});decimalToSexagesimal.default=void 0;function _slicedToArray$1(arr,i){return _arrayWithHoles$1(arr)||_iterableToArrayLimit$1(arr,i)||_unsupportedIterableToArray$1(arr,i)||_nonIterableRest$1()}function _nonIterableRest$1(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray$1(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray$1(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(o);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray$1(o,minLen)}function _arrayLikeToArray$1(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i1&&arguments[1]!==undefined?arguments[1]:4;var factor=Math.pow(10,decimals);return Math.round(number*factor)/factor};var decimal2sexagesimalNext=function decimal2sexagesimalNext(decimal){var _decimal$toString$spl=decimal.toString().split("."),_decimal$toString$spl2=_slicedToArray$1(_decimal$toString$spl,2),pre=_decimal$toString$spl2[0],post=_decimal$toString$spl2[1];var deg=Math.abs(Number(pre));var min0=Number("0."+(post||0))*60;var sec0=min0.toString().split(".");var min=Math.floor(min0);var sec=imprecise(Number("0."+(sec0[1]||0))*60).toString();var _sec$split=sec.split("."),_sec$split2=_slicedToArray$1(_sec$split,2),secPreDec=_sec$split2[0],_sec$split2$=_sec$split2[1],secDec=_sec$split2$===void 0?"0":_sec$split2$;return deg+"\xB0 "+min.toString().padStart(2,"0")+"' "+secPreDec.padStart(2,"0")+"."+secDec.padEnd(1,"0")+"\""};var _default$m=decimal2sexagesimalNext;decimalToSexagesimal.default=_default$m; + +var findNearest$1 = {}; + +var orderByDistance$1 = {}; + +var getDistance$2 = {}; + +var robustAcos$1 = {}; + +Object.defineProperty(robustAcos$1,"__esModule",{value:true});robustAcos$1.default=void 0;var robustAcos=function robustAcos(value){if(value>1){return 1}if(value<-1){return -1}return value};var _default$l=robustAcos;robustAcos$1.default=_default$l; + +Object.defineProperty(getDistance$2,"__esModule",{value:true});getDistance$2.default=void 0;var _getLatitude$8=_interopRequireDefault$i(getLatitude$1);var _getLongitude$8=_interopRequireDefault$i(getLongitude$1);var _toRad$6=_interopRequireDefault$i(toRad$1);var _robustAcos$1=_interopRequireDefault$i(robustAcos$1);var _constants$3=constants;function _interopRequireDefault$i(obj){return obj&&obj.__esModule?obj:{default:obj}}var getDistance$1=function getDistance(from,to){var accuracy=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;accuracy=typeof accuracy!=="undefined"&&!isNaN(accuracy)?accuracy:1;var fromLat=(0, _getLatitude$8.default)(from);var fromLon=(0, _getLongitude$8.default)(from);var toLat=(0, _getLatitude$8.default)(to);var toLon=(0, _getLongitude$8.default)(to);var distance=Math.acos((0, _robustAcos$1.default)(Math.sin((0, _toRad$6.default)(toLat))*Math.sin((0, _toRad$6.default)(fromLat))+Math.cos((0, _toRad$6.default)(toLat))*Math.cos((0, _toRad$6.default)(fromLat))*Math.cos((0, _toRad$6.default)(fromLon)-(0, _toRad$6.default)(toLon))))*_constants$3.earthRadius;return Math.round(distance/accuracy)*accuracy};var _default$k=getDistance$1;getDistance$2.default=_default$k; + +Object.defineProperty(orderByDistance$1,"__esModule",{value:true});orderByDistance$1.default=void 0;var _getDistance$5=_interopRequireDefault$h(getDistance$2);function _interopRequireDefault$h(obj){return obj&&obj.__esModule?obj:{default:obj}}var orderByDistance=function orderByDistance(point,coords){var distanceFn=arguments.length>2&&arguments[2]!==undefined?arguments[2]:_getDistance$5.default;distanceFn=typeof distanceFn==="function"?distanceFn:_getDistance$5.default;return coords.slice().sort(function(a,b){return distanceFn(point,a)-distanceFn(point,b)})};var _default$j=orderByDistance;orderByDistance$1.default=_default$j; + +Object.defineProperty(findNearest$1,"__esModule",{value:true});findNearest$1.default=void 0;var _orderByDistance=_interopRequireDefault$g(orderByDistance$1);function _interopRequireDefault$g(obj){return obj&&obj.__esModule?obj:{default:obj}}var findNearest=function findNearest(point,coords){return (0, _orderByDistance.default)(point,coords)[0]};var _default$i=findNearest;findNearest$1.default=_default$i; + +var getAreaOfPolygon$1 = {}; + +Object.defineProperty(getAreaOfPolygon$1,"__esModule",{value:true});getAreaOfPolygon$1.default=void 0;var _toRad$5=_interopRequireDefault$f(toRad$1);var _getLatitude$7=_interopRequireDefault$f(getLatitude$1);var _getLongitude$7=_interopRequireDefault$f(getLongitude$1);var _constants$2=constants;function _interopRequireDefault$f(obj){return obj&&obj.__esModule?obj:{default:obj}}var getAreaOfPolygon=function getAreaOfPolygon(points){var area=0;if(points.length>2){var lowerIndex;var middleIndex;var upperIndex;for(var i=0;iMIN_LAT_RAD&&maxLatMAX_LON_RAD){maxLon-=Math.PI*2;}}else {minLat=Math.max(minLat,MIN_LAT_RAD);maxLat=Math.min(maxLat,MAX_LAT_RAD);minLon=MIN_LON_RAD;maxLon=MAX_LON_RAD;}return [{latitude:(0, _toDeg$3.default)(minLat),longitude:(0, _toDeg$3.default)(minLon)},{latitude:(0, _toDeg$3.default)(maxLat),longitude:(0, _toDeg$3.default)(maxLon)}]};var _default$f=getBoundsOfDistance;getBoundsOfDistance$1.default=_default$f; + +var getCenter$1 = {}; + +Object.defineProperty(getCenter$1,"__esModule",{value:true});getCenter$1.default=void 0;var _getLatitude$4=_interopRequireDefault$c(getLatitude$1);var _getLongitude$4=_interopRequireDefault$c(getLongitude$1);var _toRad$3=_interopRequireDefault$c(toRad$1);var _toDeg$2=_interopRequireDefault$c(toDeg$1);function _interopRequireDefault$c(obj){return obj&&obj.__esModule?obj:{default:obj}}var getCenter=function getCenter(points){if(Array.isArray(points)===false||points.length===0){return false}var numberOfPoints=points.length;var sum=points.reduce(function(acc,point){var pointLat=(0, _toRad$3.default)((0, _getLatitude$4.default)(point));var pointLon=(0, _toRad$3.default)((0, _getLongitude$4.default)(point));return {X:acc.X+Math.cos(pointLat)*Math.cos(pointLon),Y:acc.Y+Math.cos(pointLat)*Math.sin(pointLon),Z:acc.Z+Math.sin(pointLat)}},{X:0,Y:0,Z:0});var X=sum.X/numberOfPoints;var Y=sum.Y/numberOfPoints;var Z=sum.Z/numberOfPoints;return {longitude:(0, _toDeg$2.default)(Math.atan2(Y,X)),latitude:(0, _toDeg$2.default)(Math.atan2(Z,Math.sqrt(X*X+Y*Y)))}};var _default$e=getCenter;getCenter$1.default=_default$e; + +var getCenterOfBounds$1 = {}; + +Object.defineProperty(getCenterOfBounds$1,"__esModule",{value:true});getCenterOfBounds$1.default=void 0;var _getBounds=_interopRequireDefault$b(getBounds$1);function _interopRequireDefault$b(obj){return obj&&obj.__esModule?obj:{default:obj}}var getCenterOfBounds=function getCenterOfBounds(coords){var bounds=(0, _getBounds.default)(coords);var latitude=bounds.minLat+(bounds.maxLat-bounds.minLat)/2;var longitude=bounds.minLng+(bounds.maxLng-bounds.minLng)/2;return {latitude:parseFloat(latitude.toFixed(6)),longitude:parseFloat(longitude.toFixed(6))}};var _default$d=getCenterOfBounds;getCenterOfBounds$1.default=_default$d; + +var getCompassDirection$1 = {}; + +var getRhumbLineBearing$1 = {}; + +Object.defineProperty(getRhumbLineBearing$1,"__esModule",{value:true});getRhumbLineBearing$1.default=void 0;var _getLatitude$3=_interopRequireDefault$a(getLatitude$1);var _getLongitude$3=_interopRequireDefault$a(getLongitude$1);var _toRad$2=_interopRequireDefault$a(toRad$1);var _toDeg$1=_interopRequireDefault$a(toDeg$1);function _interopRequireDefault$a(obj){return obj&&obj.__esModule?obj:{default:obj}}var getRhumbLineBearing=function getRhumbLineBearing(origin,dest){var diffLon=(0, _toRad$2.default)((0, _getLongitude$3.default)(dest))-(0, _toRad$2.default)((0, _getLongitude$3.default)(origin));var diffPhi=Math.log(Math.tan((0, _toRad$2.default)((0, _getLatitude$3.default)(dest))/2+Math.PI/4)/Math.tan((0, _toRad$2.default)((0, _getLatitude$3.default)(origin))/2+Math.PI/4));if(Math.abs(diffLon)>Math.PI){if(diffLon>0){diffLon=(Math.PI*2-diffLon)*-1;}else {diffLon=Math.PI*2+diffLon;}}return ((0, _toDeg$1.default)(Math.atan2(diffLon,diffPhi))+360)%360};var _default$c=getRhumbLineBearing;getRhumbLineBearing$1.default=_default$c; + +Object.defineProperty(getCompassDirection$1,"__esModule",{value:true});getCompassDirection$1.default=void 0;var _getRhumbLineBearing=_interopRequireDefault$9(getRhumbLineBearing$1);function _interopRequireDefault$9(obj){return obj&&obj.__esModule?obj:{default:obj}}var getCompassDirection=function getCompassDirection(origin,dest){var bearingFn=arguments.length>2&&arguments[2]!==undefined?arguments[2]:_getRhumbLineBearing.default;var bearing=typeof bearingFn==="function"?bearingFn(origin,dest):(0, _getRhumbLineBearing.default)(origin,dest);if(isNaN(bearing)){throw new Error("Could not calculate bearing for given points. Check your bearing function")}switch(Math.round(bearing/22.5)){case 1:return "NNE";case 2:return "NE";case 3:return "ENE";case 4:return "E";case 5:return "ESE";case 6:return "SE";case 7:return "SSE";case 8:return "S";case 9:return "SSW";case 10:return "SW";case 11:return "WSW";case 12:return "W";case 13:return "WNW";case 14:return "NW";case 15:return "NNW";default:return "N";}};var _default$b=getCompassDirection;getCompassDirection$1.default=_default$b; + +var getDistanceFromLine$1 = {}; + +Object.defineProperty(getDistanceFromLine$1,"__esModule",{value:true});getDistanceFromLine$1.default=void 0;var _getDistance$4=_interopRequireDefault$8(getDistance$2);var _robustAcos=_interopRequireDefault$8(robustAcos$1);function _interopRequireDefault$8(obj){return obj&&obj.__esModule?obj:{default:obj}}var getDistanceFromLine=function getDistanceFromLine(point,lineStart,lineEnd){var accuracy=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;var d1=(0, _getDistance$4.default)(lineStart,point,accuracy);var d2=(0, _getDistance$4.default)(point,lineEnd,accuracy);var d3=(0, _getDistance$4.default)(lineStart,lineEnd,accuracy);var alpha=Math.acos((0, _robustAcos.default)((d1*d1+d3*d3-d2*d2)/(2*d1*d3)));var beta=Math.acos((0, _robustAcos.default)((d2*d2+d3*d3-d1*d1)/(2*d2*d3)));if(alpha>Math.PI/2){return d1}if(beta>Math.PI/2){return d2}return Math.sin(alpha)*d1};var _default$a=getDistanceFromLine;getDistanceFromLine$1.default=_default$a; + +var getGreatCircleBearing$1 = {}; + +Object.defineProperty(getGreatCircleBearing$1,"__esModule",{value:true});getGreatCircleBearing$1.default=void 0;var _getLatitude$2=_interopRequireDefault$7(getLatitude$1);var _getLongitude$2=_interopRequireDefault$7(getLongitude$1);var _toRad$1=_interopRequireDefault$7(toRad$1);var _toDeg=_interopRequireDefault$7(toDeg$1);function _interopRequireDefault$7(obj){return obj&&obj.__esModule?obj:{default:obj}}var getGreatCircleBearing=function getGreatCircleBearing(origin,dest){var destLat=(0, _getLatitude$2.default)(dest);var detLon=(0, _getLongitude$2.default)(dest);var originLat=(0, _getLatitude$2.default)(origin);var originLon=(0, _getLongitude$2.default)(origin);var bearing=((0, _toDeg.default)(Math.atan2(Math.sin((0, _toRad$1.default)(detLon)-(0, _toRad$1.default)(originLon))*Math.cos((0, _toRad$1.default)(destLat)),Math.cos((0, _toRad$1.default)(originLat))*Math.sin((0, _toRad$1.default)(destLat))-Math.sin((0, _toRad$1.default)(originLat))*Math.cos((0, _toRad$1.default)(destLat))*Math.cos((0, _toRad$1.default)(detLon)-(0, _toRad$1.default)(originLon))))+360)%360;return bearing};var _default$9=getGreatCircleBearing;getGreatCircleBearing$1.default=_default$9; + +var getPathLength$1 = {}; + +Object.defineProperty(getPathLength$1,"__esModule",{value:true});getPathLength$1.default=void 0;var _getDistance$3=_interopRequireDefault$6(getDistance$2);function _interopRequireDefault$6(obj){return obj&&obj.__esModule?obj:{default:obj}}function _typeof(obj){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function _typeof(obj){return typeof obj};}else {_typeof=function _typeof(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};}return _typeof(obj)}var getPathLength=function getPathLength(points){var distanceFn=arguments.length>1&&arguments[1]!==undefined?arguments[1]:_getDistance$3.default;return points.reduce(function(acc,point){if(_typeof(acc)==="object"&&acc.last!==null){acc.distance+=distanceFn(point,acc.last);}acc.last=point;return acc},{last:null,distance:0}).distance};var _default$8=getPathLength;getPathLength$1.default=_default$8; + +var getPreciseDistance = {}; + +Object.defineProperty(getPreciseDistance,"__esModule",{value:true});getPreciseDistance.default=void 0;var _getLatitude$1=_interopRequireDefault$5(getLatitude$1);var _getLongitude$1=_interopRequireDefault$5(getLongitude$1);var _toRad=_interopRequireDefault$5(toRad$1);var _constants=constants;function _interopRequireDefault$5(obj){return obj&&obj.__esModule?obj:{default:obj}}var getDistance=function getDistance(start,end){var accuracy=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;accuracy=typeof accuracy!=="undefined"&&!isNaN(accuracy)?accuracy:1;var startLat=(0, _getLatitude$1.default)(start);var startLon=(0, _getLongitude$1.default)(start);var endLat=(0, _getLatitude$1.default)(end);var endLon=(0, _getLongitude$1.default)(end);var b=6356752.314245;var ellipsoidParams=1/298.257223563;var L=(0, _toRad.default)(endLon-startLon);var cosSigma;var sigma;var sinAlpha;var cosSqAlpha;var cos2SigmaM;var sinSigma;var U1=Math.atan((1-ellipsoidParams)*Math.tan((0, _toRad.default)(parseFloat(startLat))));var U2=Math.atan((1-ellipsoidParams)*Math.tan((0, _toRad.default)(parseFloat(endLat))));var sinU1=Math.sin(U1);var cosU1=Math.cos(U1);var sinU2=Math.sin(U2);var cosU2=Math.cos(U2);var lambda=L;var lambdaP;var iterLimit=100;do{var sinLambda=Math.sin(lambda);var cosLambda=Math.cos(lambda);sinSigma=Math.sqrt(cosU2*sinLambda*(cosU2*sinLambda)+(cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma===0){return 0}cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;sigma=Math.atan2(sinSigma,cosSigma);sinAlpha=cosU1*cosU2*sinLambda/sinSigma;cosSqAlpha=1-sinAlpha*sinAlpha;cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;if(isNaN(cos2SigmaM)){cos2SigmaM=0;}var C=ellipsoidParams/16*cosSqAlpha*(4+ellipsoidParams*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*ellipsoidParams*sinAlpha*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));}while(Math.abs(lambda-lambdaP)>1e-12&&--iterLimit>0);if(iterLimit===0){return NaN}var uSq=cosSqAlpha*(_constants.earthRadius*_constants.earthRadius-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));var distance=b*A*(sigma-deltaSigma);return Math.round(distance/accuracy)*accuracy};var _default$7=getDistance;getPreciseDistance.default=_default$7; + +var getRoughCompassDirection$1 = {}; + +Object.defineProperty(getRoughCompassDirection$1,"__esModule",{value:true});getRoughCompassDirection$1.default=void 0;var getRoughCompassDirection=function getRoughCompassDirection(exact){if(/^(NNE|NE|NNW|N)$/.test(exact)){return "N"}if(/^(ENE|E|ESE|SE)$/.test(exact)){return "E"}if(/^(SSE|S|SSW|SW)$/.test(exact)){return "S"}if(/^(WSW|W|WNW|NW)$/.test(exact)){return "W"}};var _default$6=getRoughCompassDirection;getRoughCompassDirection$1.default=_default$6; + +var getSpeed$1 = {}; + +Object.defineProperty(getSpeed$1,"__esModule",{value:true});getSpeed$1.default=void 0;var _getDistance$2=_interopRequireDefault$4(getDistance$2);function _interopRequireDefault$4(obj){return obj&&obj.__esModule?obj:{default:obj}}var getSpeed=function getSpeed(start,end){var distanceFn=arguments.length>2&&arguments[2]!==undefined?arguments[2]:_getDistance$2.default;var distance=distanceFn(start,end);var time=Number(end.time)-Number(start.time);var metersPerSecond=distance/time*1000;return metersPerSecond};var _default$5=getSpeed;getSpeed$1.default=_default$5; + +var isPointInLine$1 = {}; + +Object.defineProperty(isPointInLine$1,"__esModule",{value:true});isPointInLine$1.default=void 0;var _getDistance$1=_interopRequireDefault$3(getDistance$2);function _interopRequireDefault$3(obj){return obj&&obj.__esModule?obj:{default:obj}}var isPointInLine=function isPointInLine(point,lineStart,lineEnd){return (0, _getDistance$1.default)(lineStart,point)+(0, _getDistance$1.default)(point,lineEnd)===(0, _getDistance$1.default)(lineStart,lineEnd)};var _default$4=isPointInLine;isPointInLine$1.default=_default$4; + +var isPointInPolygon$1 = {}; + +Object.defineProperty(isPointInPolygon$1,"__esModule",{value:true});isPointInPolygon$1.default=void 0;var _getLatitude=_interopRequireDefault$2(getLatitude$1);var _getLongitude=_interopRequireDefault$2(getLongitude$1);function _interopRequireDefault$2(obj){return obj&&obj.__esModule?obj:{default:obj}}var isPointInPolygon=function isPointInPolygon(point,polygon){var isInside=false;var totalPolys=polygon.length;for(var i=-1,j=totalPolys-1;++iarr.length)len=arr.length;for(var i=0,arr2=new Array(len);i { + ArrowDirection2["NONE"] = "none"; + ArrowDirection2["FROM_SIDE_1_TO_SIDE_2"] = "fromSide1ToSide2"; + ArrowDirection2["FROM_SIDE_2_TO_SIDE_1"] = "fromSide2ToSide1"; + return ArrowDirection2; +})(ArrowDirection || {}); +const defaultProps$5 = { + sizeMinPixels: { type: "number", min: 0, value: 0 }, + // min size in pixels + sizeMaxPixels: { type: "number", min: 0, value: Number.MAX_SAFE_INTEGER }, + // max size in pixels + // getDistance: { type: 'accessor', value: (arrow: Arrow) => arrow.distance }, + getLine: { type: "function", value: (arrow) => arrow.line }, + // getLinePositions: { + // type: 'function', + // value: (line: Line) => line.positions, + // }, + getSize: { type: "accessor", value: 1 }, + getColor: { type: "accessor", value: DEFAULT_COLOR }, + getSpeedFactor: { type: "accessor", value: 1 }, + getDirection: { type: "accessor", value: "none" /* NONE */ }, + animated: { type: "boolean", value: true }, + getLineParallelIndex: { type: "accessor", value: 0 }, + getLineAngles: { type: "accessor", value: [0, 0, 0] }, + maxParallelOffset: { type: "number", value: 100 }, + minParallelOffset: { type: "number", value: 3 }, + opacity: { type: "number", value: 1 }, + getDistanceBetweenLines: { type: "accessor", value: 1e3 } +}; +class ArrowLayer extends Layer { + static layerName = "ArrowLayer"; + static defaultProps = defaultProps$5; + getShaders() { + return super.getShaders({ vs, fs, modules: [project32, picking] }); + } + getArrowLineAttributes(arrow) { + const line = this.props.getLine(arrow); + if (!line) { + throw new Error("Invalid line"); + } + const attributes = this.state.lineAttributes.get(line); + if (!attributes) { + throw new Error(`Line ${line.id} not found`); + } + return attributes; + } + initializeState() { + const { device } = this.context; + if (!device.features.has("texture-blend-float-webgl")) { + throw new Error("Arrow layer not supported on this browser"); + } + const maxTextureSize = device.getParametersWebGL( + GL.MAX_TEXTURE_SIZE + ); + this.state = { + maxTextureSize + }; + this.getAttributeManager()?.addInstanced({ + instanceSize: { + size: 1, + type: "float32", + transition: true, + accessor: "getSize", + defaultValue: 1 + }, + instanceColor: { + size: this.props.colorFormat.length, + transition: true, + type: "unorm8", + // normalized: true, + accessor: "getColor", + defaultValue: [0, 0, 0, 255] + }, + instanceSpeedFactor: { + size: 1, + type: "float32", + transition: true, + accessor: "getSpeedFactor", + defaultValue: 1 + }, + instanceArrowDistance: { + size: 1, + transition: true, + accessor: "getDistance", + type: "float32", + defaultValue: 0 + }, + instanceArrowDirection: { + size: 1, + type: "float32", + transition: true, + accessor: "getDirection", + transform: (direction) => { + switch (direction) { + case "none" /* NONE */: + return 0; + case "fromSide1ToSide2" /* FROM_SIDE_1_TO_SIDE_2 */: + return 1; + case "fromSide2ToSide1" /* FROM_SIDE_2_TO_SIDE_1 */: + return 2; + default: + throw new Error("impossible"); + } + }, + defaultValue: 0 + }, + instanceLineDistance: { + size: 1, + transition: true, + type: "float32", + accessor: (arrow) => this.getArrowLineAttributes(arrow).distance + }, + instanceLinePositionsTextureOffset: { + size: 1, + transition: true, + type: "sint32", + accessor: (arrow) => this.getArrowLineAttributes(arrow).positionsTextureOffset + }, + instanceLineDistancesTextureOffset: { + size: 1, + transition: true, + type: "sint32", + accessor: (arrow) => this.getArrowLineAttributes(arrow).distancesTextureOffset + }, + instanceLinePointCount: { + size: 1, + transition: true, + type: "sint32", + accessor: (arrow) => this.getArrowLineAttributes(arrow).pointCount + }, + instanceLineParallelIndex: { + size: 1, + accessor: "getLineParallelIndex", + type: "float32" + }, + instanceLineAngles: { + size: 3, + accessor: "getLineAngles", + type: "float32" + }, + instanceProximityFactors: { + size: 2, + accessor: "getProximityFactors", + //TODO where is it ??? + type: "float32" + }, + instanceDistanceBetweenLines: { + size: 1, + transition: true, + accessor: "getDistanceBetweenLines", + type: "float32", + defaultValue: 1e3 + } + }); + } + finalizeState(context) { + super.finalizeState(context); + this.state.stop = true; + } + createTexture2D(device, data, elementSize, format) { + const start = performance.now(); + const { maxTextureSize } = this.state; + const elementCount = data.length / elementSize; + const width = Math.min(maxTextureSize, elementCount); + const height = Math.ceil(elementCount / width); + if (height > maxTextureSize) { + throw new Error( + `Texture size ${width}*${height} cannot be greater than ${maxTextureSize}` + ); + } + const newLength = width * height * elementSize; + if (data.length < newLength) { + const oldLength = data.length; + data.length = newLength; + data.fill(0, oldLength, newLength); + } + const texture2d = device.createTexture({ + width, + height, + format, + type: GL.FLOAT, + data: new Float32Array(data), + parameters: { + [GL.TEXTURE_MAG_FILTER]: GL.NEAREST, + [GL.TEXTURE_MIN_FILTER]: GL.NEAREST, + [GL.TEXTURE_WRAP_S]: GL.CLAMP_TO_EDGE, + [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE + }, + mipmaps: false + }); + const stop = performance.now(); + console.info( + `Texture of ${newLength} elements (${width} * ${height}) created in ${stop - start} ms` + ); + return texture2d; + } + createTexturesStructure(props) { + const start = performance.now(); + const linePositionsTextureData = []; + const lineDistancesTextureData = []; + const lineAttributes = /* @__PURE__ */ new Map(); + let lineDistance = 0; + const lines = [ + ...new Set(props.data.map((arrow) => this.props.getLine(arrow))) + ]; + lines.forEach((line) => { + const positions = props.getLinePositions(line); + if (!positions) { + throw new Error(`Invalid positions for line ${line.id}`); + } + const linePositionsTextureOffset = linePositionsTextureData.length / 2; + const lineDistancesTextureOffset = lineDistancesTextureData.length; + let linePointCount = 0; + if (positions.length > 0) { + positions.forEach((position) => { + linePositionsTextureData.push(position[0]); + linePositionsTextureData.push(position[1]); + linePointCount++; + }); + lineDistancesTextureData.push(...line.cumulativeDistances); + lineDistance = line.cumulativeDistances[line.cumulativeDistances.length - 1]; + } + if (linePointCount > MAX_LINE_POINT_COUNT) { + throw new Error( + `Too many line point count (${linePointCount}), maximum is ${MAX_LINE_POINT_COUNT}` + ); + } + lineAttributes.set(line, { + distance: lineDistance, + positionsTextureOffset: linePositionsTextureOffset, + distancesTextureOffset: lineDistancesTextureOffset, + pointCount: linePointCount + }); + }); + const stop = performance.now(); + console.info(`Texture data created in ${stop - start} ms`); + return { + linePositionsTextureData, + lineDistancesTextureData, + lineAttributes + }; + } + updateGeometry({ props, changeFlags }) { + const geometryChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getLinePositions); + if (geometryChanged) { + const { device } = this.context; + const { + linePositionsTextureData, + lineDistancesTextureData, + lineAttributes + } = this.createTexturesStructure(props); + const linePositionsTexture = this.createTexture2D( + device, + linePositionsTextureData, + 2, + "rg32float" + //GL.RG32F, + ); + const lineDistancesTexture = this.createTexture2D( + device, + lineDistancesTextureData, + 1, + "r32float" + //GL.R32F, + ); + this.setState({ + linePositionsTexture, + lineDistancesTexture, + lineAttributes + }); + if (!changeFlags.dataChanged) { + this.getAttributeManager()?.invalidateAll(); + } + } + } + updateModel({ changeFlags }) { + if (changeFlags.somethingChanged) { + const { device } = this.context; + const { model } = this.state; + if (model) { + model.destroy(); + } + this.setState({ + model: this._getModel(device) + }); + this.getAttributeManager()?.invalidateAll(); + } + } + updateState(updateParams) { + super.updateState(updateParams); + this.updateGeometry(updateParams); + this.updateModel(updateParams); + const { props, oldProps } = updateParams; + if (props.animated !== oldProps.animated) { + this.setState({ + stop: !props.animated, + timestamp: 0 + }); + if (props.animated) { + this.startAnimation(); + } + } + } + animate(timestamp) { + if (this.state.stop) { + return; + } + this.setState({ + timestamp + }); + this.startAnimation(); + } + startAnimation() { + window.requestAnimationFrame((timestamp) => this.animate(timestamp)); + } + draw({ + uniforms, + renderPass + }) { + const { sizeMinPixels, sizeMaxPixels, opacity } = this.props; + const { + model, + linePositionsTexture, + lineDistancesTexture, + timestamp + // maxTextureSize, + } = this.state; + model.setBindings({ + linePositionsTexture, + lineDistancesTexture + }); + model.setUniforms({ + ...uniforms, + sizeMinPixels, + sizeMaxPixels, + // maxTextureSize, + linePositionsTextureSize: [ + linePositionsTexture.width, + linePositionsTexture.height + ], + opacity, + lineDistancesTextureSize: [ + lineDistancesTexture.width, + lineDistancesTexture.height + ], + timestamp, + maxParallelOffset: this.props.maxParallelOffset, + minParallelOffset: this.props.minParallelOffset + }); + model.draw(renderPass); + } + _getModel(device) { + const positions = [ + -1, + -1, + 0, + 0, + 1, + 0, + 0, + -0.6, + 0, + 1, + -1, + 0, + 0, + 1, + 0, + 0, + -0.6, + 0 + ]; + return new Model( + device, + Object.assign(this.getShaders(), { + id: this.props.id, + bufferLayout: this.getAttributeManager().getBufferLayouts(), + geometry: new Geometry({ + topology: "triangle-list", + vertexCount: 6, + attributes: { + positions: { + size: 3, + value: new Float32Array(positions) + } + } + }), + isInstanced: true + }) + ); + } +} + +const substationPositionByIdIndexer = (map, substation) => { + map.set(substation.id, substation.coordinate); + return map; +}; +const linePositionByIdIndexer = (map, line) => { + map.set(line.id, line.coordinates); + return map; +}; +class GeoData { + substationPositionsById = /* @__PURE__ */ new Map(); + linePositionsById = /* @__PURE__ */ new Map(); + constructor(substationPositionsById, linePositionsById) { + this.substationPositionsById = substationPositionsById; + this.linePositionsById = linePositionsById; + } + setSubstationPositions(positions) { + this.substationPositionsById = positions.reduce( + substationPositionByIdIndexer, + /* @__PURE__ */ new Map() + ); + } + updateSubstationPositions(substationIdsToUpdate, fetchedPositions) { + fetchedPositions.forEach( + (pos) => this.substationPositionsById.set(pos.id, pos.coordinate) + ); + substationIdsToUpdate.filter((id) => !fetchedPositions.map((pos) => pos.id).includes(id)).forEach((id) => this.substationPositionsById.delete(id)); + } + getSubstationPosition(substationId) { + const position = this.substationPositionsById.get(substationId); + if (!position) { + console.warn(`Position not found for ${substationId}`); + return [0, 0]; + } + return [position.lon, position.lat]; + } + setLinePositions(positions) { + this.linePositionsById = positions.reduce( + linePositionByIdIndexer, + /* @__PURE__ */ new Map() + ); + } + updateLinePositions(lineIdsToUpdate, fetchedPositions) { + fetchedPositions.forEach((pos) => { + this.linePositionsById.set(pos.id, pos.coordinates); + }); + lineIdsToUpdate.filter((id) => !fetchedPositions.map((pos) => pos.id).includes(id)).forEach((id) => this.linePositionsById.delete(id)); + } + /** + * Get line positions always ordered from side 1 to side 2. + */ + getLinePositions(network, line, detailed = true) { + const voltageLevel1 = network.getVoltageLevel(line.voltageLevelId1); + if (!voltageLevel1) { + throw new Error( + `Voltage level side 1 '${line.voltageLevelId1}' not found` + ); + } + const voltageLevel2 = network.getVoltageLevel(line.voltageLevelId2); + if (!voltageLevel2) { + throw new Error( + `Voltage level side 2 '${line.voltageLevelId1}' not found` + ); + } + const substationPosition1 = this.getSubstationPosition( + voltageLevel1.substationId + ); + const substationPosition2 = this.getSubstationPosition( + voltageLevel2.substationId + ); + if (substationPosition1[0] === 0 && substationPosition1[1] === 0 || substationPosition2[0] === 0 && substationPosition2[1] === 0) { + return [ + [0, 0], + [0, 0] + ]; + } + if (detailed) { + const linePositions = this.linePositionsById.get(line.id); + if (linePositions) { + const positions = new Array(linePositions.length); + for (const [index, position] of linePositions.entries()) { + positions[index] = [position.lon, position.lat]; + } + return positions; + } + } + return [substationPosition1, substationPosition2]; + } + getLineDistances(positions) { + if (positions !== null && positions.length > 1) { + const cumulativeDistanceArray = [0]; + let cumulativeDistance = 0; + let segmentDistance; + let ruler; + for (let i = 0; i < positions.length - 1; i++) { + ruler = new CheapRuler(positions[i][1], "meters"); + segmentDistance = ruler.lineDistance(positions.slice(i, i + 2)); + cumulativeDistance = cumulativeDistance + segmentDistance; + cumulativeDistanceArray[i + 1] = cumulativeDistance; + } + return cumulativeDistanceArray; + } + return null; + } + /** + * Find the segment in which we reach the wanted distance and return the segment + * along with the remaining distance to travel on this segment to be at the exact wanted distance + * (implemented using a binary search) + */ + findSegment(positions, cumulativeDistances, wantedDistance) { + let lowerBound = 0; + let upperBound = cumulativeDistances.length - 1; + let middlePoint; + while (lowerBound + 1 !== upperBound) { + middlePoint = Math.floor((lowerBound + upperBound) / 2); + const middlePointDistance = cumulativeDistances[middlePoint]; + if (middlePointDistance <= wantedDistance) { + lowerBound = middlePoint; + } else { + upperBound = middlePoint; + } + } + return { + idx: lowerBound, + segment: positions.slice(lowerBound, lowerBound + 2), + remainingDistance: wantedDistance - cumulativeDistances[lowerBound] + }; + } + labelDisplayPosition(positions, cumulativeDistances, arrowPosition, arrowDirection, lineParallelIndex, lineAngle, proximityAngle, distanceBetweenLines, proximityFactor) { + if (arrowPosition > 1 || arrowPosition < 0) { + throw new Error( + "Proportional position value incorrect: " + arrowPosition + ); + } + if (cumulativeDistances === null || cumulativeDistances.length < 2 || cumulativeDistances[cumulativeDistances.length - 1] === 0) { + return null; + } + const lineDistance = cumulativeDistances[cumulativeDistances.length - 1]; + let wantedDistance = lineDistance * arrowPosition; + if (cumulativeDistances.length === 2) { + wantedDistance = wantedDistance - 2 * distanceBetweenLines * arrowPosition * proximityFactor; + } + const goodSegment = this.findSegment( + positions, + cumulativeDistances, + wantedDistance + ); + let multiplier; + switch (arrowDirection) { + case ArrowDirection.FROM_SIDE_2_TO_SIDE_1: + multiplier = 1.005; + break; + case ArrowDirection.FROM_SIDE_1_TO_SIDE_2: + multiplier = 0.995; + break; + case ArrowDirection.NONE: + multiplier = 1; + break; + default: + throw new Error("impossible"); + } + const remainingDistance = goodSegment.remainingDistance * multiplier; + const angle = this.getMapAngle( + goodSegment.segment[0], + goodSegment.segment[1] + ); + const neededOffset = this.getLabelOffset(angle, 20, arrowDirection); + const position = { + position: es.computeDestinationPoint( + goodSegment.segment[0], + remainingDistance, + angle + ), + angle, + offset: neededOffset + }; + position.position = es.computeDestinationPoint( + position.position, + distanceBetweenLines * lineParallelIndex, + lineAngle + 90 + ); + if (cumulativeDistances.length === 2) { + position.position = es.computeDestinationPoint( + position.position, + -distanceBetweenLines * proximityFactor, + lineAngle + ); + } else if (goodSegment.idx === 0 || goodSegment.idx === cumulativeDistances.length - 2) { + const segmentDistance = cumulativeDistances[goodSegment.idx + 1] - cumulativeDistances[goodSegment.idx]; + const alreadyDoneDistance = segmentDistance - remainingDistance; + let labelDistanceInSegment; + if (goodSegment.idx === 0) { + labelDistanceInSegment = -alreadyDoneDistance; + } else { + labelDistanceInSegment = remainingDistance; + } + const labelPercentage = labelDistanceInSegment / segmentDistance; + position.position = es.computeDestinationPoint( + position.position, + distanceBetweenLines * labelPercentage, + proximityAngle + ); + } + return position; + } + getLabelOffset(angle, offsetDistance, arrowDirection) { + const radiantAngle = (-angle + 90) / (180 / Math.PI); + let direction = 0; + switch (arrowDirection) { + case ArrowDirection.FROM_SIDE_2_TO_SIDE_1: + direction = 1; + break; + case ArrowDirection.FROM_SIDE_1_TO_SIDE_2: + direction = -1; + break; + case ArrowDirection.NONE: + direction = 0; + break; + default: + throw new Error("impossible"); + } + return [ + Math.cos(radiantAngle) * offsetDistance * direction, + -Math.sin(radiantAngle) * offsetDistance * direction + ]; + } + //returns the angle between point1 and point2 in degrees [0-360) + getMapAngle(point1, point2) { + let angle = es.getRhumbLineBearing(point1, point2); + const angle2 = es.getGreatCircleBearing(point1, point2); + const coeff = 0.1; + angle = coeff * angle + (1 - coeff) * angle2; + return angle; + } +} + +const SUBSTATION_RADIUS = 500; +const SUBSTATION_RADIUS_MAX_PIXEL = 5; +const SUBSTATION_RADIUS_MIN_PIXEL = 1; + +var react = {exports: {}}; + +var react_production_min = {}; + +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var hasRequiredReact_production_min; + +function requireReact_production_min () { + if (hasRequiredReact_production_min) return react_production_min; + hasRequiredReact_production_min = 1; +var l=Symbol.for("react.element"),n=Symbol.for("react.portal"),p=Symbol.for("react.fragment"),q=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),t=Symbol.for("react.provider"),u=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),w=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),z=Symbol.iterator;function A(a){if(null===a||"object"!==typeof a)return null;a=z&&a[z]||a["@@iterator"];return "function"===typeof a?a:null} + var B={isMounted:function(){return !1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B;}E.prototype.isReactComponent={}; + E.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,a,b,"setState");};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate");};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B;}var H=G.prototype=new F; + H.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0}; + function M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=""+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } + } + } + function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } + } + } + + function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } // eslint-disable-next-line react-internal/safe-string-coercion + + + var argsWithFormat = args.map(function (item) { + return String(item); + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + + var didWarnStateUpdateForUnmountedComponent = {}; + + function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; + var warningKey = componentName + "." + callerName; + + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + + error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); + + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } + } + /** + * This is the abstract API for an update queue. + */ + + + var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function (publicInstance, callback, callerName) { + warnNoop(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function (publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, 'setState'); + } + }; + + var assign = Object.assign; + + var emptyObject = {}; + + { + Object.freeze(emptyObject); + } + /** + * Base class helpers for the updating state of a component. + */ + + + function Component(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the + // renderer. + + this.updater = updater || ReactNoopUpdateQueue; + } + + Component.prototype.isReactComponent = {}; + /** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + + Component.prototype.setState = function (partialState, callback) { + if (typeof partialState !== 'object' && typeof partialState !== 'function' && partialState != null) { + throw new Error('setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.'); + } + + this.updater.enqueueSetState(this, partialState, callback, 'setState'); + }; + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + + + Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); + }; + /** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + + + { + var deprecatedAPIs = { + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] + }; + + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); + + return undefined; + } + }); + }; + + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } + } + + function ComponentDummy() {} + + ComponentDummy.prototype = Component.prototype; + /** + * Convenience component with default shallow equality check for sCU. + */ + + function PureComponent(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + + var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); + pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. + + assign(pureComponentPrototype, Component.prototype); + pureComponentPrototype.isPureReactComponent = true; + + // an immutable object with a single mutable value + function createRef() { + var refObject = { + current: null + }; + + { + Object.seal(refObject); + } + + return refObject; + } + + var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare + + function isArray(a) { + return isArrayImpl(a); + } + + /* + * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol + * and Temporal.* types. See https://github.com/facebook/react/pull/22064. + * + * The functions in this module will throw an easier-to-understand, + * easier-to-debug exception with a clear errors message message explaining the + * problem. (Instead of a confusing exception thrown inside the implementation + * of the `value` object). + */ + // $FlowFixMe only called in DEV, so void return is not possible. + function typeName(value) { + { + // toStringTag is needed for namespaced types like Temporal.Instant + var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; + return type; + } + } // $FlowFixMe only called in DEV, so void return is not possible. + + + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + + function testStringCoercion(value) { + // If you ended up here by following an exception call stack, here's what's + // happened: you supplied an object or symbol value to React (as a prop, key, + // DOM attribute, CSS property, string ref, etc.) and when React tried to + // coerce it to a string using `'' + value`, an exception was thrown. + // + // The most common types that will cause this exception are `Symbol` instances + // and Temporal objects like `Temporal.Instant`. But any object that has a + // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this + // exception. (Library authors do this to prevent users from using built-in + // numeric operators like `+` or comparison operators like `>=` because custom + // methods are needed to perform accurate arithmetic or comparison.) + // + // To fix the problem, coerce this object or symbol value to a string before + // passing it to React. The most reliable way is usually `String(value)`. + // + // To find which value is throwing, check the browser or debugger console. + // Before this exception was thrown, there should be `console.error` output + // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the + // problem and how that type was used: key, atrribute, input value prop, etc. + // In most cases, this console output also shows the component and its + // ancestor components where the exception happened. + // + // eslint-disable-next-line react-internal/safe-string-coercion + return '' + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value)); + + return testStringCoercion(value); // throw (to help callers find troubleshooting comments) + } + } + } + + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + + if (displayName) { + return displayName; + } + + var functionName = innerType.displayName || innerType.name || ''; + return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName; + } // Keep in sync with react-reconciler/getComponentNameFromFiber + + + function getContextName(type) { + return type.displayName || 'Context'; + } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead. + + + function getComponentNameFromType(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case REACT_PROFILER_TYPE: + return 'Profiler'; + + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + + if (outerName !== null) { + return outerName; + } + + return getComponentNameFromType(type.type) || 'Memo'; + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + + // eslint-disable-next-line no-fallthrough + } + } + + return null; + } + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + + { + didWarnAboutStringRefs = {}; + } + + function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; + } + + function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; + } + + function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); + } + + function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); + } + + function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } + } + /** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + + var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; + }; + /** + * Create and return a new ReactElement of the given type. + * See https://reactjs.org/docs/react-api.html#createelement + */ + + function createElement(type, config, children) { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + + key = '' + config.key; + } + + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + + props.children = childArray; + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + { + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + } + function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; + } + /** + * Clone and return a new ReactElement using element as the starting point. + * See https://reactjs.org/docs/react-api.html#cloneelement + */ + + function cloneElement(element, config, children) { + if (element === null || element === undefined) { + throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); + } + + var propName; // Original props are copied + + var props = assign({}, element.props); // Reserved names are extracted + + var key = element.key; + var ref = element.ref; // Self is preserved since the owner is preserved. + + var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + + var source = element._source; // Owner will be preserved, unless ref is overridden + + var owner = element._owner; + + if (config != null) { + if (hasValidRef(config)) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + + key = '' + config.key; + } // Remaining properties override existing props + + + var defaultProps; + + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === undefined && defaultProps !== undefined) { + // Resolve default props + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); + } + /** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + + function isValidElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + + var SEPARATOR = '.'; + var SUBSEPARATOR = ':'; + /** + * Escape and wrap key so it is safe to use as a reactid + * + * @param {string} key to be escaped. + * @return {string} the escaped key. + */ + + function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + '=': '=0', + ':': '=2' + }; + var escapedString = key.replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return '$' + escapedString; + } + /** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + + var didWarnAboutMaps = false; + var userProvidedKeyEscapeRegex = /\/+/g; + + function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, '$&/'); + } + /** + * Generate a key string that identifies a element within a set. + * + * @param {*} element A element that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + + + function getElementKey(element, index) { + // Do some typechecking here since we call this blindly. We want to ensure + // that we don't block potential future ES APIs. + if (typeof element === 'object' && element !== null && element.key != null) { + // Explicit key + { + checkKeyStringCoercion(element.key); + } + + return escape('' + element.key); + } // Implicit key determined by the index in the set + + + return index.toString(36); + } + + function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + var invokeCallback = false; + + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case 'string': + case 'number': + invokeCallback = true; + break; + + case 'object': + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + + } + } + + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows: + + var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + + if (isArray(mappedChild)) { + var escapedChildKey = ''; + + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + '/'; + } + + mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + { + // The `if` statement here prevents auto-disabling of the safe + // coercion ESLint rule, so we must manually disable it below. + // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) { + checkKeyStringCoercion(mappedChild.key); + } + } + + mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + // eslint-disable-next-line react-internal/safe-string-coercion + escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); + } + + array.push(mappedChild); + } + + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var iterableChildren = children; + + { + // Warn about using Maps as children + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } + } + + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === 'object') { + // eslint-disable-next-line react-internal/safe-string-coercion + var childrenString = String(children); + throw new Error("Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.'); + } + } + + return subtreeCount; + } + + /** + * Maps children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenmap + * + * The provided mapFunction(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ + function mapChildren(children, func, context) { + if (children == null) { + return children; + } + + var result = []; + var count = 0; + mapIntoArray(children, result, '', '', function (child) { + return func.call(context, child, count++); + }); + return result; + } + /** + * Count the number of children that are typically specified as + * `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrencount + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + + + function countChildren(children) { + var n = 0; + mapChildren(children, function () { + n++; // Don't return anything + }); + return n; + } + + /** + * Iterates through children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenforeach + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ + function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function () { + forEachFunc.apply(this, arguments); // Don't return anything. + }, forEachContext); + } + /** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + * + * See https://reactjs.org/docs/react-api.html#reactchildrentoarray + */ + + + function toArray(children) { + return mapChildren(children, function (child) { + return child; + }) || []; + } + /** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenonly + * + * The current implementation of this function assumes that a single child gets + * passed without a wrapper, but the purpose of this helper function is to + * abstract away the particular structure of children. + * + * @param {?object} children Child collection structure. + * @return {ReactElement} The first and only `ReactElement` contained in the + * structure. + */ + + + function onlyChild(children) { + if (!isValidElement(children)) { + throw new Error('React.Children.only expected to receive a single React element child.'); + } + + return children; + } + + function createContext(defaultValue) { + // TODO: Second argument used to be an optional `calculateChangedBits` + // function. Warn to reserve for future use? + var context = { + $$typeof: REACT_CONTEXT_TYPE, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null, + // Add these to use same hidden class in VM as ServerContext + _defaultValue: null, + _globalName: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + + { + // A separate object, but proxies back to the original context object for + // backwards compatibility. It has a different $$typeof, so we can properly + // warn for the incorrect usage of Context as a Consumer. + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context + }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here + + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + + error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); + } + + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + + error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); + } + + return context.Consumer; + } + }, + displayName: { + get: function () { + return context.displayName; + }, + set: function (displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); + + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty + + context.Consumer = Consumer; + } + + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + + return context; + } + + var Uninitialized = -1; + var Pending = 0; + var Resolved = 1; + var Rejected = 2; + + function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); // Transition to the next state. + // This might throw either because it's missing or throws. If so, we treat it + // as still uninitialized and try again next time. Which is the same as what + // happens if the ctor or any wrappers processing the ctor throws. This might + // end up fixing it if the resolution was a concurrency bug. + + thenable.then(function (moduleObject) { + if (payload._status === Pending || payload._status === Uninitialized) { + // Transition to the next state. + var resolved = payload; + resolved._status = Resolved; + resolved._result = moduleObject; + } + }, function (error) { + if (payload._status === Pending || payload._status === Uninitialized) { + // Transition to the next state. + var rejected = payload; + rejected._status = Rejected; + rejected._result = error; + } + }); + + if (payload._status === Uninitialized) { + // In case, we're still uninitialized, then we're waiting for the thenable + // to resolve. Set it as pending in the meantime. + var pending = payload; + pending._status = Pending; + pending._result = thenable; + } + } + + if (payload._status === Resolved) { + var moduleObject = payload._result; + + { + if (moduleObject === undefined) { + error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))\n\n" + 'Did you accidentally put curly braces around the import?', moduleObject); + } + } + + { + if (!('default' in moduleObject)) { + error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); + } + } + + return moduleObject.default; + } else { + throw payload._result; + } + } + + function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: Uninitialized, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + + { + // In production, this would just set it on the object. + var defaultProps; + var propTypes; // $FlowFixMe + + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + defaultProps = newDefaultProps; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'defaultProps', { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + propTypes = newPropTypes; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'propTypes', { + enumerable: true + }); + } + } + }); + } + + return lazyType; + } + + function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); + } else if (typeof render !== 'function') { + error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); + } + } + + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); + } + } + } + + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: render + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; // The inner component shouldn't inherit this display name in most cases, + // because the component may be used elsewhere. + // But it's nice for anonymous functions to inherit the name, + // so that our component-stack generation logic will display their frames. + // An anonymous function generally suggests a pattern like: + // React.forwardRef((props, ref) => {...}); + // This kind of inner function is not used elsewhere so the side effect is okay. + + if (!render.name && !render.displayName) { + render.displayName = name; + } + } + }); + } + + return elementType; + } + + var REACT_MODULE_REFERENCE; + + { + REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); + } + + function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { + return true; + } + } + + return false; + } + + function memo(type, compare) { + { + if (!isValidElementType(type)) { + error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); + } + } + + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type: type, + compare: compare === undefined ? null : compare + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; // The inner component shouldn't inherit this display name in most cases, + // because the component may be used elsewhere. + // But it's nice for anonymous functions to inherit the name, + // so that our component-stack generation logic will display their frames. + // An anonymous function generally suggests a pattern like: + // React.memo((props) => {...}); + // This kind of inner function is not used elsewhere so the side effect is okay. + + if (!type.name && !type.displayName) { + type.displayName = name; + } + } + }); + } + + return elementType; + } + + function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + + { + if (dispatcher === null) { + error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.'); + } + } // Will result in a null access error if accessed outside render phase. We + // intentionally don't throw our own error because this is in a hot path. + // Also helps ensure this is inlined. + + + return dispatcher; + } + function useContext(Context) { + var dispatcher = resolveDispatcher(); + + { + // TODO: add a more generic warning for invalid values. + if (Context._context !== undefined) { + var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs + // and nobody should be using this in existing code. + + if (realContext.Consumer === Context) { + error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); + } else if (realContext.Provider === Context) { + error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); + } + } + } + + return dispatcher.useContext(Context); + } + function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); + } + function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); + } + function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); + } + function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); + } + function useInsertionEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useInsertionEffect(create, deps); + } + function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); + } + function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); + } + function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); + } + function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); + } + function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } + } + function useTransition() { + var dispatcher = resolveDispatcher(); + return dispatcher.useTransition(); + } + function useDeferredValue(value) { + var dispatcher = resolveDispatcher(); + return dispatcher.useDeferredValue(value); + } + function useId() { + var dispatcher = resolveDispatcher(); + return dispatcher.useId(); + } + function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { + var dispatcher = resolveDispatcher(); + return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); + } + + // Helpers to patch console.logs to avoid logging during side-effect free + // replaying on render function. This currently only patches the object + // lazily which won't cover if the log function was extracted eagerly. + // We could also eagerly patch the method. + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + + function disabledLog() {} + + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } + } + + var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + + { + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + + function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if ( !fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "" + // but we have a user-provided "displayName" + // splice it in to make the stack more readable. + + + if (fn.displayName && _frame.includes('')) { + _frame = _frame.replace('', fn.displayName); + } + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + + function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; + } + + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } + } + + function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + // eslint-disable-next-line react-internal/prod-error-codes + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } + } + + function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } + } + + var propTypesMisspellWarningShown; + + { + propTypesMisspellWarningShown = false; + } + + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentNameFromType(ReactCurrentOwner.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; + } + + function getSourceInfoErrorAddendum(source) { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; + } + + function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== undefined) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + + return ''; + } + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + + var ownerHasKeyUseWarning = {}; + + function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; + } + /** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + + function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; + } + + { + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } + } + /** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + + function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + /** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + + function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentNameFromType(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } + } + /** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + + function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } + } + function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentNameFromType(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + { + error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + } + + var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; + } + var didWarnAboutDeprecatedCreateFactory = false; + function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + + warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); + } // Legacy hook: remove it + + + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); + + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + + return validatedFactory; + } + function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + + validatePropTypes(newElement); + return newElement; + } + + function startTransition(scope, options) { + var prevTransition = ReactCurrentBatchConfig.transition; + ReactCurrentBatchConfig.transition = {}; + var currentTransition = ReactCurrentBatchConfig.transition; + + { + ReactCurrentBatchConfig.transition._updatedFibers = new Set(); + } + + try { + scope(); + } finally { + ReactCurrentBatchConfig.transition = prevTransition; + + { + if (prevTransition === null && currentTransition._updatedFibers) { + var updatedFibersCount = currentTransition._updatedFibers.size; + + if (updatedFibersCount > 10) { + warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.'); + } + + currentTransition._updatedFibers.clear(); + } + } + } + } + + var didWarnAboutMessageChannel = false; + var enqueueTaskImpl = null; + function enqueueTask(task) { + if (enqueueTaskImpl === null) { + try { + // read require off the module object to get around the bundlers. + // we don't want them to detect a require and bundle a Node polyfill. + var requireString = ('require' + Math.random()).slice(0, 7); + var nodeRequire = module && module[requireString]; // assuming we're in node, let's try to get node's + // version of setImmediate, bypassing fake timers if any. + + enqueueTaskImpl = nodeRequire.call(module, 'timers').setImmediate; + } catch (_err) { + // we're in a browser + // we can't use regular timers because they may still be faked + // so we try MessageChannel+postMessage instead + enqueueTaskImpl = function (callback) { + { + if (didWarnAboutMessageChannel === false) { + didWarnAboutMessageChannel = true; + + if (typeof MessageChannel === 'undefined') { + error('This browser does not have a MessageChannel implementation, ' + 'so enqueuing tasks via await act(async () => ...) will fail. ' + 'Please file an issue at https://github.com/facebook/react/issues ' + 'if you encounter this warning.'); + } + } + } + + var channel = new MessageChannel(); + channel.port1.onmessage = callback; + channel.port2.postMessage(undefined); + }; + } + } + + return enqueueTaskImpl(task); + } + + var actScopeDepth = 0; + var didWarnNoAwaitAct = false; + function act(callback) { + { + // `act` calls can be nested, so we track the depth. This represents the + // number of `act` scopes on the stack. + var prevActScopeDepth = actScopeDepth; + actScopeDepth++; + + if (ReactCurrentActQueue.current === null) { + // This is the outermost `act` scope. Initialize the queue. The reconciler + // will detect the queue and use it instead of Scheduler. + ReactCurrentActQueue.current = []; + } + + var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; + var result; + + try { + // Used to reproduce behavior of `batchedUpdates` in legacy mode. Only + // set to `true` while the given callback is executed, not for updates + // triggered during an async event, because this is how the legacy + // implementation of `act` behaved. + ReactCurrentActQueue.isBatchingLegacy = true; + result = callback(); // Replicate behavior of original `act` implementation in legacy mode, + // which flushed updates immediately after the scope function exits, even + // if it's an async function. + + if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) { + var queue = ReactCurrentActQueue.current; + + if (queue !== null) { + ReactCurrentActQueue.didScheduleLegacyUpdate = false; + flushActQueue(queue); + } + } + } catch (error) { + popActScope(prevActScopeDepth); + throw error; + } finally { + ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; + } + + if (result !== null && typeof result === 'object' && typeof result.then === 'function') { + var thenableResult = result; // The callback is an async function (i.e. returned a promise). Wait + // for it to resolve before exiting the current scope. + + var wasAwaited = false; + var thenable = { + then: function (resolve, reject) { + wasAwaited = true; + thenableResult.then(function (returnValue) { + popActScope(prevActScopeDepth); + + if (actScopeDepth === 0) { + // We've exited the outermost act scope. Recursively flush the + // queue until there's no remaining work. + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } else { + resolve(returnValue); + } + }, function (error) { + // The callback threw an error. + popActScope(prevActScopeDepth); + reject(error); + }); + } + }; + + { + if (!didWarnNoAwaitAct && typeof Promise !== 'undefined') { + // eslint-disable-next-line no-undef + Promise.resolve().then(function () {}).then(function () { + if (!wasAwaited) { + didWarnNoAwaitAct = true; + + error('You called act(async () => ...) without await. ' + 'This could lead to unexpected testing behaviour, ' + 'interleaving multiple act calls and mixing their ' + 'scopes. ' + 'You should - await act(async () => ...);'); + } + }); + } + } + + return thenable; + } else { + var returnValue = result; // The callback is not an async function. Exit the current scope + // immediately, without awaiting. + + popActScope(prevActScopeDepth); + + if (actScopeDepth === 0) { + // Exiting the outermost act scope. Flush the queue. + var _queue = ReactCurrentActQueue.current; + + if (_queue !== null) { + flushActQueue(_queue); + ReactCurrentActQueue.current = null; + } // Return a thenable. If the user awaits it, we'll flush again in + // case additional work was scheduled by a microtask. + + + var _thenable = { + then: function (resolve, reject) { + // Confirm we haven't re-entered another `act` scope, in case + // the user does something weird like await the thenable + // multiple times. + if (ReactCurrentActQueue.current === null) { + // Recursively flush the queue until there's no remaining work. + ReactCurrentActQueue.current = []; + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } else { + resolve(returnValue); + } + } + }; + return _thenable; + } else { + // Since we're inside a nested `act` scope, the returned thenable + // immediately resolves. The outer scope will flush the queue. + var _thenable2 = { + then: function (resolve, reject) { + resolve(returnValue); + } + }; + return _thenable2; + } + } + } + } + + function popActScope(prevActScopeDepth) { + { + if (prevActScopeDepth !== actScopeDepth - 1) { + error('You seem to have overlapping act() calls, this is not supported. ' + 'Be sure to await previous act() calls before making a new one. '); + } + + actScopeDepth = prevActScopeDepth; + } + } + + function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { + { + var queue = ReactCurrentActQueue.current; + + if (queue !== null) { + try { + flushActQueue(queue); + enqueueTask(function () { + if (queue.length === 0) { + // No additional work was scheduled. Finish. + ReactCurrentActQueue.current = null; + resolve(returnValue); + } else { + // Keep flushing work until there's none left. + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } + }); + } catch (error) { + reject(error); + } + } else { + resolve(returnValue); + } + } + } + + var isFlushing = false; + + function flushActQueue(queue) { + { + if (!isFlushing) { + // Prevent re-entrance. + isFlushing = true; + var i = 0; + + try { + for (; i < queue.length; i++) { + var callback = queue[i]; + + do { + callback = callback(true); + } while (callback !== null); + } + + queue.length = 0; + } catch (error) { + // If something throws, leave the remaining callbacks on the queue. + queue = queue.slice(i + 1); + throw error; + } finally { + isFlushing = false; + } + } + } + } + + var createElement$1 = createElementWithValidation ; + var cloneElement$1 = cloneElementWithValidation ; + var createFactory = createFactoryWithValidation ; + var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray: toArray, + only: onlyChild + }; + + exports.Children = Children; + exports.Component = Component; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.Profiler = REACT_PROFILER_TYPE; + exports.PureComponent = PureComponent; + exports.StrictMode = REACT_STRICT_MODE_TYPE; + exports.Suspense = REACT_SUSPENSE_TYPE; + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; + exports.act = act; + exports.cloneElement = cloneElement$1; + exports.createContext = createContext; + exports.createElement = createElement$1; + exports.createFactory = createFactory; + exports.createRef = createRef; + exports.forwardRef = forwardRef; + exports.isValidElement = isValidElement; + exports.lazy = lazy; + exports.memo = memo; + exports.startTransition = startTransition; + exports.unstable_act = act; + exports.useCallback = useCallback; + exports.useContext = useContext; + exports.useDebugValue = useDebugValue; + exports.useDeferredValue = useDeferredValue; + exports.useEffect = useEffect; + exports.useId = useId; + exports.useImperativeHandle = useImperativeHandle; + exports.useInsertionEffect = useInsertionEffect; + exports.useLayoutEffect = useLayoutEffect; + exports.useMemo = useMemo; + exports.useReducer = useReducer; + exports.useRef = useRef; + exports.useState = useState; + exports.useSyncExternalStore = useSyncExternalStore; + exports.useTransition = useTransition; + exports.version = ReactVersion; + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' + ) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); + } + + })(); + } + } (react_development, react_development.exports)); + return react_development.exports; +} + +if (process.env.NODE_ENV === 'production') { + react.exports = requireReact_production_min(); +} else { + react.exports = requireReact_development(); +} + +var reactExports = react.exports; + +const SvgBoltBlack24Dp = (props) => /* @__PURE__ */ reactExports.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", enableBackground: "new 0 0 24 24", height: "24px", viewBox: "0 0 24 24", width: "24px", fill: "#000000", ...props }, /* @__PURE__ */ reactExports.createElement("g", null, /* @__PURE__ */ reactExports.createElement("rect", { fill: "none", height: 24, width: 24 })), /* @__PURE__ */ reactExports.createElement("g", null, /* @__PURE__ */ reactExports.createElement("path", { d: "M11,21h-1l1-7H7.5c-0.88,0-0.33-0.75-0.31-0.78C8.48,10.94,10.42,7.54,13.01,3h1l-1,7h3.51c0.4,0,0.62,0.19,0.4,0.66 C12.97,17.55,11,21,11,21z" }))); + +const SvgLockBlack24Dp = (props) => /* @__PURE__ */ reactExports.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24px", viewBox: "0 0 24 24", width: "24px", fill: "#000000", ...props }, /* @__PURE__ */ reactExports.createElement("g", { fill: "none" }, /* @__PURE__ */ reactExports.createElement("path", { d: "M0 0h24v24H0V0z" }), /* @__PURE__ */ reactExports.createElement("path", { d: "M0 0h24v24H0V0z", opacity: 0.87 })), /* @__PURE__ */ reactExports.createElement("path", { d: "M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z" })); + +function getNominalVoltageColor(nominalVoltage) { + if (nominalVoltage >= 300) { + return [255, 0, 0]; + } else if (nominalVoltage >= 170 && nominalVoltage < 300) { + return [34, 139, 34]; + } else if (nominalVoltage >= 120 && nominalVoltage < 170) { + return [1, 175, 175]; + } else if (nominalVoltage >= 70 && nominalVoltage < 120) { + return [204, 85, 0]; + } else if (nominalVoltage >= 50 && nominalVoltage < 70) { + return [160, 32, 240]; + } else if (nominalVoltage >= 30 && nominalVoltage < 50) { + return [255, 130, 144]; + } else { + return [171, 175, 40]; + } +} +const INVALID_FLOW_OPACITY = 0.2; + +const defaultProps$4 = { + getLineParallelIndex: { type: "accessor", value: 0 }, + getLineAngle: { type: "accessor", value: 0 }, + distanceBetweenLines: { type: "number", value: 1e3 }, + maxParallelOffset: { type: "number", value: 100 }, + minParallelOffset: { type: "number", value: 3 }, + substationRadius: { type: "number", value: 500 }, + substationMaxPixel: { type: "number", value: 5 }, + minSubstationRadiusPixel: { type: "number", value: 1 } +}; +class ForkLineLayer extends LineLayer$1 { + static layerName = "ForkLineLayer"; + static defaultProps = defaultProps$4; + // declare state: LineLayer['state']; + getShaders() { + const shaders = super.getShaders(); + shaders.inject = { + "vs:#decl": ` +in float instanceLineParallelIndex; +in float instanceLineAngle; +in float instanceOffsetStart; +in float instanceProximityFactor; +uniform float distanceBetweenLines; +uniform float maxParallelOffset; +uniform float minParallelOffset; +uniform float substationRadius; +uniform float substationMaxPixel; +uniform float minSubstationRadiusPixel; + `, + "float segmentIndex = positions.x": `; + target = source ; + float offsetPixels = clamp(project_size_to_pixel( distanceBetweenLines), minParallelOffset, maxParallelOffset ); + float offsetCommonSpace = project_pixel_size(offsetPixels); + + float offsetSubstation = clamp(project_size_to_pixel(substationRadius*instanceOffsetStart ), + minSubstationRadiusPixel, + substationMaxPixel * instanceOffsetStart ); + float offsetSubstationCommonSpace = project_pixel_size(offsetSubstation) ; + + vec4 trans = vec4(cos(instanceLineAngle), -sin(instanceLineAngle ), 0, 0.) * instanceLineParallelIndex; + + trans.x -= sin(instanceLineAngle) * instanceProximityFactor; + trans.y -= cos(instanceLineAngle) * instanceProximityFactor; + + source+=project_common_position_to_clipspace(trans * (offsetSubstationCommonSpace / sqrt(trans.x*trans.x+trans.y*trans.y))) - project_uCenter; + target+=project_common_position_to_clipspace(trans * offsetCommonSpace) - project_uCenter; + + ` + }; + return shaders; + } + initializeState() { + super.initializeState(); + this.getAttributeManager()?.addInstanced({ + instanceLineParallelIndex: { + size: 1, + type: "float32", + accessor: "getLineParallelIndex" + }, + instanceLineAngle: { + size: 1, + type: "float32", + accessor: "getLineAngle" + }, + instanceOffsetStart: { + size: 1, + type: "float32", + accessor: "getSubstationOffset" + }, + instanceProximityFactor: { + size: 1, + type: "float32", + accessor: "getProximityFactor" + } + }); + } + draw({ + uniforms + }) { + super.draw({ + uniforms: { + ...uniforms, + distanceBetweenLines: this.props.getDistanceBetweenLines, + maxParallelOffset: this.props.getMaxParallelOffset, + minParallelOffset: this.props.getMinParallelOffset, + substationRadius: this.props.getSubstationRadius, + substationMaxPixel: this.props.getSubstationMaxPixel, + minSubstationRadiusPixel: this.props.getMinSubstationRadiusPixel + } + }); + } +} + +const defaultProps$3 = { + getLineParallelIndex: { type: "accessor", value: 0 }, + getLineAngle: { type: "accessor", value: 0 }, + distanceBetweenLines: { type: "number", value: 1e3 }, + maxParallelOffset: { type: "number", value: 100 }, + minParallelOffset: { type: "number", value: 3 } +}; +class ParallelPathLayer extends PathLayer { + static layerName = "ParallelPathLayer"; + static defaultProps = defaultProps$3; + getShaders() { + const shaders = super.getShaders(); + shaders.inject = Object.assign({}, shaders.inject, { + "vs:#decl": shaders.inject["vs:#decl"] + `//Note: with the following attribute, we have reached the limit (16 on most platforms) of the number of attributes. +// with webgl2, this might be raised in the future to 32 on most platforms... +// The PathLayer that this class extends already uses 13 attributes (and 15 with the dash extension). +// we have packed all our attributes together in a single attribute to +// workaround the low limit of the number of vertex attrbutes... +// To pack the attributes, for now we use a very simple system. If needed, we can change it to a more efficient packing. +// We just add an extra float to the line angles vec3. The +// extra float contains the previous attributes: +// parallelIndex (an half integer, between -15.5 and +15.5 (32 lines max..)) +// proximityFactors (two floats, between 0 and 1) +// +// To simplify further, we use only positive integers for +// this extra float, ie values only from 0 to 2^24. For parallelIndex, we encode the half integers from -15.5 to 15.5 +// to 0..62, which fits in 6 bits. +// For proximityFactors, We switch from floating to a fixed precision of 9 bits +// without the 0 (ie multiples of 512: 1/512, 2/512, ..., 1). +// So in the 24 bits of the integer value of the float, we have 6 bits of parallel index, +// 9 bits of proximity factor start, 9 bits of proximity factor end, for a total of 24 bits. +//Note2: packing the attributes together, in addition to not beeing very readable, +// also has the downside that you can't update one attribute and reconstruct +// only its buffer, so it hurts performance a bit in this case. +// But this is a rare case for us (changing parameters) so it doesn't matter much. +in vec4 instanceExtraAttributes; +uniform float distanceBetweenLines; +uniform float maxParallelOffset; +uniform float minParallelOffset; +`, + "vs:#main-end": shaders.inject["vs:#main-end"] + ` +bool isSegmentEnd = isEnd > EPSILON; +bool isFirstSegment = (instanceTypes == 1.0 || instanceTypes == 3.0); +bool isLastSegment = (instanceTypes == 2.0 || instanceTypes == 3.0); + +float instanceLineAngle = instanceExtraAttributes[1]; +if ( !isSegmentEnd && isFirstSegment ){ + instanceLineAngle = instanceExtraAttributes[0]; +} +else if ( isSegmentEnd && isLastSegment){ + instanceLineAngle = instanceExtraAttributes[2]; +} +float instanceLineParallelIndex = (mod(instanceExtraAttributes[3], 64.0) - 31.0) / 2.0; + +float offsetPixels = clamp(project_size_to_pixel(distanceBetweenLines), minParallelOffset, maxParallelOffset); +float offsetCommonSpace = project_pixel_size(offsetPixels); +vec4 trans = vec4(cos(instanceLineAngle), -sin(instanceLineAngle), 0, 0.) * instanceLineParallelIndex; + +if(isSegmentEnd && isLastSegment) { + float pf = (mod(instanceExtraAttributes[3] / 64.0, 512.0) + 1.0) / 512.0; + trans.x += sin(instanceLineAngle) * pf ; + trans.y += cos(instanceLineAngle) * pf; +} +else if (!isSegmentEnd && isFirstSegment) +{ + float pf = (mod(instanceExtraAttributes[3] / 32768.0, 512.0) + 1.0) / 512.0; + trans.x -= sin(instanceLineAngle) * pf; + trans.y -= cos(instanceLineAngle) * pf; +} + +trans = trans * offsetCommonSpace; +gl_Position += project_common_position_to_clipspace(trans) - project_uCenter; +` + }); + return shaders; + } + initializeState() { + super.initializeState(); + this.getAttributeManager()?.addInstanced({ + // too much instances variables need to compact some... + instanceExtraAttributes: { + size: 4, + type: "float32", + accessor: "getExtraAttributes" + } + }); + } + draw({ + uniforms + }) { + super.draw({ + uniforms: { + ...uniforms, + distanceBetweenLines: this.props.distanceBetweenLines, + maxParallelOffset: this.props.maxParallelOffset, + minParallelOffset: this.props.minParallelOffset + } + }); + } +} + +const DISTANCE_BETWEEN_ARROWS = 1e4; +const START_ARROW_POSITION = 0.1; +const END_ARROW_POSITION = 0.9; +var LineFlowMode = /* @__PURE__ */ ((LineFlowMode2) => { + LineFlowMode2["STATIC_ARROWS"] = "staticArrows"; + LineFlowMode2["ANIMATED_ARROWS"] = "animatedArrows"; + LineFlowMode2["FEEDERS"] = "feeders"; + return LineFlowMode2; +})(LineFlowMode || {}); +var LineFlowColorMode = /* @__PURE__ */ ((LineFlowColorMode2) => { + LineFlowColorMode2["NOMINAL_VOLTAGE"] = "nominalVoltage"; + LineFlowColorMode2["OVERLOADS"] = "overloads"; + return LineFlowColorMode2; +})(LineFlowColorMode || {}); +const noDashArray = [0, 0]; +const dashArray = [15, 10]; +function doDash(lineConnection) { + return !lineConnection.terminal1Connected || !lineConnection.terminal2Connected; +} +function getArrowDirection(p) { + if (p < 0) { + return ArrowDirection.FROM_SIDE_2_TO_SIDE_1; + } else if (p > 0) { + return ArrowDirection.FROM_SIDE_1_TO_SIDE_2; + } else { + return ArrowDirection.NONE; + } +} +function getLineLoadingZoneOfSide(limit, intensity, lineFlowAlertThreshold) { + if (limit === void 0 || intensity === void 0 || intensity === 0) { + return 0 /* UNKNOWN */; + } else { + const threshold = lineFlowAlertThreshold * limit / 100; + if (intensity > 0 && intensity < threshold) { + return 1 /* SAFE */; + } else if (intensity >= threshold && intensity < limit) { + return 2 /* WARNING */; + } else { + return 3 /* OVERLOAD */; + } + } +} +function getLineLoadingZone(line, lineFlowAlertThreshold) { + const zone1 = getLineLoadingZoneOfSide( + line.currentLimits1?.permanentLimit, + line.i1, + lineFlowAlertThreshold + ); + const zone2 = getLineLoadingZoneOfSide( + line.currentLimits2?.permanentLimit, + line.i2, + lineFlowAlertThreshold + ); + return Math.max(zone1, zone2); +} +function getLineLoadingZoneColor(zone) { + if (zone === 0 /* UNKNOWN */) { + return [128, 128, 128]; + } else if (zone === 1 /* SAFE */) { + return [107, 178, 40]; + } else if (zone === 2 /* WARNING */) { + return [210, 179, 63]; + } else if (zone === 3 /* OVERLOAD */) { + return [255, 0, 0]; + } else { + throw new Error("Unsupported line loading zone: " + zone); + } +} +function getLineColor(line, nominalVoltageColor, props, lineConnection) { + if (props.lineFlowColorMode === "nominalVoltage" /* NOMINAL_VOLTAGE */) { + if (!lineConnection || !lineConnection.terminal1Connected && !lineConnection.terminal2Connected) { + return props.disconnectedLineColor; + } else { + return nominalVoltageColor; + } + } else if (props.lineFlowColorMode === "overloads" /* OVERLOADS */) { + const zone = getLineLoadingZone(line, props.lineFlowAlertThreshold); + return getLineLoadingZoneColor(zone); + } else { + return nominalVoltageColor; + } +} +function getLineIcon(lineStatus) { + return { + url: lineStatus === "PLANNED_OUTAGE" ? SvgLockBlack24Dp : lineStatus === "FORCED_OUTAGE" ? SvgBoltBlack24Dp : void 0, + height: 24, + width: 24, + mask: true + }; +} +const ArrowSpeed = { + STOPPED: 0, + SLOW: 1, + MEDIUM: 2, + FAST: 3, + CRAZY: 4 +}; +function getArrowSpeedOfSide(limit, intensity) { + if (limit === void 0 || intensity === void 0 || intensity === 0) { + return ArrowSpeed.STOPPED; + } else { + if (intensity > 0 && intensity < limit / 3) { + return ArrowSpeed.SLOW; + } else if (intensity >= limit / 3 && intensity < limit * 2 / 3) { + return ArrowSpeed.MEDIUM; + } else if (intensity >= limit * 2 / 3 && intensity < limit) { + return ArrowSpeed.FAST; + } else { + return ArrowSpeed.CRAZY; + } + } +} +function getArrowSpeed(line) { + const speed1 = getArrowSpeedOfSide( + line.currentLimits1?.permanentLimit, + line.i1 + ); + const speed2 = getArrowSpeedOfSide( + line.currentLimits2?.permanentLimit, + line.i2 + ); + return Math.max(speed1, speed2); +} +function getArrowSpeedFactor(speed) { + switch (speed) { + case ArrowSpeed.STOPPED: + return 0; + case ArrowSpeed.SLOW: + return 0.5; + case ArrowSpeed.MEDIUM: + return 2; + case ArrowSpeed.FAST: + return 4; + case ArrowSpeed.CRAZY: + return 10; + default: + throw new Error("Unknown arrow speed: " + speed); + } +} +const defaultProps$2 = { + network: null, + geoData: null, + getNominalVoltageColor: { type: "accessor", value: [255, 255, 255] }, + disconnectedLineColor: { type: "color", value: [255, 255, 255] }, + filteredNominalVoltages: null, + lineFlowMode: "feeders" /* FEEDERS */, + lineFlowColorMode: "nominalVoltage" /* NOMINAL_VOLTAGE */, + lineFlowAlertThreshold: 100, + showLineFlow: true, + lineFullPath: true, + lineParallelPath: true, + labelSize: 12, + iconSize: 48, + distanceBetweenLines: 1e3, + maxParallelOffset: 100, + minParallelOffset: 3, + substationRadius: { type: "number", value: SUBSTATION_RADIUS }, + substationMaxPixel: { type: "number", value: SUBSTATION_RADIUS_MAX_PIXEL }, + minSubstationRadiusPixel: { + type: "number", + value: SUBSTATION_RADIUS_MIN_PIXEL + } +}; +class LineLayer extends CompositeLayer { + static layerName = "LineLayer"; + static defaultProps = defaultProps$2; + initializeState(context) { + super.initializeState(context); + this.state = { + compositeData: [], + linesConnection: /* @__PURE__ */ new Map(), + linesStatus: /* @__PURE__ */ new Map() + }; + } + getVoltageLevelIndex(voltageLevelId) { + const { network } = this.props; + const vl = network.getVoltageLevel(voltageLevelId); + if (vl === void 0) { + return void 0; + } + const substation = network.getSubstation(vl.substationId); + if (substation === void 0) { + return void 0; + } + return [ + ...new Set( + substation.voltageLevels.map((vl2) => vl2.nominalV) + // only one voltage level + ) + ].sort((a, b) => { + return a - b; + }).indexOf(vl.nominalV) + 1; + } + //TODO this is a huge function, refactor + updateState({ props, oldProps, changeFlags }) { + let compositeData; + let linesConnection; + let linesStatus; + if (changeFlags.dataChanged) { + compositeData = []; + linesConnection = /* @__PURE__ */ new Map(); + linesStatus = /* @__PURE__ */ new Map(); + if (props.network != null && props.network.substations && props.data.length !== 0 && props.geoData != null) { + const lineNominalVoltageIndexer = (map, line) => { + const network = props.network; + const vl1 = network.getVoltageLevel(line.voltageLevelId1); + const vl2 = network.getVoltageLevel(line.voltageLevelId2); + const vl = vl1 || vl2; + let list = map.get(vl.nominalV); + if (!list) { + list = []; + map.set(vl.nominalV, list); + } + if (vl1.substationId !== vl2.substationId) { + list.push(line); + } + return map; + }; + const linesByNominalVoltage = props.data.reduce( + lineNominalVoltageIndexer, + /* @__PURE__ */ new Map() + ); + compositeData = Array.from(linesByNominalVoltage.entries()).map(([nominalV, lines]) => { + return { nominalV, lines }; + }).sort((a, b) => b.nominalV - a.nominalV); + compositeData.forEach((c) => { + const mapOriginDestination = /* @__PURE__ */ new Map(); + c.mapOriginDestination = mapOriginDestination; + c.lines.forEach((line) => { + linesConnection.set(line.id, { + terminal1Connected: line.terminal1Connected, + terminal2Connected: line.terminal2Connected + }); + linesStatus.set(line.id, { + operatingStatus: line.operatingStatus + }); + const key = this.genLineKey(line); + const val = mapOriginDestination.get(key); + if (val == null) { + mapOriginDestination.set(key, /* @__PURE__ */ new Set([line])); + } else { + mapOriginDestination.set(key, val.add(line)); + } + }); + }); + } + } else { + compositeData = this.state.compositeData; + linesConnection = this.state.linesConnection; + linesStatus = this.state.linesStatus; + if (props.updatedLines !== oldProps.updatedLines) { + props.updatedLines.forEach((line1) => { + linesConnection.set(line1.id, { + terminal1Connected: line1.terminal1Connected, + terminal2Connected: line1.terminal2Connected + }); + linesStatus.set(line1.id, { + operatingStatus: line1.operatingStatus + }); + }); + } + } + if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { + this.recomputeParallelLinesIndex( + compositeData, + props + ); + } + if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || oldProps.geoData !== props.geoData)) { + compositeData.forEach((c) => { + const lineMap = /* @__PURE__ */ new Map(); + c.lines.forEach((line) => { + const positions = props.geoData.getLinePositions( + props.network, + line, + props.lineFullPath + ); + const cumulativeDistances = props.geoData.getLineDistances(positions); + lineMap.set(line.id, { + positions, + cumulativeDistances, + line + }); + }); + c.lineMap = lineMap; + }); + } + if (changeFlags.dataChanged || changeFlags.propsChanged && (props.lineFullPath !== oldProps.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { + this.recomputeForkLines(compositeData, props); + } + if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { + compositeData.forEach((cData) => { + cData.activePower = []; + cData.lines.forEach((line) => { + const lineData = cData.lineMap.get(line.id); + const arrowDirection = getArrowDirection(line.p1); + const coordinates1 = props.geoData.labelDisplayPosition( + lineData.positions, + lineData.cumulativeDistances, + START_ARROW_POSITION, + arrowDirection, + line.parallelIndex, + line.angle * 180 / Math.PI, + line.angleStart * 180 / Math.PI, + props.distanceBetweenLines, + line.proximityFactorStart + ); + const coordinates2 = props.geoData.labelDisplayPosition( + lineData.positions, + lineData.cumulativeDistances, + END_ARROW_POSITION, + arrowDirection, + line.parallelIndex, + line.angle * 180 / Math.PI, + line.angleEnd * 180 / Math.PI, + props.distanceBetweenLines, + line.proximityFactorEnd + ); + if (coordinates1 !== null && coordinates2 !== null) { + cData.activePower.push({ + line, + p: line.p1, + printPosition: [ + coordinates1.position.longitude, + coordinates1.position.latitude + ], + offset: coordinates1.offset + }); + cData.activePower.push({ + line, + p: line.p2, + printPosition: [ + coordinates2.position.longitude, + coordinates2.position.latitude + ], + offset: coordinates2.offset + }); + } + }); + }); + } + if (changeFlags.dataChanged || changeFlags.propsChanged && (props.updatedLines !== oldProps.updatedLines || oldProps.lineFullPath !== props.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { + compositeData.forEach((cData) => { + cData.operatingStatus = []; + cData.lines.forEach((line) => { + const lineStatus = linesStatus.get(line.id); + if (lineStatus !== void 0 && lineStatus.operatingStatus !== void 0 && lineStatus.operatingStatus !== "IN_OPERATION") { + const lineData = cData.lineMap.get(line.id); + const coordinatesIcon = props.geoData.labelDisplayPosition( + lineData.positions, + lineData.cumulativeDistances, + 0.5, + ArrowDirection.NONE, + line.parallelIndex, + line.angle * 180 / Math.PI, + line.angleEnd * 180 / Math.PI, + props.distanceBetweenLines, + line.proximityFactorEnd + ); + if (coordinatesIcon !== null) { + cData.operatingStatus.push({ + status: lineStatus.operatingStatus, + printPosition: [ + coordinatesIcon.position.longitude, + coordinatesIcon.position.latitude + ], + offset: coordinatesIcon.offset + }); + } + } + }); + }); + } + if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || props.geoData !== oldProps.geoData || //For lineFlowMode, recompute only if mode goes to or from LineFlowMode.FEEDERS + //because for LineFlowMode.STATIC_ARROWS and LineFlowMode.ANIMATED_ARROWS it's the same + props.lineFlowMode !== oldProps.lineFlowMode && (props.lineFlowMode === "feeders" /* FEEDERS */ || oldProps.lineFlowMode === "feeders" /* FEEDERS */))) { + compositeData.forEach((cData) => { + const lineMap = cData.lineMap; + cData.arrows = cData.lines.flatMap((line) => { + const lineData = lineMap.get(line.id); + line.cumulativeDistances = lineData.cumulativeDistances; + line.positions = lineData.positions; + if (props.lineFlowMode === "feeders" /* FEEDERS */) { + return [ + { + distance: START_ARROW_POSITION, + line + }, + { + distance: END_ARROW_POSITION, + line + } + ]; + } + const directLinePositions = props.geoData.getLinePositions( + props.network, + line, + false + ); + const directLineDistance = es.getDistance( + { + latitude: directLinePositions[0][1], + longitude: directLinePositions[0][0] + }, + { + latitude: directLinePositions[1][1], + longitude: directLinePositions[1][0] + } + ); + const arrowCount = Math.ceil( + directLineDistance / DISTANCE_BETWEEN_ARROWS + ); + return [...new Array(arrowCount).keys()].map((index) => { + return { + distance: index / arrowCount, + line + }; + }); + }); + }); + } + this.setState({ compositeData, linesConnection, linesStatus }); + } + genLineKey(line) { + return line.voltageLevelId1 > line.voltageLevelId2 ? line.voltageLevelId1 + "##" + line.voltageLevelId2 : line.voltageLevelId2 + "##" + line.voltageLevelId1; + } + recomputeParallelLinesIndex(compositeData, props) { + compositeData.forEach((cData) => { + const mapOriginDestination = cData.mapOriginDestination; + mapOriginDestination.forEach((samePathLine, key) => { + let truncatedSize = samePathLine.size; + if (truncatedSize > 32) { + console.warn( + "Warning, more than 32 parallel lines between vls " + key + ". The map will only show 32 parallel lines." + ); + truncatedSize = 32; + } + let index = -(truncatedSize - 1) / 2; + samePathLine.forEach((line) => { + line.parallelIndex = props.lineParallelPath ? index : 0; + if (index < 15) { + index += 1; + } + }); + }); + }); + } + recomputeForkLines(compositeData, props) { + const mapMinProximityFactor = /* @__PURE__ */ new Map(); + compositeData.forEach((cData) => { + cData.lines.forEach((line) => { + const positions = cData?.lineMap?.get(line.id)?.positions; + if (!positions) { + return; + } + line.origin = positions[0]; + line.end = positions[positions.length - 1]; + line.substationIndexStart = this.getVoltageLevelIndex( + line.voltageLevelId1 + ); + line.substationIndexEnd = this.getVoltageLevelIndex( + line.voltageLevelId2 + ); + line.angle = this.computeAngle( + props, + positions[0], + positions[positions.length - 1] + ); + line.angleStart = this.computeAngle( + props, + positions[0], + positions[1] + ); + line.angleEnd = this.computeAngle( + props, + positions[positions.length - 2], + positions[positions.length - 1] + ); + line.proximityFactorStart = this.getProximityFactor( + positions[0], + positions[1] + ); + line.proximityFactorEnd = this.getProximityFactor( + positions[positions.length - 2], + positions[positions.length - 1] + ); + const key = this.genLineKey(line); + const val = mapMinProximityFactor.get(key); + if (val == null) { + mapMinProximityFactor.set(key, { + lines: [line], + start: line.proximityFactorStart, + end: line.proximityFactorEnd + }); + } else { + val.lines.push(line); + val.start = Math.min(val.start, line.proximityFactorStart); + val.end = Math.min(val.end, line.proximityFactorEnd); + mapMinProximityFactor.set(key, val); + } + }); + }); + mapMinProximityFactor.forEach( + (samePathLine) => samePathLine.lines.forEach((line) => { + line.proximityFactorStart = samePathLine.start; + line.proximityFactorEnd = samePathLine.end; + }) + ); + } + getProximityFactor(firstPosition, secondPosition) { + let factor = es.getDistance(firstPosition, secondPosition) / (3 * this.props.distanceBetweenLines); + if (factor > 1) { + factor = 1; + } + return factor; + } + computeAngle(props, position1, position2) { + let angle = props.geoData.getMapAngle(position1, position2); + angle = angle * Math.PI / 180 + Math.PI; + if (angle < 0) { + angle += 2 * Math.PI; + } + return angle; + } + renderLayers() { + const layers = []; + const linePathUpdateTriggers = [ + this.props.lineFullPath, + this.props.geoData.linePositionsById, + this.props.network.lines + ]; + this.state.compositeData.forEach((cData) => { + const nominalVoltageColor = this.props.getNominalVoltageColor( + cData.nominalV + ); + const lineLayer = new ParallelPathLayer( + this.getSubLayerProps({ + id: "LineNominalVoltage" + cData.nominalV, + data: cData.lines, + widthScale: 20, + widthMinPixels: 1, + widthMaxPixels: 2, + getPath: (line) => this.props.geoData.getLinePositions( + this.props.network, + line, + this.props.lineFullPath + ), + getColor: (line) => getLineColor( + line, + nominalVoltageColor, + this.props, + this.state.linesConnection.get(line.id) + ), + getWidth: 2, + getLineParallelIndex: (line) => line.parallelIndex, + getExtraAttributes: (line) => [ + line.angleStart, + line.angle, + line.angleEnd, + line.parallelIndex * 2 + 31 + 64 * (Math.ceil(line.proximityFactorStart * 512) - 1) + 64 * 512 * (Math.ceil(line.proximityFactorEnd * 512) - 1) + ], + distanceBetweenLines: this.props.distanceBetweenLines, + maxParallelOffset: this.props.maxParallelOffset, + minParallelOffset: this.props.minParallelOffset, + visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( + cData.nominalV + ), + updateTriggers: { + getPath: linePathUpdateTriggers, + getExtraAttributes: [ + this.props.lineParallelPath, + linePathUpdateTriggers + ], + getColor: [ + this.props.disconnectedLineColor, + this.props.lineFlowColorMode, + this.props.lineFlowAlertThreshold, + this.props.updatedLines + ], + getDashArray: [this.props.updatedLines] + }, + getDashArray: (line) => doDash(this.state.linesConnection.get(line.id)) ? dashArray : noDashArray, + extensions: [new PathStyleExtension({ dash: true })] + }) + ); + layers.push(lineLayer); + const arrowLayer = new ArrowLayer( + this.getSubLayerProps({ + id: "ArrowNominalVoltage" + cData.nominalV, + data: cData.arrows, + sizeMinPixels: 3, + sizeMaxPixels: 7, + getDistance: (arrow) => arrow.distance, + getLine: (arrow) => arrow.line, + getLinePositions: (line) => this.props.geoData.getLinePositions( + this.props.network, + line, + this.props.lineFullPath + ), + getColor: (arrow) => getLineColor( + arrow.line, + nominalVoltageColor, + this.props, + this.state.linesConnection.get(arrow.line.id) + ), + getSize: 700, + getSpeedFactor: (arrow) => getArrowSpeedFactor(getArrowSpeed(arrow.line)), + getLineParallelIndex: (arrow) => arrow.line.parallelIndex, + getLineAngles: (arrow) => [ + arrow.line.angleStart, + arrow.line.angle, + arrow.line.angleEnd + ], + getProximityFactors: (arrow) => [ + arrow.line.proximityFactorStart, + arrow.line.proximityFactorEnd + ], + getDistanceBetweenLines: () => this.props.distanceBetweenLines, + maxParallelOffset: this.props.maxParallelOffset, + minParallelOffset: this.props.minParallelOffset, + getDirection: (arrow) => { + return getArrowDirection(arrow.line.p1); + }, + animated: this.props.showLineFlow && this.props.lineFlowMode === "animatedArrows" /* ANIMATED_ARROWS */, + visible: this.props.showLineFlow && (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( + cData.nominalV + )), + opacity: this.props.areFlowsValid ? 1 : INVALID_FLOW_OPACITY, + updateTriggers: { + getLinePositions: linePathUpdateTriggers, + getLineParallelIndex: [this.props.lineParallelPath], + getLineAngles: linePathUpdateTriggers, + getColor: [ + this.props.disconnectedLineColor, + this.props.lineFlowColorMode, + this.props.lineFlowAlertThreshold, + this.props.updatedLines + ], + opacity: [this.props.areFlowsValid] + } + }) + ); + layers.push(arrowLayer); + const startFork = new ForkLineLayer( + this.getSubLayerProps({ + id: "LineForkStart" + cData.nominalV, + getSourcePosition: (line) => line.origin, + getTargetPosition: (line) => line.end, + getSubstationOffset: (line) => line.substationIndexStart, + data: cData.lines, + widthScale: 20, + widthMinPixels: 1, + widthMaxPixels: 2, + getColor: (line) => getLineColor( + line, + nominalVoltageColor, + this.props, + this.state.linesConnection.get(line.id) + ), + getWidth: 2, + getProximityFactor: (line) => line.proximityFactorStart, + getLineParallelIndex: (line) => line.parallelIndex, + getLineAngle: (line) => line.angleStart, + getDistanceBetweenLines: this.props.distanceBetweenLines, + getMaxParallelOffset: this.props.maxParallelOffset, + getMinParallelOffset: this.props.minParallelOffset, + getSubstationRadius: this.props.substationRadius, + getSubstationMaxPixel: this.props.substationMaxPixel, + getMinSubstationRadiusPixel: this.props.minSubstationRadiusPixel, + visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( + cData.nominalV + ), + updateTriggers: { + getLineParallelIndex: linePathUpdateTriggers, + getSourcePosition: linePathUpdateTriggers, + getTargetPosition: linePathUpdateTriggers, + getLineAngle: linePathUpdateTriggers, + getProximityFactor: linePathUpdateTriggers, + getColor: [ + this.props.disconnectedLineColor, + this.props.lineFlowColorMode, + this.props.lineFlowAlertThreshold, + this.props.updatedLines + ] + } + }) + ); + layers.push(startFork); + const endFork = new ForkLineLayer( + this.getSubLayerProps({ + id: "LineForkEnd" + cData.nominalV, + getSourcePosition: (line) => line.end, + getTargetPosition: (line) => line.origin, + getSubstationOffset: (line) => line.substationIndexEnd, + data: cData.lines, + widthScale: 20, + widthMinPixels: 1, + widthMaxPixels: 2, + getColor: (line) => getLineColor( + line, + nominalVoltageColor, + this.props, + this.state.linesConnection.get(line.id) + ), + getWidth: 2, + getProximityFactor: (line) => line.proximityFactorEnd, + getLineParallelIndex: (line) => -line.parallelIndex, + getLineAngle: (line) => line.angleEnd + Math.PI, + getDistanceBetweenLines: this.props.distanceBetweenLines, + getMaxParallelOffset: this.props.maxParallelOffset, + getMinParallelOffset: this.props.minParallelOffset, + getSubstationRadius: this.props.substationRadius, + getSubstationMaxPixel: this.props.substationMaxPixel, + getMinSubstationRadiusPixel: this.props.minSubstationRadiusPixel, + visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( + cData.nominalV + ), + updateTriggers: { + getLineParallelIndex: [this.props.lineParallelPath], + getSourcePosition: linePathUpdateTriggers, + getTargetPosition: linePathUpdateTriggers, + getLineAngle: linePathUpdateTriggers, + getProximityFactor: linePathUpdateTriggers, + getColor: [ + this.props.disconnectedLineColor, + this.props.lineFlowColorMode, + this.props.lineFlowAlertThreshold, + this.props.updatedLines + ] + } + }) + ); + layers.push(endFork); + const lineActivePowerLabelsLayer = new TextLayer( + this.getSubLayerProps({ + id: "ActivePower" + cData.nominalV, + data: cData.activePower, + getText: (activePower) => activePower.p !== void 0 ? Math.round(activePower.p).toString() : "", + // The position passed to this layer causes a bug when zooming and maxParallelOffset is reached: + // the label is not correctly positioned on the lines, they are slightly off. + // In the custom layers, we clamp the distanceBetweenLines. This is not done in the deck.gl TextLayer + // and IconLayer or in the position calculated here. + getPosition: (activePower) => activePower.printPosition, + getColor: this.props.labelColor, + fontFamily: "Roboto", + getSize: this.props.labelSize, + getAngle: 0, + getPixelOffset: (activePower) => activePower.offset.map((x) => x), + getTextAnchor: "middle", + visible: (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( + cData.nominalV + )) && this.props.labelsVisible, + opacity: this.props.areFlowsValid ? 1 : INVALID_FLOW_OPACITY, + updateTriggers: { + getPosition: [ + this.props.lineParallelPath, + linePathUpdateTriggers + ], + getPixelOffset: linePathUpdateTriggers, + opacity: [this.props.areFlowsValid] + } + }) + ); + layers.push(lineActivePowerLabelsLayer); + const lineStatusIconLayer = new IconLayer( + this.getSubLayerProps({ + id: "OperatingStatus" + cData.nominalV, + data: cData.operatingStatus, + // The position passed to this layer causes a bug when zooming and maxParallelOffset is reached: + // the icon is not correctly positioned on the lines, they are slightly off. + // In the custom layers, we clamp the distanceBetweenLines. This is not done in the deck.gl TextLayer + // and IconLayer or in the position calculated here. + getPosition: (operatingStatus) => operatingStatus.printPosition, + getIcon: (operatingStatus) => getLineIcon(operatingStatus.status), + getSize: this.props.iconSize, + getColor: () => this.props.labelColor, + getPixelOffset: (operatingStatus) => operatingStatus.offset, + visible: (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( + cData.nominalV + )) && this.props.labelsVisible, + updateTriggers: { + getPosition: [ + this.props.lineParallelPath, + linePathUpdateTriggers + ], + getPixelOffset: linePathUpdateTriggers, + getIcon: [this.state.linesStatus], + getColor: [this.props.labelColor] + } + }) + ); + layers.push(lineStatusIconLayer); + }); + return layers; + } +} + +const EQUIPMENT_INFOS_TYPES = { + LIST: { type: "LIST" }, + MAP: { type: "MAP" }, + FORM: { type: "FORM" }, + TAB: { type: "TAB" }, + TOOLTIP: { type: "TOOLTIP" } +}; +var EQUIPMENT_TYPES = /* @__PURE__ */ ((EQUIPMENT_TYPES2) => { + EQUIPMENT_TYPES2["SUBSTATION"] = "SUBSTATION"; + EQUIPMENT_TYPES2["VOLTAGE_LEVEL"] = "VOLTAGE_LEVEL"; + EQUIPMENT_TYPES2["LINE"] = "LINE"; + EQUIPMENT_TYPES2["TWO_WINDINGS_TRANSFORMER"] = "TWO_WINDINGS_TRANSFORMER"; + EQUIPMENT_TYPES2["THREE_WINDINGS_TRANSFORMER"] = "THREE_WINDINGS_TRANSFORMER"; + EQUIPMENT_TYPES2["HVDC_LINE"] = "HVDC_LINE"; + EQUIPMENT_TYPES2["GENERATOR"] = "GENERATOR"; + EQUIPMENT_TYPES2["BATTERY"] = "BATTERY"; + EQUIPMENT_TYPES2["LOAD"] = "LOAD"; + EQUIPMENT_TYPES2["SHUNT_COMPENSATOR"] = "SHUNT_COMPENSATOR"; + EQUIPMENT_TYPES2["TIE_LINE"] = "TIE_LINE"; + EQUIPMENT_TYPES2["DANGLING_LINE"] = "DANGLING_LINE"; + EQUIPMENT_TYPES2["STATIC_VAR_COMPENSATOR"] = "STATIC_VAR_COMPENSATOR"; + EQUIPMENT_TYPES2["HVDC_CONVERTER_STATION"] = "HVDC_CONVERTER_STATION"; + EQUIPMENT_TYPES2["VSC_CONVERTER_STATION"] = "VSC_CONVERTER_STATION"; + EQUIPMENT_TYPES2["LCC_CONVERTER_STATION"] = "LCC_CONVERTER_STATION"; + EQUIPMENT_TYPES2["SWITCH"] = "SWITCH"; + return EQUIPMENT_TYPES2; +})(EQUIPMENT_TYPES || {}); +const isVoltageLevel = (object) => "substationId" in object; +const isSubstation = (object) => "voltageLevels" in object; +const isLine = (object) => "id" in object && "voltageLevelId1" in object && "voltageLevelId2" in object; +var ConvertersMode = /* @__PURE__ */ ((ConvertersMode2) => { + ConvertersMode2[ConvertersMode2["SIDE_1_RECTIFIER_SIDE_2_INVERTER"] = 0] = "SIDE_1_RECTIFIER_SIDE_2_INVERTER"; + ConvertersMode2[ConvertersMode2["SIDE_1_INVERTER_SIDE_2_RECTIFIER"] = 1] = "SIDE_1_INVERTER_SIDE_2_RECTIFIER"; + return ConvertersMode2; +})(ConvertersMode || {}); + +const elementIdIndexer = (map, element) => { + map.set(element.id, element); + return map; +}; +class MapEquipments { + substations = []; + substationsById = /* @__PURE__ */ new Map(); + lines = []; + linesById = /* @__PURE__ */ new Map(); + tieLines = []; + tieLinesById = /* @__PURE__ */ new Map(); + hvdcLines = []; + hvdcLinesById = /* @__PURE__ */ new Map(); + voltageLevels = []; + voltageLevelsById = /* @__PURE__ */ new Map(); + nominalVoltages = []; + intlRef = void 0; + constructor() { + } + newMapEquipmentForUpdate() { + return Object.assign(Object.create(Object.getPrototypeOf(this)), this); + } + checkAndGetValues(equipments) { + return equipments ? equipments : []; + } + completeSubstationsInfos(equipementsToIndex) { + const nominalVoltagesSet = new Set(this.nominalVoltages); + if (equipementsToIndex?.length === 0) { + this.substationsById = /* @__PURE__ */ new Map(); + this.voltageLevelsById = /* @__PURE__ */ new Map(); + } + const substations = equipementsToIndex?.length > 0 ? equipementsToIndex : this.substations; + substations.forEach((substation) => { + substation.voltageLevels = substation.voltageLevels.sort( + (voltageLevel1, voltageLevel2) => voltageLevel1.nominalV - voltageLevel2.nominalV + ); + this.substationsById.set(substation.id, substation); + substation.voltageLevels.forEach((voltageLevel) => { + voltageLevel.substationId = substation.id; + voltageLevel.substationName = substation.name; + this.voltageLevelsById.set(voltageLevel.id, voltageLevel); + nominalVoltagesSet.add(voltageLevel.nominalV); + }); + }); + this.voltageLevels = Array.from(this.voltageLevelsById.values()); + this.nominalVoltages = Array.from(nominalVoltagesSet).sort( + (a, b) => b - a + ); + } + updateEquipments(currentEquipments, newEquipements, _equipmentType) { + currentEquipments.forEach((equipment1, index) => { + const found = newEquipements.filter( + (equipment2) => equipment2.id === equipment1.id + ); + currentEquipments[index] = found.length > 0 ? found[0] : equipment1; + }); + const eqptsToAdd = newEquipements.filter( + (eqpt) => !currentEquipments.some((otherEqpt) => otherEqpt.id === eqpt.id) + ); + if (eqptsToAdd.length === 0) { + return currentEquipments; + } + return [...currentEquipments, ...eqptsToAdd]; + } + updateSubstations(substations, fullReload) { + if (fullReload) { + this.substations = []; + } + let voltageLevelAdded = false; + this.substations.forEach((substation1, index) => { + const found = substations.filter( + (substation2) => substation2.id === substation1.id + ); + if (found.length > 0) { + if (found[0].voltageLevels.length > substation1.voltageLevels.length) { + voltageLevelAdded = true; + } + this.substations[index] = found[0]; + } + }); + let substationAdded = false; + substations.forEach((substation1) => { + const found = this.substations.find( + (substation2) => substation2.id === substation1.id + ); + if (found === void 0) { + this.substations.push(substation1); + substationAdded = true; + } + }); + if (substationAdded || voltageLevelAdded) { + this.substations = [...this.substations]; + } + this.completeSubstationsInfos(fullReload ? [] : substations); + } + completeLinesInfos(equipementsToIndex) { + if (equipementsToIndex?.length > 0) { + equipementsToIndex.forEach((line) => { + this.linesById?.set(line.id, line); + }); + } else { + this.linesById = this.lines.reduce(elementIdIndexer, /* @__PURE__ */ new Map()); + } + } + completeTieLinesInfos(equipementsToIndex) { + if (equipementsToIndex?.length > 0) { + equipementsToIndex.forEach((tieLine) => { + this.tieLinesById?.set(tieLine.id, tieLine); + }); + } else { + this.tieLinesById = this.tieLines.reduce( + elementIdIndexer, + /* @__PURE__ */ new Map() + ); + } + } + updateLines(lines, fullReload) { + if (fullReload) { + this.lines = []; + } + this.lines = this.updateEquipments( + this.lines, + lines, + EQUIPMENT_TYPES.LINE + ); + this.completeLinesInfos(fullReload ? [] : lines); + } + updateTieLines(tieLines, fullReload) { + if (fullReload) { + this.tieLines = []; + } + this.tieLines = this.updateEquipments( + this.tieLines, + tieLines, + EQUIPMENT_TYPES.TIE_LINE + ); + this.completeTieLinesInfos(fullReload ? [] : tieLines); + } + updateHvdcLines(hvdcLines, fullReload) { + if (fullReload) { + this.hvdcLines = []; + } + this.hvdcLines = this.updateEquipments( + this.hvdcLines, + hvdcLines, + EQUIPMENT_TYPES.HVDC_LINE + ); + this.completeHvdcLinesInfos(fullReload ? [] : hvdcLines); + } + completeHvdcLinesInfos(equipementsToIndex) { + if (equipementsToIndex?.length > 0) { + equipementsToIndex.forEach((hvdcLine) => { + this.hvdcLinesById?.set(hvdcLine.id, hvdcLine); + }); + } else { + this.hvdcLinesById = this.hvdcLines.reduce( + elementIdIndexer, + /* @__PURE__ */ new Map() + ); + } + } + removeBranchesOfVoltageLevel(branchesList, voltageLevelId) { + const remainingLines = branchesList.filter( + (l) => l.voltageLevelId1 !== voltageLevelId && l.voltageLevelId2 !== voltageLevelId + ); + branchesList.filter((l) => !remainingLines.includes(l)).map((l) => this.linesById.delete(l.id)); + return remainingLines; + } + removeEquipment(equipmentType, equipmentId) { + switch (equipmentType) { + case EQUIPMENT_TYPES.LINE: { + this.lines = this.lines.filter((l) => l.id !== equipmentId); + this.linesById.delete(equipmentId); + break; + } + case EQUIPMENT_TYPES.VOLTAGE_LEVEL: { + const substationId = this.voltageLevelsById.get(equipmentId)?.substationId; + if (substationId === void 0) { + return; + } + const substation = this.substationsById.get(substationId); + if (substation === void 0) { + return; + } + substation.voltageLevels = substation.voltageLevels.filter( + (l) => l.id !== equipmentId + ); + this.removeBranchesOfVoltageLevel(this.lines, equipmentId); + this.substations = [...this.substations]; + break; + } + case EQUIPMENT_TYPES.SUBSTATION: { + this.substations = this.substations.filter( + (l) => l.id !== equipmentId + ); + const substation = this.substationsById.get(equipmentId); + if (substation === void 0) { + return; + } + substation.voltageLevels.map( + (vl) => this.removeEquipment(EQUIPMENT_TYPES.VOLTAGE_LEVEL, vl.id) + ); + this.completeSubstationsInfos([substation]); + break; + } + } + } + getVoltageLevels() { + return this.voltageLevels; + } + getVoltageLevel(id) { + return this.voltageLevelsById.get(id); + } + getSubstations() { + return this.substations; + } + getSubstation(id) { + return this.substationsById.get(id); + } + getNominalVoltages() { + return this.nominalVoltages; + } + getLines() { + return this.lines; + } + getLine(id) { + return this.linesById.get(id); + } + getHvdcLines() { + return this.hvdcLines; + } + getHvdcLine(id) { + return this.hvdcLinesById.get(id); + } + getTieLines() { + return this.tieLines; + } + getTieLine(id) { + return this.tieLinesById.get(id); + } +} + +const defaultProps$1 = { + getRadiusMaxPixels: { type: "accessor", value: 1 } +}; +class ScatterplotLayerExt extends ScatterplotLayer { + static layerName = "ScatterplotLayerExt"; + static defaultProps = defaultProps$1; + getShaders() { + const shaders = super.getShaders(); + return Object.assign({}, shaders, { + vs: shaders.vs.replace( + ", radiusMaxPixels", + ", instanceRadiusMaxPixels" + ), + // hack to replace the uniform variable to corresponding attribute + inject: { + "vs:#decl": `in float instanceRadiusMaxPixels; +` + } + }); + } + initializeState() { + super.initializeState(); + this.getAttributeManager()?.addInstanced({ + instanceRadiusMaxPixels: { + size: 1, + transition: true, + accessor: "getRadiusMaxPixels", + type: "float32", + defaultValue: 0 + } + }); + } +} + +const voltageLevelNominalVoltageIndexer = (map, voltageLevel) => { + let list = map.get(voltageLevel.nominalV); + if (!list) { + list = []; + map.set(voltageLevel.nominalV, list); + } + list.push(voltageLevel); + return map; +}; +const defaultProps = { + getNominalVoltageColor: { type: "function", value: () => [255, 255, 255] }, + filteredNominalVoltages: null, + labelsVisible: false, + labelColor: { type: "color", value: [255, 255, 255] }, + labelSize: 12 +}; +class SubstationLayer extends CompositeLayer { + static layerName = "SubstationLayer"; + static defaultProps = defaultProps; + initializeState(context) { + super.initializeState(context); + this.state = { + compositeData: [], + substationsLabels: [] + }; + } + updateState({ + props: { data, filteredNominalVoltages, geoData, getNameOrId, network }, + oldProps, + changeFlags + }) { + if (changeFlags.dataChanged) { + const metaVoltageLevelsByNominalVoltage = /* @__PURE__ */ new Map(); + if (network != null && geoData != null) { + data.forEach((substation) => { + const voltageLevelsByNominalVoltage = substation.voltageLevels.reduce( + voltageLevelNominalVoltageIndexer, + /* @__PURE__ */ new Map() + ); + const nominalVoltages = [ + ...new Set( + substation.voltageLevels.map((voltageLevel) => voltageLevel.nominalV).sort( + (nominalVoltage1, nominalVoltage2) => nominalVoltage1 - nominalVoltage2 + ) + ) + ]; + Array.from(voltageLevelsByNominalVoltage.entries()).forEach( + ([nominalV, voltageLevels]) => { + let metaVoltageLevels = metaVoltageLevelsByNominalVoltage.get(nominalV); + if (!metaVoltageLevels) { + metaVoltageLevels = []; + metaVoltageLevelsByNominalVoltage.set( + nominalV, + metaVoltageLevels + ); + } + metaVoltageLevels.push({ + voltageLevels, + nominalVoltageIndex: nominalVoltages.indexOf(nominalV) + }); + } + ); + }); + } + const metaVoltageLevelsByNominalVoltageArray = Array.from( + metaVoltageLevelsByNominalVoltage + ).map((e) => { + return { nominalV: e[0], metaVoltageLevels: e[1] }; + }).sort((a, b) => b.nominalV - a.nominalV); + this.setState({ + metaVoltageLevelsByNominalVoltage: metaVoltageLevelsByNominalVoltageArray + }); + } + if (changeFlags.dataChanged || getNameOrId !== oldProps.getNameOrId || filteredNominalVoltages !== oldProps.filteredNominalVoltages) { + let substationsLabels = data; + if (network != null && geoData != null && filteredNominalVoltages != null) { + substationsLabels = substationsLabels.filter( + (substation) => substation.voltageLevels.find( + (v) => filteredNominalVoltages.includes(v.nominalV) + ) !== void 0 + ); + } + this.setState({ substationsLabels }); + } + } + renderLayers() { + const layers = []; + this.state.metaVoltageLevelsByNominalVoltage?.forEach((e) => { + const substationsLayer = new ScatterplotLayerExt( + this.getSubLayerProps({ + id: "NominalVoltage" + e.nominalV, + data: e.metaVoltageLevels, + radiusMinPixels: SUBSTATION_RADIUS_MIN_PIXEL, + getRadiusMaxPixels: (metaVoltageLevel) => SUBSTATION_RADIUS_MAX_PIXEL * (metaVoltageLevel.nominalVoltageIndex + 1), + getPosition: (metaVoltageLevel) => this.props.geoData.getSubstationPosition( + metaVoltageLevel.voltageLevels[0].substationId + ), + getFillColor: this.props.getNominalVoltageColor(e.nominalV), + getRadius: (voltageLevel) => SUBSTATION_RADIUS * (voltageLevel.nominalVoltageIndex + 1), + visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes(e.nominalV), + updateTriggers: { + getPosition: [ + this.props?.geoData?.substationPositionsById, + this.props?.network?.substations + ] + } + }) + ); + layers.push(substationsLayer); + }); + const substationLabelsLayer = new TextLayer( + this.getSubLayerProps({ + id: "Label", + data: this.state.substationsLabels, + getPosition: (substation) => this.props.geoData.getSubstationPosition(substation.id), + getText: (substation) => this.props.getNameOrId(substation), + getColor: this.props.labelColor, + fontFamily: "Roboto", + getSize: this.props.labelSize, + getAngle: 0, + getTextAnchor: "start", + getAlignmentBaseline: "center", + getPixelOffset: [20 / 1.5, 0], + visible: this.props.labelsVisible, + updateTriggers: { + getText: [this.props.getNameOrId], + getPosition: [ + this.props.geoData.substationPositionsById, + this.props.network.substations + ] + } + }) + ); + layers.push(substationLabelsLayer); + return layers; + } +} + +export { ConvertersMode, EQUIPMENT_INFOS_TYPES, EQUIPMENT_TYPES, GeoData, LineFlowColorMode, LineFlowMode, LineLayer, MapEquipments, SubstationLayer, getNominalVoltageColor, isLine, isSubstation, isVoltageLevel }; diff --git a/packages/network-map-layers/dist/utils/colors.d.ts b/packages/network-map-layers/dist/utils/colors.d.ts new file mode 100644 index 00000000..d0706c66 --- /dev/null +++ b/packages/network-map-layers/dist/utils/colors.d.ts @@ -0,0 +1,5 @@ +import { Color } from '@deck.gl/core'; + +export declare function getNominalVoltageColor(nominalVoltage: number): Color; +export declare const INVALID_FLOW_OPACITY = 0.2; +export declare const NAD_INVALID_FLOW_OPACITY = 0.4; diff --git a/packages/network-map-layers/dist/utils/equipment-types.d.ts b/packages/network-map-layers/dist/utils/equipment-types.d.ts new file mode 100644 index 00000000..d0c03d7a --- /dev/null +++ b/packages/network-map-layers/dist/utils/equipment-types.d.ts @@ -0,0 +1,110 @@ +import { LineStatus } from '../network/line-layer'; + +export declare const EQUIPMENT_INFOS_TYPES: { + LIST: { + type: string; + }; + MAP: { + type: string; + }; + FORM: { + type: string; + }; + TAB: { + type: string; + }; + TOOLTIP: { + type: string; + }; +}; +export declare enum EQUIPMENT_TYPES { + SUBSTATION = "SUBSTATION", + VOLTAGE_LEVEL = "VOLTAGE_LEVEL", + LINE = "LINE", + TWO_WINDINGS_TRANSFORMER = "TWO_WINDINGS_TRANSFORMER", + THREE_WINDINGS_TRANSFORMER = "THREE_WINDINGS_TRANSFORMER", + HVDC_LINE = "HVDC_LINE", + GENERATOR = "GENERATOR", + BATTERY = "BATTERY", + LOAD = "LOAD", + SHUNT_COMPENSATOR = "SHUNT_COMPENSATOR", + TIE_LINE = "TIE_LINE", + DANGLING_LINE = "DANGLING_LINE", + STATIC_VAR_COMPENSATOR = "STATIC_VAR_COMPENSATOR", + HVDC_CONVERTER_STATION = "HVDC_CONVERTER_STATION", + VSC_CONVERTER_STATION = "VSC_CONVERTER_STATION", + LCC_CONVERTER_STATION = "LCC_CONVERTER_STATION", + SWITCH = "SWITCH" +} +export type LonLat = [number, number]; +export type VoltageLevel = { + id: string; + nominalV: number; + substationId: string; + substationName?: string; +}; +export type Substation = { + id: string; + name: string; + voltageLevels: VoltageLevel[]; +}; +export declare const isVoltageLevel: (object: Record) => object is VoltageLevel; +export declare const isSubstation: (object: Record) => object is Substation; +export type Line = { + id: string; + voltageLevelId1: string; + voltageLevelId2: string; + name: string; + terminal1Connected: boolean; + terminal2Connected: boolean; + p1: number; + p2: number; + i1?: number; + i2?: number; + operatingStatus?: LineStatus; + currentLimits1?: { + permanentLimit: number; + } | null; + currentLimits2?: { + permanentLimit: number; + } | null; + origin?: LonLat; + end?: LonLat; + substationIndexStart?: number; + substationIndexEnd?: number; + angle?: number; + angleStart?: number; + angleEnd?: number; + proximityFactorStart?: number; + proximityFactorEnd?: number; + parallelIndex?: number; + cumulativeDistances?: number[]; + positions?: LonLat[]; +}; +export declare const isLine: (object: Record) => object is Line; +export type TieLine = { + id: string; +}; +export declare enum ConvertersMode { + SIDE_1_RECTIFIER_SIDE_2_INVERTER = 0, + SIDE_1_INVERTER_SIDE_2_RECTIFIER = 1 +} +export type HvdcLine = { + id: string; + convertersMode: ConvertersMode; + r: number; + nominalV: number; + activePowerSetpoint: number; + maxP: number; +}; +export type Equipment = Line | Substation | TieLine | HvdcLine; +export type LineEquimentLine = Line & { + equipmentType: EQUIPMENT_TYPES.LINE; +}; +export type TieLineEquimentLine = Line & { + equipmentType: EQUIPMENT_TYPES.TIE_LINE; +}; +export type HvdcLineEquimentLine = Line & { + equipmentType: EQUIPMENT_TYPES.HVDC_LINE; +}; +export type EquimentLine = LineEquimentLine | TieLineEquimentLine | HvdcLineEquimentLine; diff --git a/packages/network-map-layers/package.json b/packages/network-map-layers/package.json new file mode 100644 index 00000000..d82f1aef --- /dev/null +++ b/packages/network-map-layers/package.json @@ -0,0 +1,38 @@ +{ + "name": "@powsybl/network-map-layers", + "version": "0.6", + "description": "Typescript library to integrate a powsybl svg diagram in a javascript project.", + "author": "powsybl team", + "homepage": "https://www.powsybl.org/", + "license": "MPL-2.0", + "repository": "git://github.com/powsybl/powsybl-diagram-viewer.git", + "type": "module", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "module": "./dist/powsybl-network-map-layers.js", + "exports": { + ".": { + "import": "./dist/powsybl-network-map-layers.js" + } + }, + "scripts": { + "build": "tsc --p ./tsconfig.json && vite build" + }, + "dependencies": { + "@deck.gl/core": "^9.0.0", + "@deck.gl/extensions": "9.0.0", + "@deck.gl/layers": "^9.0.0", + "@luma.gl/constants": "9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "9.0.0" + }, + "devDependencies": { + "typescript": "5.5.3", + "vite": "^5.3.3", + "vite-plugin-dts": "^3.9.1", + "vite-plugin-externalize-deps": "^0.8.0", + "vite-plugin-svgr": "^4.2.0" + } +} diff --git a/src/components/network-map-viewer/network/constants.ts b/packages/network-map-layers/src/constants.ts similarity index 100% rename from src/components/network-map-viewer/network/constants.ts rename to packages/network-map-layers/src/constants.ts diff --git a/src/components/network-map-viewer/images/bolt_black_24dp.svg b/packages/network-map-layers/src/images/bolt_black_24dp.svg similarity index 100% rename from src/components/network-map-viewer/images/bolt_black_24dp.svg rename to packages/network-map-layers/src/images/bolt_black_24dp.svg diff --git a/src/components/network-map-viewer/images/lock_black_24dp.svg b/packages/network-map-layers/src/images/lock_black_24dp.svg similarity index 100% rename from src/components/network-map-viewer/images/lock_black_24dp.svg rename to packages/network-map-layers/src/images/lock_black_24dp.svg diff --git a/packages/network-map-layers/src/index.ts b/packages/network-map-layers/src/index.ts new file mode 100644 index 00000000..f8b77937 --- /dev/null +++ b/packages/network-map-layers/src/index.ts @@ -0,0 +1,10 @@ +export { GeoData } from './network/geo-data'; +export { + LineFlowColorMode, + LineFlowMode, + LineLayer, +} from './network/line-layer'; +export { MapEquipments } from './network/map-equipments'; +export { SubstationLayer } from './network/substation-layer'; +export { getNominalVoltageColor } from './utils/colors'; +export * from './utils/equipment-types'; diff --git a/src/components/network-map-viewer/network/geo-data.ts b/packages/network-map-layers/src/network/geo-data.ts similarity index 99% rename from src/components/network-map-viewer/network/geo-data.ts rename to packages/network-map-layers/src/network/geo-data.ts index 24deebc7..4e1404c2 100644 --- a/src/components/network-map-viewer/network/geo-data.ts +++ b/packages/network-map-layers/src/network/geo-data.ts @@ -5,13 +5,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import { Line, LonLat } from '@/utils/equipment-types'; import cheapRuler from 'cheap-ruler'; import { computeDestinationPoint, getGreatCircleBearing, getRhumbLineBearing, } from 'geolib'; -import { Line, LonLat } from '../utils/equipment-types'; import { ArrowDirection } from './layers/arrow-layer'; import { MapEquipments } from './map-equipments'; diff --git a/src/components/network-map-viewer/network/layers/arrow-layer-fragment.frag b/packages/network-map-layers/src/network/layers/arrow-layer-fragment.frag similarity index 100% rename from src/components/network-map-viewer/network/layers/arrow-layer-fragment.frag rename to packages/network-map-layers/src/network/layers/arrow-layer-fragment.frag diff --git a/src/components/network-map-viewer/network/layers/arrow-layer-vertex.vert b/packages/network-map-layers/src/network/layers/arrow-layer-vertex.vert similarity index 100% rename from src/components/network-map-viewer/network/layers/arrow-layer-vertex.vert rename to packages/network-map-layers/src/network/layers/arrow-layer-vertex.vert diff --git a/src/components/network-map-viewer/network/layers/arrow-layer.ts b/packages/network-map-layers/src/network/layers/arrow-layer.ts similarity index 98% rename from src/components/network-map-viewer/network/layers/arrow-layer.ts rename to packages/network-map-layers/src/network/layers/arrow-layer.ts index 3e92d066..507d3bed 100644 --- a/src/components/network-map-viewer/network/layers/arrow-layer.ts +++ b/packages/network-map-layers/src/network/layers/arrow-layer.ts @@ -13,9 +13,9 @@ import { } from '@deck.gl/core'; import { GL } from '@luma.gl/constants'; import type { Texture } from '@luma.gl/core'; -import { DeprecatedWebGLTextureProps } from '@luma.gl/core/src/adapter/resources/texture'; import { Geometry, Model } from '@luma.gl/engine'; +import { Line } from '@/utils/equipment-types'; import { Device, RenderPass, @@ -30,7 +30,6 @@ import { Position, UpdateParameters, } from 'deck.gl'; -import { Line } from '../../utils/equipment-types'; import fs from './arrow-layer-fragment.frag?raw'; import vs from './arrow-layer-vertex.vert?raw'; @@ -326,7 +325,7 @@ export class ArrowLayer extends Layer> { [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE, }, mipmaps: false, - } satisfies TextureProps | DeprecatedWebGLTextureProps as TextureProps); + } as TextureProps); const stop = performance.now(); console.info( diff --git a/src/components/network-map-viewer/network/layers/fork-line-layer.ts b/packages/network-map-layers/src/network/layers/fork-line-layer.ts similarity index 98% rename from src/components/network-map-viewer/network/layers/fork-line-layer.ts rename to packages/network-map-layers/src/network/layers/fork-line-layer.ts index 309ed5a5..5a505d53 100644 --- a/src/components/network-map-viewer/network/layers/fork-line-layer.ts +++ b/packages/network-map-layers/src/network/layers/fork-line-layer.ts @@ -5,8 +5,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { DefaultProps } from '@deck.gl/core'; -import { Accessor, LineLayer, LineLayerProps } from 'deck.gl'; +import { Accessor, DefaultProps } from '@deck.gl/core'; +import { LineLayer, LineLayerProps } from '@deck.gl/layers'; export type ForkLineLayerProps = _ForkLineLayerProps & LineLayerProps; diff --git a/src/components/network-map-viewer/network/layers/parallel-path-layer.ts b/packages/network-map-layers/src/network/layers/parallel-path-layer.ts similarity index 98% rename from src/components/network-map-viewer/network/layers/parallel-path-layer.ts rename to packages/network-map-layers/src/network/layers/parallel-path-layer.ts index b0ce2d9b..0b56f2a1 100644 --- a/src/components/network-map-viewer/network/layers/parallel-path-layer.ts +++ b/packages/network-map-layers/src/network/layers/parallel-path-layer.ts @@ -4,9 +4,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { DefaultProps } from '@deck.gl/core'; +import { Accessor, DefaultProps } from '@deck.gl/core'; +import { PathLayer, PathLayerProps } from '@deck.gl/layers'; import { RenderPass, UniformValue } from '@luma.gl/core'; -import { Accessor, PathLayer, PathLayerProps } from 'deck.gl'; type _ParallelPathLayerProps = { getLineParallelIndex?: Accessor; diff --git a/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.ts b/packages/network-map-layers/src/network/layers/scatterplot-layer-ext.ts similarity index 92% rename from src/components/network-map-viewer/network/layers/scatterplot-layer-ext.ts rename to packages/network-map-layers/src/network/layers/scatterplot-layer-ext.ts index 83c38fa5..c9a440e3 100644 --- a/src/components/network-map-viewer/network/layers/scatterplot-layer-ext.ts +++ b/packages/network-map-layers/src/network/layers/scatterplot-layer-ext.ts @@ -4,8 +4,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { DefaultProps } from '@deck.gl/core'; -import { Accessor, ScatterplotLayer, ScatterplotLayerProps } from 'deck.gl'; +import { Accessor, DefaultProps } from '@deck.gl/core'; +import { ScatterplotLayer, ScatterplotLayerProps } from '@deck.gl/layers'; type _ScatterplotLayerExtProps = { getRadiusMaxPixels: Accessor; diff --git a/src/components/network-map-viewer/network/line-layer.ts b/packages/network-map-layers/src/network/line-layer.ts similarity index 99% rename from src/components/network-map-viewer/network/line-layer.ts rename to packages/network-map-layers/src/network/line-layer.ts index 2e073a23..9139235c 100644 --- a/src/components/network-map-viewer/network/line-layer.ts +++ b/packages/network-map-layers/src/network/line-layer.ts @@ -5,28 +5,27 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { PathStyleExtension } from '@deck.gl/extensions'; +import { + SUBSTATION_RADIUS, + SUBSTATION_RADIUS_MAX_PIXEL, + SUBSTATION_RADIUS_MIN_PIXEL, +} from '@/constants'; +import BoltIcon from '@/images/bolt_black_24dp.svg?react'; +import PadlockIcon from '@/images/lock_black_24dp.svg?react'; +import { INVALID_FLOW_OPACITY } from '@/utils/colors'; +import { Line, LonLat } from '@/utils/equipment-types'; import { Color, CompositeLayer, CompositeLayerProps, - IconLayer, Layer, LayerContext, Position, - TextLayer, UpdateParameters, -} from 'deck.gl'; +} from '@deck.gl/core'; +import { PathStyleExtension } from '@deck.gl/extensions'; +import { IconLayer, TextLayer } from '@deck.gl/layers'; import { getDistance } from 'geolib'; -import { INVALID_FLOW_OPACITY } from '../../../utils/colors'; -import BoltIcon from '../images/bolt_black_24dp.svg?react'; -import PadlockIcon from '../images/lock_black_24dp.svg?react'; -import { Line, LonLat } from '../utils/equipment-types'; -import { - SUBSTATION_RADIUS, - SUBSTATION_RADIUS_MAX_PIXEL, - SUBSTATION_RADIUS_MIN_PIXEL, -} from './constants'; import { GeoData } from './geo-data'; import { Arrow, ArrowDirection, ArrowLayer } from './layers/arrow-layer'; import ForkLineLayer from './layers/fork-line-layer'; diff --git a/src/components/network-map-viewer/network/map-equipments.ts b/packages/network-map-layers/src/network/map-equipments.ts similarity index 98% rename from src/components/network-map-viewer/network/map-equipments.ts rename to packages/network-map-layers/src/network/map-equipments.ts index 297fbb4d..d50d9e4a 100644 --- a/src/components/network-map-viewer/network/map-equipments.ts +++ b/packages/network-map-layers/src/network/map-equipments.ts @@ -6,11 +6,12 @@ */ import { + EQUIPMENT_TYPES, + Equipment, Line, Substation, VoltageLevel, -} from '@/components/network-map-viewer/utils/equipment-types'; -import { EQUIPMENT_TYPES, Equipment } from '../utils/equipment-types'; +} from '@/utils/equipment-types'; const elementIdIndexer = ( map: Map, diff --git a/src/components/network-map-viewer/network/substation-layer.ts b/packages/network-map-layers/src/network/substation-layer.ts similarity index 98% rename from src/components/network-map-viewer/network/substation-layer.ts rename to packages/network-map-layers/src/network/substation-layer.ts index e85c0b82..269d1e6c 100644 --- a/src/components/network-map-viewer/network/substation-layer.ts +++ b/packages/network-map-layers/src/network/substation-layer.ts @@ -5,22 +5,22 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { DefaultProps } from '@deck.gl/core'; import { Color, CompositeLayer, + DefaultProps, LayerContext, - TextLayer, UpdateParameters, -} from 'deck.gl'; +} from '@deck.gl/core'; +import { TextLayer } from '@deck.gl/layers'; import ScatterplotLayerExt from './layers/scatterplot-layer-ext'; -import { Substation, VoltageLevel } from '../utils/equipment-types'; import { SUBSTATION_RADIUS, SUBSTATION_RADIUS_MAX_PIXEL, SUBSTATION_RADIUS_MIN_PIXEL, -} from './constants'; +} from '@/constants'; +import { Substation, VoltageLevel } from '@/utils/equipment-types'; import { GeoData } from './geo-data'; import { CompositeData } from './line-layer'; import { MapEquipments } from './map-equipments'; diff --git a/src/utils/colors.ts b/packages/network-map-layers/src/utils/colors.ts similarity index 96% rename from src/utils/colors.ts rename to packages/network-map-layers/src/utils/colors.ts index 9cf8b6ee..fc191f23 100644 --- a/src/utils/colors.ts +++ b/packages/network-map-layers/src/utils/colors.ts @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { Color } from 'deck.gl'; +import { Color } from '@deck.gl/core'; export function getNominalVoltageColor(nominalVoltage: number): Color { if (nominalVoltage >= 300) { diff --git a/src/components/network-map-viewer/utils/equipment-types.ts b/packages/network-map-layers/src/utils/equipment-types.ts similarity index 98% rename from src/components/network-map-viewer/utils/equipment-types.ts rename to packages/network-map-layers/src/utils/equipment-types.ts index 65952503..b0e6f0ca 100644 --- a/src/components/network-map-viewer/utils/equipment-types.ts +++ b/packages/network-map-layers/src/utils/equipment-types.ts @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { LineStatus } from '../network/line-layer'; +import { LineStatus } from '@/network/line-layer'; export const EQUIPMENT_INFOS_TYPES = { LIST: { type: 'LIST' }, diff --git a/packages/network-map-layers/src/vite-env.d.ts b/packages/network-map-layers/src/vite-env.d.ts new file mode 100644 index 00000000..ee9857a6 --- /dev/null +++ b/packages/network-map-layers/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/network-map-layers/tsconfig.json b/packages/network-map-layers/tsconfig.json new file mode 100644 index 00000000..ec617a27 --- /dev/null +++ b/packages/network-map-layers/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "esnext", + "lib": ["ES2022"], + "target": "ESNext", + "declaration": true, + "outDir": "./dist", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "bundler", + "noEmit": true, + "resolveJsonModule": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/packages/network-map-layers/vite.config.ts b/packages/network-map-layers/vite.config.ts new file mode 100644 index 00000000..632dfedd --- /dev/null +++ b/packages/network-map-layers/vite.config.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2024, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import * as path from 'node:path'; +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import svgr from 'vite-plugin-svgr'; +import pkg from './package.json' assert { type: 'json' }; + +export default defineConfig((_config) => ({ + plugins: [svgr(), dts()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + build: { + minify: false, + lib: { + entry: path.resolve(__dirname, 'src/index.ts'), + formats: ['es'], + name: 'PowSyBl network map layers', + fileName: 'powsybl-network-map-layers', + }, + rollupOptions: { + external: [...Object.keys(pkg.dependencies), /^node:.*/], + }, + target: 'esnext', + }, +})); diff --git a/src/components/network-map-viewer/network/network-map.tsx b/src/components/network-map-viewer/network/network-map.tsx index f761d8ab..066e9950 100644 --- a/src/components/network-map-viewer/network/network-map.tsx +++ b/src/components/network-map-viewer/network/network-map.tsx @@ -22,6 +22,19 @@ import LoaderWithOverlay from '../utils/loader-with-overlay'; import { MapboxOverlay, MapboxOverlayProps } from '@deck.gl/mapbox'; import { Replay } from '@mui/icons-material'; import { Button, ButtonProps, useTheme } from '@mui/material'; +import { + GeoData, + LineFlowColorMode, + LineFlowMode, + LineLayer, + MapEquipments, + SubstationLayer, + getNominalVoltageColor, + isLine, + isSubstation, + isVoltageLevel, +} from '@powsybl/network-map-layers'; +import type { LineLayerProps } from '@powsybl/network-map-layers/dist/network/line-layer'; import { FormattedMessage } from 'react-intl'; import { Map, @@ -31,30 +44,18 @@ import { useControl, useMap, } from 'react-map-gl/maplibre'; -import { getNominalVoltageColor } from '../../../utils/colors'; -import { isLine, isSubstation, isVoltageLevel } from '../utils/equipment-types'; import { useNameOrId } from '../utils/equipmentInfosHandler'; import DrawControl, { DRAW_MODES, DrawControlProps, getMapDrawer, } from './draw-control'; -import { GeoData } from './geo-data'; -import { - LineFlowColorMode, - LineFlowMode, - LineLayer, - LineLayerProps, -} from './line-layer'; -import { MapEquipments } from './map-equipments'; -import { SubstationLayer } from './substation-layer'; import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css'; import booleanPointInPolygon from '@turf/boolean-point-in-polygon'; import { PickingInfo } from 'deck.gl'; import { Feature, Polygon } from 'geojson'; // import 'mapbox-gl/dist/mapbox-gl.css'; -import 'maplibre-gl/dist/maplibre-gl.css'; import { EQUIPMENT_TYPES, EquimentLine, @@ -65,7 +66,8 @@ import { Substation, TieLineEquimentLine, VoltageLevel, -} from '../utils/equipment-types'; +} from '@powsybl/network-map-layers'; +import 'maplibre-gl/dist/maplibre-gl.css'; // MouseEvent.button https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button const MOUSE_EVENT_BUTTON_LEFT = 0; diff --git a/src/index.ts b/src/index.ts index 12624c86..655cc00c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,13 +5,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -export { NetworkAreaDiagramViewer } from './components/network-area-diagram-viewer/network-area-diagram-viewer'; -export { GeoData } from './components/network-map-viewer/network/geo-data'; export { + GeoData, LineFlowColorMode, LineFlowMode, -} from './components/network-map-viewer/network/line-layer'; -export { MapEquipments } from './components/network-map-viewer/network/map-equipments'; + MapEquipments, +} from '@powsybl/network-map-layers'; +export { NetworkAreaDiagramViewer } from './components/network-area-diagram-viewer/network-area-diagram-viewer'; export { DRAW_EVENT, default as NetworkMap, diff --git a/vite.config.ts b/vite.config.ts index 45c20bbe..076fb1d1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -67,6 +67,11 @@ export default defineConfig((_config) => ({ '@luma.gl/constants': 'LumaGlConstants', '@luma.gl/core': 'LumaGlCore', '@svgdotjs/svg.js': 'SvgJs', + '@powsybl/network-map-layers': 'PowsyblNetworkMapLayers', + 'react-map-gl/maplibre': 'ReactMapGlMaplibre', + '@mapbox/mapbox-gl-draw': 'MapboxGlDraw', + '@turf/boolean-point-in-polygon': + 'TurfBooleanPointInPolygon', }, }, }, From 83257851f435c2eee242d04d45fbf4003da77ce6 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Fri, 26 Jul 2024 09:32:25 +0200 Subject: [PATCH 05/10] move single-line-diagram-viewer in its own package --- demo/src/App.tsx | 4 +- demo/src/diagram-viewers/add-diagrams.ts | 4 +- demo/src/map-viewer/demo-map-equipments.ts | 5 +- package-lock.json | 24 +- package.json | 6 +- .../network-map-layers/dist/constants.d.ts | 9 - packages/network-map-layers/dist/index.d.ts | 6 - .../dist/network/geo-data.d.ts | 304 - .../dist/network/layers/arrow-layer.d.ts | 86 - .../dist/network/layers/fork-line-layer.d.ts | 43 - .../network/layers/parallel-path-layer.d.ts | 35 - .../network/layers/scatterplot-layer-ext.d.ts | 17 - .../dist/network/line-layer.d.ts | 150 - .../dist/network/map-equipments.d.ts | 41 - .../dist/network/substation-layer.d.ts | 39 - .../dist/powsybl-network-map-layers.js | 5548 ----------------- .../network-map-layers/dist/utils/colors.d.ts | 5 - .../dist/utils/equipment-types.d.ts | 110 - packages/network-map-layers/package.json | 2 +- .../single-line-diagram-viewer/package.json | 34 + .../single-line-diagram-viewer/src/index.ts | 12 + .../src}/single-line-diagram-viewer.ts | 0 .../single-line-diagram-viewer/tsconfig.json | 22 + .../single-line-diagram-viewer/vite.config.ts | 34 + src/index.ts | 16 +- vite.config.ts | 4 + 26 files changed, 147 insertions(+), 6413 deletions(-) delete mode 100644 packages/network-map-layers/dist/constants.d.ts delete mode 100644 packages/network-map-layers/dist/index.d.ts delete mode 100644 packages/network-map-layers/dist/network/geo-data.d.ts delete mode 100644 packages/network-map-layers/dist/network/layers/arrow-layer.d.ts delete mode 100644 packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts delete mode 100644 packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts delete mode 100644 packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts delete mode 100644 packages/network-map-layers/dist/network/line-layer.d.ts delete mode 100644 packages/network-map-layers/dist/network/map-equipments.d.ts delete mode 100644 packages/network-map-layers/dist/network/substation-layer.d.ts delete mode 100644 packages/network-map-layers/dist/powsybl-network-map-layers.js delete mode 100644 packages/network-map-layers/dist/utils/colors.d.ts delete mode 100644 packages/network-map-layers/dist/utils/equipment-types.d.ts create mode 100644 packages/single-line-diagram-viewer/package.json create mode 100644 packages/single-line-diagram-viewer/src/index.ts rename {src/components/single-line-diagram-viewer => packages/single-line-diagram-viewer/src}/single-line-diagram-viewer.ts (100%) create mode 100644 packages/single-line-diagram-viewer/tsconfig.json create mode 100644 packages/single-line-diagram-viewer/vite.config.ts diff --git a/demo/src/App.tsx b/demo/src/App.tsx index 81d948ec..11ab2c2a 100644 --- a/demo/src/App.tsx +++ b/demo/src/App.tsx @@ -5,18 +5,18 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import { GeoData, NetworkMap } from '@/index'; import { StyledEngineProvider, ThemeProvider, createTheme, } from '@mui/material/styles'; import { useEffect, useRef } from 'react'; -import { GeoData, NetworkMap } from '../../src'; import DemoMapEquipments from './map-viewer/demo-map-equipments'; import { NetworkMapRef } from '@/components/network-map-viewer/network/network-map'; -import { Equipment } from '@/components/network-map-viewer/utils/equipment-types'; +import { Equipment } from '@powsybl/network-map-layers'; import { addNadToDemo, addSldToDemo } from './diagram-viewers/add-diagrams'; import lmapdata from './map-viewer/data/lmap.json'; import lposdata from './map-viewer/data/lpos.json'; diff --git a/demo/src/diagram-viewers/add-diagrams.ts b/demo/src/diagram-viewers/add-diagrams.ts index 56a4ca5f..540e8376 100644 --- a/demo/src/diagram-viewers/add-diagrams.ts +++ b/demo/src/diagram-viewers/add-diagrams.ts @@ -11,7 +11,7 @@ import SldSvgExample from './data/sld-example.svg'; import SldSvgSubExampleMeta from './data/sld-sub-example-meta.json' assert { type: 'json' }; import SldSvgSubExample from './data/sld-sub-example.svg'; -import { NetworkAreaDiagramViewer } from '../../../src/components/network-area-diagram-viewer/network-area-diagram-viewer'; +import { NetworkAreaDiagramViewer } from '@/components/network-area-diagram-viewer/network-area-diagram-viewer'; import { HandleTogglePopoverType, OnBreakerCallbackType, @@ -19,7 +19,7 @@ import { OnFeederCallbackType, OnNextVoltageCallbackType, SingleLineDiagramViewer, -} from '../../../src/components/single-line-diagram-viewer/single-line-diagram-viewer'; +} from '@powsybl/single-line-diagram-viewer'; export const addNadToDemo = () => { fetch(NadSvgExample) diff --git a/demo/src/map-viewer/demo-map-equipments.ts b/demo/src/map-viewer/demo-map-equipments.ts index bbc45157..e662c6a5 100644 --- a/demo/src/map-viewer/demo-map-equipments.ts +++ b/demo/src/map-viewer/demo-map-equipments.ts @@ -5,11 +5,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { - Line, - Substation, -} from '@/components/network-map-viewer/utils/equipment-types'; import { MapEquipments } from '@/index'; +import { Line, Substation } from '@powsybl/network-map-layers'; export default class DemoMapEquipments extends MapEquipments { initEquipments(smapdata: Substation[], lmapdata: Line[]) { diff --git a/package-lock.json b/package-lock.json index b4f90edb..ac5f70d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,13 @@ "version": "0.5.1", "license": "MPL-2.0", "workspaces": [ - "packages/network-map-layers" + "packages/network-map-layers", + "packages/single-line-diagram-viewer" ], "dependencies": { "@mapbox/mapbox-gl-draw": "^1.4.3", "@powsybl/network-map-layers": "^0.6.0", + "@powsybl/single-line-diagram-viewer": "^0.6.0", "@svgdotjs/svg.js": "^3.2.4", "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", @@ -4734,6 +4736,10 @@ "resolved": "packages/network-map-layers", "link": true }, + "node_modules/@powsybl/single-line-diagram-viewer": { + "resolved": "packages/single-line-diagram-viewer", + "link": true + }, "node_modules/@probe.gl/env": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.0.9.tgz", @@ -16505,6 +16511,22 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "packages/single-line-diagram-viewer": { + "name": "@powsybl/single-line-diagram-viewer", + "version": "0.6", + "license": "MPL-2.0", + "dependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.panzoom.js": "^2.1.2" + }, + "devDependencies": { + "typescript": "5.5.3", + "vite": "^5.3.3", + "vite-plugin-dts": "^3.9.1", + "vite-plugin-externalize-deps": "^0.8.0", + "vite-plugin-svgr": "^4.2.0" + } } } } diff --git a/package.json b/package.json index 533e704d..475a6c0b 100644 --- a/package.json +++ b/package.json @@ -28,11 +28,13 @@ "licenses-check": "license-checker --summary --excludePrivatePackages --production --onlyAllow \"$( jq -r .onlyAllow[] license-checker-config.json | tr '\n' ';')\" --excludePackages \"$( jq -r .excludePackages[] license-checker-config.json | tr '\n' ';')\"" }, "workspaces": [ - "packages/network-map-layers" + "packages/network-map-layers", + "packages/single-line-diagram-viewer" ], "dependencies": { - "@powsybl/network-map-layers": "^0.6.0", "@mapbox/mapbox-gl-draw": "^1.4.3", + "@powsybl/network-map-layers": "^0.6.0", + "@powsybl/single-line-diagram-viewer": "^0.6.0", "@svgdotjs/svg.js": "^3.2.4", "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", diff --git a/packages/network-map-layers/dist/constants.d.ts b/packages/network-map-layers/dist/constants.d.ts deleted file mode 100644 index 46d8370d..00000000 --- a/packages/network-map-layers/dist/constants.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) 2020, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -export declare const SUBSTATION_RADIUS = 500; -export declare const SUBSTATION_RADIUS_MAX_PIXEL = 5; -export declare const SUBSTATION_RADIUS_MIN_PIXEL = 1; diff --git a/packages/network-map-layers/dist/index.d.ts b/packages/network-map-layers/dist/index.d.ts deleted file mode 100644 index d22bee1f..00000000 --- a/packages/network-map-layers/dist/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { GeoData } from './network/geo-data'; -export { LineFlowColorMode, LineFlowMode, LineLayer, } from './network/line-layer'; -export { MapEquipments } from './network/map-equipments'; -export { SubstationLayer } from './network/substation-layer'; -export { getNominalVoltageColor } from './utils/colors'; -export * from './utils/equipment-types'; diff --git a/packages/network-map-layers/dist/network/geo-data.d.ts b/packages/network-map-layers/dist/network/geo-data.d.ts deleted file mode 100644 index fcf4fa44..00000000 --- a/packages/network-map-layers/dist/network/geo-data.d.ts +++ /dev/null @@ -1,304 +0,0 @@ -import { Line, LonLat } from '../utils/equipment-types'; -import { ArrowDirection } from './layers/arrow-layer'; -import { MapEquipments } from './map-equipments'; - -export declare enum Country { - AF = "AFGHANISTAN", - AX = "\u00C5LAND ISLANDS", - AL = "ALBANIA", - DZ = "ALGERIA", - AS = "AMERICAN SAMOA", - AD = "ANDORRA", - AO = "ANGOLA", - AI = "ANGUILLA", - AQ = "ANTARCTICA", - AG = "ANTIGUA AND BARBUDA", - AR = "ARGENTINA", - AM = "ARMENIA", - AW = "ARUBA", - AU = "AUSTRALIA", - AT = "AUSTRIA", - AZ = "AZERBAIJAN", - BS = "BAHAMAS", - BH = "BAHRAIN", - BD = "BANGLADESH", - BB = "BARBADOS", - BY = "BELARUS", - BE = "BELGIUM", - BZ = "BELIZE", - BJ = "BENIN", - BM = "BERMUDA", - BT = "BHUTAN", - BO = "BOLIVIA, PLURINATIONAL STATE OF", - BQ = "BONAIRE, SINT EUSTATIUS AND SABA", - BA = "BOSNIA AND HERZEGOVINA", - BW = "BOTSWANA", - BV = "BOUVET ISLAND", - BR = "BRAZIL", - IO = "BRITISH INDIAN OCEAN TERRITORY", - BN = "BRUNEI DARUSSALAM", - BG = "BULGARIA", - BF = "BURKINA FASO", - BI = "BURUNDI", - KH = "CAMBODIA", - CM = "CAMEROON", - CA = "CANADA", - CV = "CAPE VERDE", - KY = "CAYMAN ISLANDS", - CF = "CENTRAL AFRICAN REPUBLIC", - TD = "CHAD", - CL = "CHILE", - CN = "CHINA", - CX = "CHRISTMAS ISLAND", - CC = "COCOS (KEELING) ISLANDS", - CO = "COLOMBIA", - KM = "COMOROS", - CG = "CONGO", - CD = "CONGO, THE DEMOCRATIC REPUBLIC OF THE", - CK = "COOK ISLANDS", - CR = "COSTA RICA", - CI = "C\u00D4TE D'IVOIRE", - HR = "CROATIA", - CU = "CUBA", - CW = "CURA\u00C7AO", - CY = "CYPRUS", - CZ = "CZECH REPUBLIC", - DK = "DENMARK", - DJ = "DJIBOUTI", - DM = "DOMINICA", - DO = "DOMINICAN REPUBLIC", - EC = "ECUADOR", - EG = "EGYPT", - SV = "EL SALVADOR", - GQ = "EQUATORIAL GUINEA", - ER = "ERITREA", - EE = "ESTONIA", - ET = "ETHIOPIA", - FK = "FALKLAND ISLANDS (MALVINAS)", - FO = "FAROE ISLANDS", - FJ = "FIJI", - FI = "FINLAND", - FR = "FRANCE", - GF = "FRENCH GUIANA", - PF = "FRENCH POLYNESIA", - TF = "FRENCH SOUTHERN TERRITORIES", - GA = "GABON", - GM = "GAMBIA", - GE = "GEORGIA", - DE = "GERMANY", - GH = "GHANA", - GI = "GIBRALTAR", - GR = "GREECE", - GL = "GREENLAND", - GD = "GRENADA", - GP = "GUADELOUPE", - GU = "GUAM", - GT = "GUATEMALA", - GG = "GUERNSEY", - GN = "GUINEA", - GW = "GUINEA-BISSAU", - GY = "GUYANA", - HT = "HAITI", - HM = "HEARD ISLAND AND MCDONALD ISLANDS", - VA = "HOLY SEE (VATICAN CITY STATE)", - HN = "HONDURAS", - HK = "HONG KONG", - HU = "HUNGARY", - IS = "ICELAND", - IN = "INDIA", - ID = "INDONESIA", - IR = "IRAN, ISLAMIC REPUBLIC OF", - IQ = "IRAQ", - IE = "IRELAND", - IM = "ISLE OF MAN", - IL = "ISRAEL", - IT = "ITALY", - JM = "JAMAICA", - JP = "JAPAN", - JE = "JERSEY", - JO = "JORDAN", - KZ = "KAZAKHSTAN", - KE = "KENYA", - KI = "KIRIBATI", - KP = "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF", - KR = "KOREA, REPUBLIC OF", - XK = "KOSOVO", - KW = "KUWAIT", - KG = "KYRGYZSTAN", - LA = "LAO PEOPLE'S DEMOCRATIC REPUBLIC", - LV = "LATVIA", - LB = "LEBANON", - LS = "LESOTHO", - LR = "LIBERIA", - LY = "LIBYA", - LI = "LIECHTENSTEIN", - LT = "LITHUANIA", - LU = "LUXEMBOURG", - MO = "MACAO", - MK = "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF", - MG = "MADAGASCAR", - MW = "MALAWI", - MY = "MALAYSIA", - MV = "MALDIVES", - ML = "MALI", - MT = "MALTA", - MH = "MARSHALL ISLANDS", - MQ = "MARTINIQUE", - MR = "MAURITANIA", - MU = "MAURITIUS", - YT = "MAYOTTE", - MX = "MEXICO", - FM = "MICRONESIA, FEDERATED STATES OF", - MD = "MOLDOVA, REPUBLIC OF", - MC = "MONACO", - MN = "MONGOLIA", - ME = "MONTENEGRO", - MS = "MONTSERRAT", - MA = "MOROCCO", - MZ = "MOZAMBIQUE", - MM = "MYANMAR", - NA = "NAMIBIA", - NR = "NAURU", - NP = "NEPAL", - NL = "NETHERLANDS", - NC = "NEW CALEDONIA", - NZ = "NEW ZEALAND", - NI = "NICARAGUA", - NE = "NIGER", - NG = "NIGERIA", - NU = "NIUE", - NF = "NORFOLK ISLAND", - MP = "NORTHERN MARIANA ISLANDS", - NO = "NORWAY", - OM = "OMAN", - PK = "PAKISTAN", - PW = "PALAU", - PS = "PALESTINE, STATE OF", - PA = "PANAMA", - PG = "PAPUA NEW GUINEA", - PY = "PARAGUAY", - PE = "PERU", - PH = "PHILIPPINES", - PN = "PITCAIRN", - PL = "POLAND", - PT = "PORTUGAL", - PR = "PUERTO RICO", - QA = "QATAR", - RE = "R\u00C9UNION", - RO = "ROMANIA", - RU = "RUSSIAN FEDERATION", - RW = "RWANDA", - BL = "SAINT BARTH\u00C9LEMY", - SH = "SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA", - KN = "SAINT KITTS AND NEVIS", - LC = "SAINT LUCIA", - MF = "SAINT MARTIN (FRENCH PART)", - PM = "SAINT PIERRE AND MIQUELON", - VC = "SAINT VINCENT AND THE GRENADINES", - WS = "SAMOA", - SM = "SAN MARINO", - ST = "SAO TOME AND PRINCIPE", - SA = "SAUDI ARABIA", - SN = "SENEGAL", - RS = "SERBIA", - SC = "SEYCHELLES", - SL = "SIERRA LEONE", - SG = "SINGAPORE", - SX = "SINT MAARTEN (DUTCH PART)", - SK = "SLOVAKIA", - SI = "SLOVENIA", - SB = "SOLOMON ISLANDS", - SO = "SOMALIA", - ZA = "SOUTH AFRICA", - GS = "SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS", - SS = "SOUTH SUDAN", - ES = "SPAIN", - LK = "SRI LANKA", - SD = "SUDAN", - SR = "SURINAME", - SJ = "SVALBARD AND JAN MAYEN", - SZ = "SWAZILAND", - SE = "SWEDEN", - CH = "SWITZERLAND", - SY = "SYRIAN ARAB REPUBLIC", - TW = "TAIWAN, PROVINCE OF CHINA", - TJ = "TAJIKISTAN", - TZ = "TANZANIA, UNITED REPUBLIC OF", - TH = "THAILAND", - TL = "TIMOR-LESTE", - TG = "TOGO", - TK = "TOKELAU", - TO = "TONGA", - TT = "TRINIDAD AND TOBAGO", - TN = "TUNISIA", - TR = "TURKEY", - TM = "TURKMENISTAN", - TC = "TURKS AND CAICOS ISLANDS", - TV = "TUVALU", - UG = "UGANDA", - UA = "UKRAINE", - AE = "UNITED ARAB EMIRATES", - GB = "UNITED KINGDOM", - US = "UNITED STATES", - UM = "UNITED STATES MINOR OUTLYING ISLANDS", - UY = "URUGUAY", - UZ = "UZBEKISTAN", - VU = "VANUATU", - VE = "VENEZUELA, BOLIVARIAN REPUBLIC OF", - VN = "VIET NAM", - VG = "VIRGIN ISLANDS, BRITISH", - VI = "VIRGIN ISLANDS, U.S.", - WF = "WALLIS AND FUTUNA", - EH = "WESTERN SAHARA", - YE = "YEMEN", - ZM = "ZAMBIA", - ZW = "ZIMBABWE" -} -export type Coordinate = { - lon: number; - lat: number; -}; -type SubstationPosition = { - id: string; - coordinate: Coordinate; -}; -type LinePosition = { - id: string; - coordinates: Coordinate[]; -}; -export declare class GeoData { - substationPositionsById: Map; - linePositionsById: Map; - constructor(substationPositionsById: Map, linePositionsById: Map); - setSubstationPositions(positions: SubstationPosition[]): void; - updateSubstationPositions(substationIdsToUpdate: string[], fetchedPositions: SubstationPosition[]): void; - getSubstationPosition(substationId: string): LonLat; - setLinePositions(positions: LinePosition[]): void; - updateLinePositions(lineIdsToUpdate: string[], fetchedPositions: LinePosition[]): void; - /** - * Get line positions always ordered from side 1 to side 2. - */ - getLinePositions(network: MapEquipments, line: Line, detailed?: boolean): LonLat[]; - getLineDistances(positions: LonLat[]): number[] | null; - /** - * Find the segment in which we reach the wanted distance and return the segment - * along with the remaining distance to travel on this segment to be at the exact wanted distance - * (implemented using a binary search) - */ - findSegment(positions: LonLat[], cumulativeDistances: number[], wantedDistance: number): { - idx: number; - segment: [LonLat, LonLat]; - remainingDistance: number; - }; - labelDisplayPosition(positions: LonLat[], cumulativeDistances: number[], arrowPosition: number, arrowDirection: ArrowDirection, lineParallelIndex: number, lineAngle: number, proximityAngle: number, distanceBetweenLines: number, proximityFactor: number): { - position: { - latitude: number; - longitude: number; - }; - angle: number; - offset: [number, number]; - } | null; - getLabelOffset(angle: number, offsetDistance: number, arrowDirection: ArrowDirection): [number, number]; - getMapAngle(point1: LonLat, point2: LonLat): number; -} -export {}; diff --git a/packages/network-map-layers/dist/network/layers/arrow-layer.d.ts b/packages/network-map-layers/dist/network/layers/arrow-layer.d.ts deleted file mode 100644 index 81b27b5b..00000000 --- a/packages/network-map-layers/dist/network/layers/arrow-layer.d.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Accessor, DefaultProps, Layer } from '@deck.gl/core'; -import { Texture, Device, RenderPass, TextureFormat, TextureProps, UniformValue } from '@luma.gl/core'; -import { Model } from '@luma.gl/engine'; -import { Line } from '../../utils/equipment-types'; -import { Color, LayerContext, LayerProps, Position, UpdateParameters } from 'deck.gl'; - -export declare enum ArrowDirection { - NONE = "none", - FROM_SIDE_1_TO_SIDE_2 = "fromSide1ToSide2", - FROM_SIDE_2_TO_SIDE_1 = "fromSide2ToSide1" -} -export type Arrow = { - line: Line; - distance: number; -}; -export type LayerDataSource = DataType[]; -type _ArrowLayerProps = { - data: Arrow[]; - sizeMinPixels?: number; - sizeMaxPixels?: number; - getDistance: Accessor; - getLine: (arrow: Arrow) => Line; - getLinePositions: (line: Line) => Position[]; - getSize?: Accessor; - getColor?: Accessor; - getSpeedFactor?: Accessor; - getDirection?: Accessor; - animated?: boolean; - getLineParallelIndex?: Accessor; - getLineAngles?: Accessor; - getDistanceBetweenLines?: Accessor; - maxParallelOffset?: number; - minParallelOffset?: number; - opacity?: number; -} & LayerProps; -type ArrowLayerProps = _ArrowLayerProps & LayerProps; -type LineAttributes = { - distance: number; - positionsTextureOffset: number; - distancesTextureOffset: number; - pointCount: number; -}; -/** - * A layer that draws arrows over the lines between voltage levels. The arrows are drawn on a direct line - * or with a parallel offset. The initial point is also shifted to coincide with the fork line ends. - * Needs to be kept in sync with ForkLineLayer and ParallelPathLayer because they draw the lines. - * props : getLineParallelIndex: accessor for real number representing the parallel translation, normalized to distanceBetweenLines - * getLineAngles: accessor for line angle in radian (3 angle substation1 / first pylon ; substation1/substation2 ; last pylon / substation2 - * distanceBetweenLines: distance in meters between line when no pixel clamping is applied - * maxParallelOffset: max pixel distance - * minParallelOffset: min pixel distance - */ -export declare class ArrowLayer extends Layer> { - static layerName: string; - static defaultProps: DefaultProps; - state: { - linePositionsTexture: Texture; - lineDistancesTexture: Texture; - lineAttributes: Map; - model?: Model; - timestamp: number; - stop: boolean; - maxTextureSize: number; - }; - getShaders(): any; - getArrowLineAttributes(arrow: Arrow): LineAttributes; - initializeState(): void; - finalizeState(context: LayerContext): void; - createTexture2D(device: Device, data: Array, elementSize: number, format: TextureFormat): Texture; - createTexturesStructure(props: this['props']): { - linePositionsTextureData: number[]; - lineDistancesTextureData: number[]; - lineAttributes: Map; - }; - updateGeometry({ props, changeFlags }: UpdateParameters): void; - updateModel({ changeFlags }: UpdateParameters): void; - updateState(updateParams: UpdateParameters): void; - animate(timestamp: number): void; - startAnimation(): void; - draw({ uniforms, renderPass, }: { - uniforms: Record; - renderPass: RenderPass; - }): void; - _getModel(device: Device): Model; -} -export {}; diff --git a/packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts b/packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts deleted file mode 100644 index 6178dde1..00000000 --- a/packages/network-map-layers/dist/network/layers/fork-line-layer.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Accessor, DefaultProps } from '@deck.gl/core'; -import { LineLayer, LineLayerProps } from '@deck.gl/layers'; - -export type ForkLineLayerProps = _ForkLineLayerProps & LineLayerProps; -type _ForkLineLayerProps = { - getLineParallelIndex: Accessor; - getLineAngle: Accessor; - distanceBetweenLines: Accessor; - maxParallelOffset: Accessor; - minParallelOffset: Accessor; - substationRadius: Accessor; - substationMaxPixel: Accessor; - minSubstationRadiusPixel: Accessor; - getDistanceBetweenLines: Accessor; - getMaxParallelOffset: Accessor; - getMinParallelOffset: Accessor; - getSubstationRadius: Accessor; - getSubstationMaxPixel: Accessor; - getMinSubstationRadiusPixel: Accessor; -}; -/** - * A layer based on LineLayer that draws a fork line at a substation when there are multiple parallel lines - * Needs to be kept in sync with ArrowLayer and ParallelPathLayer because connect to the end of the fork lines. - * props : getLineParallelIndex: real number representing the parallel translation, normalized to distanceBetweenLines - * getLineAngle: line angle in radian - * distanceBetweenLines: distance in meters between line when no pixel clamping is applied - * maxParallelOffset: max pixel distance - * minParallelOffset: min pixel distance - * instanceOffsetStart: distance from the origin point - * substationRadius: radius for a voltage level in substation - * substationMaxPixel: max pixel for a voltage level in substation - * minSubstationRadiusPixel : min pixel for a substation - */ -export default class ForkLineLayer extends LineLayer>> { - static layerName: string; - static defaultProps: DefaultProps>; - getShaders(): any; - initializeState(): void; - draw({ uniforms, }: { - uniforms: Record; - }): void; -} -export {}; diff --git a/packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts b/packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts deleted file mode 100644 index c383be93..00000000 --- a/packages/network-map-layers/dist/network/layers/parallel-path-layer.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Accessor, DefaultProps } from '@deck.gl/core'; -import { PathLayer, PathLayerProps } from '@deck.gl/layers'; -import { RenderPass, UniformValue } from '@luma.gl/core'; - -type _ParallelPathLayerProps = { - getLineParallelIndex?: Accessor; - getLineAngle?: Accessor; - distanceBetweenLines?: number; - maxParallelOffset?: number; - minParallelOffset?: number; -}; -export type ParallelPathLayerProps = _ParallelPathLayerProps & PathLayerProps; -/** - * A layer based on PathLayer allowing to shift path by an offset + angle - * In addition to the shift for all points, the first point is also shifted - * to coincide to the end of "fork lines" starting from the substations. - * Needs to be kept in sync with ForkLineLayer and ArrowLayer because - * ForkLineLayer must connect to this and the arrows must overlap on this. - * props : getLineParallelIndex: real number representing the parallel translation, normalized to distanceBetweenLines - * getLineAngle: line angle in radian - * distanceBetweenLines: distance in meters between line when no pixel clamping is applied - * maxParallelOffset: max pixel distance - * minParallelOffset: min pixel distance - */ -export default class ParallelPathLayer extends PathLayer>> { - static layerName: string; - static defaultProps: DefaultProps>; - getShaders(): any; - initializeState(): void; - draw({ uniforms, }: { - uniforms: Record; - renderPass: RenderPass; - }): void; -} -export {}; diff --git a/packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts b/packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts deleted file mode 100644 index 18d511b4..00000000 --- a/packages/network-map-layers/dist/network/layers/scatterplot-layer-ext.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Accessor, DefaultProps } from '@deck.gl/core'; -import { ScatterplotLayer, ScatterplotLayerProps } from '@deck.gl/layers'; - -type _ScatterplotLayerExtProps = { - getRadiusMaxPixels: Accessor; -}; -export type ScatterplotLayerExtProps = _ScatterplotLayerExtProps & ScatterplotLayerProps; -/** - * An extended scatter plot layer that allows a radius max pixels to be different for each object. - */ -export default class ScatterplotLayerExt extends ScatterplotLayer>> { - static layerName: string; - static defaultProps: DefaultProps>; - getShaders(): any; - initializeState(): void; -} -export {}; diff --git a/packages/network-map-layers/dist/network/line-layer.d.ts b/packages/network-map-layers/dist/network/line-layer.d.ts deleted file mode 100644 index c33998c0..00000000 --- a/packages/network-map-layers/dist/network/line-layer.d.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { Line, LonLat } from '../utils/equipment-types'; -import { Color, CompositeLayer, CompositeLayerProps, Layer, LayerContext, Position, UpdateParameters } from '@deck.gl/core'; -import { GeoData } from './geo-data'; -import { Arrow } from './layers/arrow-layer'; -import { MapEquipments } from './map-equipments'; - -export declare enum LineFlowMode { - STATIC_ARROWS = "staticArrows", - ANIMATED_ARROWS = "animatedArrows", - FEEDERS = "feeders" -} -export declare enum LineFlowColorMode { - NOMINAL_VOLTAGE = "nominalVoltage", - OVERLOADS = "overloads" -} -export declare enum LineLoadingZone { - UNKNOWN = 0, - SAFE = 1, - WARNING = 2, - OVERLOAD = 3 -} -export declare function getLineLoadingZoneOfSide(limit: number | undefined, intensity: number | undefined, lineFlowAlertThreshold: number): LineLoadingZone; -export declare function getLineLoadingZone(line: Line, lineFlowAlertThreshold: number): number; -export declare const ArrowSpeed: { - STOPPED: number; - SLOW: number; - MEDIUM: number; - FAST: number; - CRAZY: number; -}; -type LineConnection = { - terminal1Connected: boolean; - terminal2Connected: boolean; -}; -export declare enum LineStatus { - PLANNED_OUTAGE = "PLANNED_OUTAGE", - FORCED_OUTAGE = "FORCED_OUTAGE", - IN_OPERATION = "IN_OPERATION" -} -type LinesStatus = { - operatingStatus: LineStatus; -}; -type CompositeDataLine = { - nominalV: number; - lines: Line[]; - arrows: Arrow[]; - positions: LonLat[]; - cumulativeDistances: number[]; -}; -type ActivePower = { - p: number | undefined; - printPosition: Position; - offset: [number, number]; - line: Line; -}; -type OperatingStatus = { - status: LineStatus; - printPosition: Position; - offset: [number, number]; -}; -export type CompositeData = { - nominalV: number; - mapOriginDestination?: Map>; - lines: Line[]; - lineMap?: Map; - activePower: ActivePower[]; - operatingStatus: OperatingStatus[]; - arrows: Arrow[]; -}; -type _LineLayerProps = { - data: Line[]; - network: MapEquipments; - geoData: GeoData; - getNominalVoltageColor: (voltage: number) => Color; - disconnectedLineColor: Color; - filteredNominalVoltages: number[] | null; - lineFlowMode: LineFlowMode; - lineFlowColorMode: LineFlowColorMode; - lineFlowAlertThreshold: number; - showLineFlow: boolean; - lineFullPath: boolean; - lineParallelPath: boolean; - labelSize: number; - iconSize: number; - distanceBetweenLines: number; - maxParallelOffset: number; - minParallelOffset: number; - substationRadius: number; - substationMaxPixel: number; - minSubstationRadiusPixel: number; - areFlowsValid: boolean; - updatedLines: Line[]; - labelsVisible: boolean; - labelColor: Color; -}; -export type LineLayerProps = _LineLayerProps & CompositeLayerProps; -export declare class LineLayer extends CompositeLayer> { - static layerName: string; - static defaultProps: { - network: null; - geoData: null; - getNominalVoltageColor: { - type: string; - value: number[]; - }; - disconnectedLineColor: { - type: string; - value: number[]; - }; - filteredNominalVoltages: null; - lineFlowMode: LineFlowMode; - lineFlowColorMode: LineFlowColorMode; - lineFlowAlertThreshold: number; - showLineFlow: boolean; - lineFullPath: boolean; - lineParallelPath: boolean; - labelSize: number; - iconSize: number; - distanceBetweenLines: number; - maxParallelOffset: number; - minParallelOffset: number; - substationRadius: { - type: string; - value: number; - }; - substationMaxPixel: { - type: string; - value: number; - }; - minSubstationRadiusPixel: { - type: string; - value: number; - }; - }; - state: { - compositeData: CompositeData[]; - linesConnection: Map; - linesStatus: Map; - }; - initializeState(context: LayerContext): void; - getVoltageLevelIndex(voltageLevelId: string): number | undefined; - updateState({ props, oldProps, changeFlags }: UpdateParameters): void; - genLineKey(line: Line): string; - recomputeParallelLinesIndex(compositeData: CompositeData[], props: this['props']): void; - recomputeForkLines(compositeData: CompositeData[], props: this['props']): void; - getProximityFactor(firstPosition: LonLat, secondPosition: LonLat): number; - computeAngle(props: this['props'], position1: LonLat, position2: LonLat): number; - renderLayers(): Layer<{}>[]; -} -export {}; diff --git a/packages/network-map-layers/dist/network/map-equipments.d.ts b/packages/network-map-layers/dist/network/map-equipments.d.ts deleted file mode 100644 index e928074e..00000000 --- a/packages/network-map-layers/dist/network/map-equipments.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { EQUIPMENT_TYPES, Equipment, Line, Substation, VoltageLevel } from '../utils/equipment-types'; - -export declare class MapEquipments { - substations: Substation[]; - substationsById: Map; - lines: Line[]; - linesById: Map; - tieLines: Line[]; - tieLinesById: Map; - hvdcLines: Line[]; - hvdcLinesById: Map; - voltageLevels: VoltageLevel[]; - voltageLevelsById: Map; - nominalVoltages: number[]; - intlRef: undefined; - constructor(); - newMapEquipmentForUpdate(): MapEquipments; - checkAndGetValues(equipments: Equipment[]): Equipment[]; - completeSubstationsInfos(equipementsToIndex: Substation[]): void; - updateEquipments(currentEquipments: T[], newEquipements: T[], _equipmentType: EQUIPMENT_TYPES): T[]; - updateSubstations(substations: Substation[], fullReload: boolean): void; - completeLinesInfos(equipementsToIndex: Line[]): void; - completeTieLinesInfos(equipementsToIndex: Line[]): void; - updateLines(lines: Line[], fullReload: boolean): void; - updateTieLines(tieLines: Line[], fullReload: boolean): void; - updateHvdcLines(hvdcLines: Line[], fullReload: boolean): void; - completeHvdcLinesInfos(equipementsToIndex: Line[]): void; - removeBranchesOfVoltageLevel(branchesList: Line[], voltageLevelId: string): Line[]; - removeEquipment(equipmentType: EQUIPMENT_TYPES, equipmentId: string): void; - getVoltageLevels(): VoltageLevel[]; - getVoltageLevel(id: string): VoltageLevel | undefined; - getSubstations(): Substation[]; - getSubstation(id: string): Substation | undefined; - getNominalVoltages(): number[]; - getLines(): Line[]; - getLine(id: string): Line | undefined; - getHvdcLines(): Line[]; - getHvdcLine(id: string): Line | undefined; - getTieLines(): Line[]; - getTieLine(id: string): Line | undefined; -} diff --git a/packages/network-map-layers/dist/network/substation-layer.d.ts b/packages/network-map-layers/dist/network/substation-layer.d.ts deleted file mode 100644 index 65d78aaf..00000000 --- a/packages/network-map-layers/dist/network/substation-layer.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Color, CompositeLayer, DefaultProps, LayerContext, UpdateParameters } from '@deck.gl/core'; -import { TextLayer } from '@deck.gl/layers'; -import { Substation, VoltageLevel } from '../utils/equipment-types'; -import { GeoData } from './geo-data'; -import { CompositeData } from './line-layer'; -import { MapEquipments } from './map-equipments'; - -type MetaVoltageLevel = { - nominalVoltageIndex: number; - voltageLevels: VoltageLevel[]; -}; -type MetaVoltageLevelsByNominalVoltage = { - nominalV: number; - metaVoltageLevels: MetaVoltageLevel[]; -}; -export type SubstationLayerProps = { - data: Substation[]; - network: MapEquipments; - geoData: GeoData; - getNominalVoltageColor: (nominalV: number) => Color; - filteredNominalVoltages: number[] | null; - labelsVisible: boolean; - labelColor: Color; - labelSize: number; - getNameOrId: (infos: Substation) => string | null; -}; -export declare class SubstationLayer extends CompositeLayer { - static layerName: string; - static defaultProps: DefaultProps; - state: { - compositeData: CompositeData[]; - metaVoltageLevelsByNominalVoltage?: MetaVoltageLevelsByNominalVoltage[]; - substationsLabels: Substation[]; - }; - initializeState(context: LayerContext): void; - updateState({ props: { data, filteredNominalVoltages, geoData, getNameOrId, network }, oldProps, changeFlags, }: UpdateParameters): void; - renderLayers(): TextLayer[]; -} -export {}; diff --git a/packages/network-map-layers/dist/powsybl-network-map-layers.js b/packages/network-map-layers/dist/powsybl-network-map-layers.js deleted file mode 100644 index 275de495..00000000 --- a/packages/network-map-layers/dist/powsybl-network-map-layers.js +++ /dev/null @@ -1,5548 +0,0 @@ -import { Layer, project32, picking, CompositeLayer } from '@deck.gl/core'; -import { GL } from '@luma.gl/constants'; -import { Model, Geometry } from '@luma.gl/engine'; -import { PathStyleExtension } from '@deck.gl/extensions'; -import { LineLayer as LineLayer$1, PathLayer, TextLayer, IconLayer, ScatterplotLayer } from '@deck.gl/layers'; - -const factors = { - kilometers: 1, - miles: 1000 / 1609.344, - nauticalmiles: 1000 / 1852, - meters: 1000, - metres: 1000, - yards: 1000 / 0.9144, - feet: 1000 / 0.3048, - inches: 1000 / 0.0254 -}; - -// Values that define WGS84 ellipsoid model of the Earth -const RE = 6378.137; // equatorial radius -const FE = 1 / 298.257223563; // flattening - -const E2 = FE * (2 - FE); -const RAD = Math.PI / 180; - -/** - * A collection of very fast approximations to common geodesic measurements. Useful for performance-sensitive code that measures things on a city scale. - * - * @param {number} lat latitude - * @param {string} [units='kilometers'] - * @returns {CheapRuler} - * @example - * const ruler = cheapRuler(35.05, 'miles'); - * //=ruler - */ -class CheapRuler { - /** - * Creates a ruler object from tile coordinates (y and z). - * - * @param {number} y - * @param {number} z - * @param {string} [units='kilometers'] - * @returns {CheapRuler} - * @example - * const ruler = cheapRuler.fromTile(1567, 12); - * //=ruler - */ - static fromTile(y, z, units) { - const n = Math.PI * (1 - 2 * (y + 0.5) / Math.pow(2, z)); - const lat = Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))) / RAD; - return new CheapRuler(lat, units); - } - - /** - * Multipliers for converting between units. - * - * @example - * // convert 50 meters to yards - * 50 * CheapRuler.units.yards / CheapRuler.units.meters; - */ - static get units() { - return factors; - } - - /** - * Creates a ruler instance for very fast approximations to common geodesic measurements around a certain latitude. - * - * @param {number} lat latitude - * @param {string} [units='kilometers'] - * @returns {CheapRuler} - * @example - * const ruler = cheapRuler(35.05, 'miles'); - * //=ruler - */ - constructor(lat, units) { - if (lat === undefined) throw new Error('No latitude given.'); - if (units && !factors[units]) throw new Error(`Unknown unit ${ units }. Use one of: ${ Object.keys(factors).join(', ')}`); - - // Curvature formulas from https://en.wikipedia.org/wiki/Earth_radius#Meridional - const m = RAD * RE * (units ? factors[units] : 1); - const coslat = Math.cos(lat * RAD); - const w2 = 1 / (1 - E2 * (1 - coslat * coslat)); - const w = Math.sqrt(w2); - - // multipliers for converting longitude and latitude degrees into distance - this.kx = m * w * coslat; // based on normal radius of curvature - this.ky = m * w * w2 * (1 - E2); // based on meridonal radius of curvature - } - - /** - * Given two points of the form [longitude, latitude], returns the distance. - * - * @param {Array} a point [longitude, latitude] - * @param {Array} b point [longitude, latitude] - * @returns {number} distance - * @example - * const distance = ruler.distance([30.5, 50.5], [30.51, 50.49]); - * //=distance - */ - distance(a, b) { - const dx = wrap(a[0] - b[0]) * this.kx; - const dy = (a[1] - b[1]) * this.ky; - return Math.sqrt(dx * dx + dy * dy); - } - - /** - * Returns the bearing between two points in angles. - * - * @param {Array} a point [longitude, latitude] - * @param {Array} b point [longitude, latitude] - * @returns {number} bearing - * @example - * const bearing = ruler.bearing([30.5, 50.5], [30.51, 50.49]); - * //=bearing - */ - bearing(a, b) { - const dx = wrap(b[0] - a[0]) * this.kx; - const dy = (b[1] - a[1]) * this.ky; - return Math.atan2(dx, dy) / RAD; - } - - /** - * Returns a new point given distance and bearing from the starting point. - * - * @param {Array} p point [longitude, latitude] - * @param {number} dist distance - * @param {number} bearing - * @returns {Array} point [longitude, latitude] - * @example - * const point = ruler.destination([30.5, 50.5], 0.1, 90); - * //=point - */ - destination(p, dist, bearing) { - const a = bearing * RAD; - return this.offset(p, - Math.sin(a) * dist, - Math.cos(a) * dist); - } - - /** - * Returns a new point given easting and northing offsets (in ruler units) from the starting point. - * - * @param {Array} p point [longitude, latitude] - * @param {number} dx easting - * @param {number} dy northing - * @returns {Array} point [longitude, latitude] - * @example - * const point = ruler.offset([30.5, 50.5], 10, 10); - * //=point - */ - offset(p, dx, dy) { - return [ - p[0] + dx / this.kx, - p[1] + dy / this.ky - ]; - } - - /** - * Given a line (an array of points), returns the total line distance. - * - * @param {Array>} points [longitude, latitude] - * @returns {number} total line distance - * @example - * const length = ruler.lineDistance([ - * [-67.031, 50.458], [-67.031, 50.534], - * [-66.929, 50.534], [-66.929, 50.458] - * ]); - * //=length - */ - lineDistance(points) { - let total = 0; - for (let i = 0; i < points.length - 1; i++) { - total += this.distance(points[i], points[i + 1]); - } - return total; - } - - /** - * Given a polygon (an array of rings, where each ring is an array of points), returns the area. - * - * @param {Array>>} polygon - * @returns {number} area value in the specified units (square kilometers by default) - * @example - * const area = ruler.area([[ - * [-67.031, 50.458], [-67.031, 50.534], [-66.929, 50.534], - * [-66.929, 50.458], [-67.031, 50.458] - * ]]); - * //=area - */ - area(polygon) { - let sum = 0; - - for (let i = 0; i < polygon.length; i++) { - const ring = polygon[i]; - - for (let j = 0, len = ring.length, k = len - 1; j < len; k = j++) { - sum += wrap(ring[j][0] - ring[k][0]) * (ring[j][1] + ring[k][1]) * (i ? -1 : 1); - } - } - - return (Math.abs(sum) / 2) * this.kx * this.ky; - } - - /** - * Returns the point at a specified distance along the line. - * - * @param {Array>} line - * @param {number} dist distance - * @returns {Array} point [longitude, latitude] - * @example - * const point = ruler.along(line, 2.5); - * //=point - */ - along(line, dist) { - let sum = 0; - - if (dist <= 0) return line[0]; - - for (let i = 0; i < line.length - 1; i++) { - const p0 = line[i]; - const p1 = line[i + 1]; - const d = this.distance(p0, p1); - sum += d; - if (sum > dist) return interpolate(p0, p1, (dist - (sum - d)) / d); - } - - return line[line.length - 1]; - } - - /** - * Returns the distance from a point `p` to a line segment `a` to `b`. - * - * @pointToSegmentDistance - * @param {Array} p point [longitude, latitude] - * @param {Array} p1 segment point 1 [longitude, latitude] - * @param {Array} p2 segment point 2 [longitude, latitude] - * @returns {number} distance - * @example - * const distance = ruler.pointToSegmentDistance([-67.04, 50.5], [-67.05, 50.57], [-67.03, 50.54]); - * //=distance - */ - pointToSegmentDistance(p, a, b) { - let [x, y] = a; - let dx = wrap(b[0] - x) * this.kx; - let dy = (b[1] - y) * this.ky; - let t = 0; - - if (dx !== 0 || dy !== 0) { - t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy); - - if (t > 1) { - x = b[0]; - y = b[1]; - - } else if (t > 0) { - x += (dx / this.kx) * t; - y += (dy / this.ky) * t; - } - } - - dx = wrap(p[0] - x) * this.kx; - dy = (p[1] - y) * this.ky; - - return Math.sqrt(dx * dx + dy * dy); - } - - /** - * Returns an object of the form {point, index, t}, where point is closest point on the line - * from the given point, index is the start index of the segment with the closest point, - * and t is a parameter from 0 to 1 that indicates where the closest point is on that segment. - * - * @param {Array>} line - * @param {Array} p point [longitude, latitude] - * @returns {Object} {point, index, t} - * @example - * const point = ruler.pointOnLine(line, [-67.04, 50.5]).point; - * //=point - */ - pointOnLine(line, p) { - let minDist = Infinity; - let minX, minY, minI, minT; - - for (let i = 0; i < line.length - 1; i++) { - - let x = line[i][0]; - let y = line[i][1]; - let dx = wrap(line[i + 1][0] - x) * this.kx; - let dy = (line[i + 1][1] - y) * this.ky; - let t = 0; - - if (dx !== 0 || dy !== 0) { - t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy); - - if (t > 1) { - x = line[i + 1][0]; - y = line[i + 1][1]; - - } else if (t > 0) { - x += (dx / this.kx) * t; - y += (dy / this.ky) * t; - } - } - - dx = wrap(p[0] - x) * this.kx; - dy = (p[1] - y) * this.ky; - - const sqDist = dx * dx + dy * dy; - if (sqDist < minDist) { - minDist = sqDist; - minX = x; - minY = y; - minI = i; - minT = t; - } - } - - return { - point: [minX, minY], - index: minI, - t: Math.max(0, Math.min(1, minT)) - }; - } - - /** - * Returns a part of the given line between the start and the stop points (or their closest points on the line). - * - * @param {Array} start point [longitude, latitude] - * @param {Array} stop point [longitude, latitude] - * @param {Array>} line - * @returns {Array>} line part of a line - * @example - * const line2 = ruler.lineSlice([-67.04, 50.5], [-67.05, 50.56], line1); - * //=line2 - */ - lineSlice(start, stop, line) { - let p1 = this.pointOnLine(line, start); - let p2 = this.pointOnLine(line, stop); - - if (p1.index > p2.index || (p1.index === p2.index && p1.t > p2.t)) { - const tmp = p1; - p1 = p2; - p2 = tmp; - } - - const slice = [p1.point]; - - const l = p1.index + 1; - const r = p2.index; - - if (!equals(line[l], slice[0]) && l <= r) - slice.push(line[l]); - - for (let i = l + 1; i <= r; i++) { - slice.push(line[i]); - } - - if (!equals(line[r], p2.point)) - slice.push(p2.point); - - return slice; - } - - /** - * Returns a part of the given line between the start and the stop points indicated by distance along the line. - * - * @param {number} start distance - * @param {number} stop distance - * @param {Array>} line - * @returns {Array>} line part of a line - * @example - * const line2 = ruler.lineSliceAlong(10, 20, line1); - * //=line2 - */ - lineSliceAlong(start, stop, line) { - let sum = 0; - const slice = []; - - for (let i = 0; i < line.length - 1; i++) { - const p0 = line[i]; - const p1 = line[i + 1]; - const d = this.distance(p0, p1); - - sum += d; - - if (sum > start && slice.length === 0) { - slice.push(interpolate(p0, p1, (start - (sum - d)) / d)); - } - - if (sum >= stop) { - slice.push(interpolate(p0, p1, (stop - (sum - d)) / d)); - return slice; - } - - if (sum > start) slice.push(p1); - } - - return slice; - } - - /** - * Given a point, returns a bounding box object ([w, s, e, n]) created from the given point buffered by a given distance. - * - * @param {Array} p point [longitude, latitude] - * @param {number} buffer - * @returns {Array} box object ([w, s, e, n]) - * @example - * const bbox = ruler.bufferPoint([30.5, 50.5], 0.01); - * //=bbox - */ - bufferPoint(p, buffer) { - const v = buffer / this.ky; - const h = buffer / this.kx; - return [ - p[0] - h, - p[1] - v, - p[0] + h, - p[1] + v - ]; - } - - /** - * Given a bounding box, returns the box buffered by a given distance. - * - * @param {Array} box object ([w, s, e, n]) - * @param {number} buffer - * @returns {Array} box object ([w, s, e, n]) - * @example - * const bbox = ruler.bufferBBox([30.5, 50.5, 31, 51], 0.2); - * //=bbox - */ - bufferBBox(bbox, buffer) { - const v = buffer / this.ky; - const h = buffer / this.kx; - return [ - bbox[0] - h, - bbox[1] - v, - bbox[2] + h, - bbox[3] + v - ]; - } - - /** - * Returns true if the given point is inside in the given bounding box, otherwise false. - * - * @param {Array} p point [longitude, latitude] - * @param {Array} box object ([w, s, e, n]) - * @returns {boolean} - * @example - * const inside = ruler.insideBBox([30.5, 50.5], [30, 50, 31, 51]); - * //=inside - */ - insideBBox(p, bbox) { - return wrap(p[0] - bbox[0]) >= 0 && - wrap(p[0] - bbox[2]) <= 0 && - p[1] >= bbox[1] && - p[1] <= bbox[3]; - } -} - -function equals(a, b) { - return a[0] === b[0] && a[1] === b[1]; -} - -function interpolate(a, b, t) { - const dx = wrap(b[0] - a[0]); - const dy = b[1] - a[1]; - return [ - a[0] + dx * t, - a[1] + dy * t - ]; -} - -// normalize a degree value into [-180..180] range -function wrap(deg) { - while (deg < -180) deg += 360; - while (deg > 180) deg -= 360; - return deg; -} - -var es = {}; - -var computeDestinationPoint$1 = {}; - -var getLatitude$1 = {}; - -var constants = {}; - -Object.defineProperty(constants,"__esModule",{value:true});constants.areaConversion=constants.timeConversion=constants.distanceConversion=constants.altitudeKeys=constants.latitudeKeys=constants.longitudeKeys=constants.MAXLON=constants.MINLON=constants.MAXLAT=constants.MINLAT=constants.earthRadius=constants.sexagesimalPattern=void 0;var sexagesimalPattern=/^([0-9]{1,3})°\s*([0-9]{1,3}(?:\.(?:[0-9]{1,}))?)['′]\s*(([0-9]{1,3}(\.([0-9]{1,}))?)["″]\s*)?([NEOSW]?)$/;constants.sexagesimalPattern=sexagesimalPattern;var earthRadius=6378137;constants.earthRadius=earthRadius;var MINLAT=-90;constants.MINLAT=MINLAT;var MAXLAT=90;constants.MAXLAT=MAXLAT;var MINLON=-180;constants.MINLON=MINLON;var MAXLON=180;constants.MAXLON=MAXLON;var longitudeKeys=["lng","lon","longitude",0];constants.longitudeKeys=longitudeKeys;var latitudeKeys=["lat","latitude",1];constants.latitudeKeys=latitudeKeys;var altitudeKeys=["alt","altitude","elevation","elev",2];constants.altitudeKeys=altitudeKeys;var distanceConversion={m:1,km:0.001,cm:100,mm:1000,mi:1/1609.344,sm:1/1852.216,ft:100/30.48,in:100/2.54,yd:1/0.9144};constants.distanceConversion=distanceConversion;var timeConversion={m:60,h:3600,d:86400};constants.timeConversion=timeConversion;var areaConversion={m2:1,km2:0.000001,ha:0.0001,a:0.01,ft2:10.763911,yd2:1.19599,in2:1550.0031};constants.areaConversion=areaConversion;areaConversion.sqm=areaConversion.m2;areaConversion.sqkm=areaConversion.km2;areaConversion.sqft=areaConversion.ft2;areaConversion.sqyd=areaConversion.yd2;areaConversion.sqin=areaConversion.in2; - -var getCoordinateKey$1 = {}; - -Object.defineProperty(getCoordinateKey$1,"__esModule",{value:true});getCoordinateKey$1.default=void 0;var getCoordinateKey=function getCoordinateKey(point,keysToLookup){return keysToLookup.reduce(function(foundKey,key){if(typeof point==="undefined"||point===null){throw new Error("'".concat(point,"' is no valid coordinate."))}if(Object.prototype.hasOwnProperty.call(point,key)&&typeof key!=="undefined"&&typeof foundKey==="undefined"){foundKey=key;return key}return foundKey},undefined)};var _default$D=getCoordinateKey;getCoordinateKey$1.default=_default$D; - -var toDecimal$1 = {}; - -var isDecimal$1 = {}; - -Object.defineProperty(isDecimal$1,"__esModule",{value:true});isDecimal$1.default=void 0;var isDecimal=function isDecimal(value){var checkedValue=value.toString().trim();if(isNaN(parseFloat(checkedValue))){return false}return parseFloat(checkedValue)===Number(checkedValue)};var _default$C=isDecimal;isDecimal$1.default=_default$C; - -var isSexagesimal$1 = {}; - -Object.defineProperty(isSexagesimal$1,"__esModule",{value:true});isSexagesimal$1.default=void 0;var _constants$e=constants;var isSexagesimal=function isSexagesimal(value){return _constants$e.sexagesimalPattern.test(value.toString().trim())};var _default$B=isSexagesimal;isSexagesimal$1.default=_default$B; - -var sexagesimalToDecimal$1 = {}; - -Object.defineProperty(sexagesimalToDecimal$1,"__esModule",{value:true});sexagesimalToDecimal$1.default=void 0;var _constants$d=constants;var sexagesimalToDecimal=function sexagesimalToDecimal(sexagesimal){var data=new RegExp(_constants$d.sexagesimalPattern).exec(sexagesimal.toString().trim());if(typeof data==="undefined"||data===null){throw new Error("Given value is not in sexagesimal format")}var min=Number(data[2])/60||0;var sec=Number(data[4])/3600||0;var decimal=parseFloat(data[1])+min+sec;return ["S","W"].includes(data[7])?-decimal:decimal};var _default$A=sexagesimalToDecimal;sexagesimalToDecimal$1.default=_default$A; - -var isValidCoordinate$1 = {}; - -var getCoordinateKeys$1 = {}; - -Object.defineProperty(getCoordinateKeys$1,"__esModule",{value:true});getCoordinateKeys$1.default=void 0;var _constants$c=constants;var _getCoordinateKey$2=_interopRequireDefault$q(getCoordinateKey$1);function _interopRequireDefault$q(obj){return obj&&obj.__esModule?obj:{default:obj}}function ownKeys$1(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly)symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable});keys.push.apply(keys,symbols);}return keys}function _objectSpread$1(target){for(var i=1;i1&&arguments[1]!==undefined?arguments[1]:{longitude:_constants$c.longitudeKeys,latitude:_constants$c.latitudeKeys,altitude:_constants$c.altitudeKeys};var longitude=(0, _getCoordinateKey$2.default)(point,keysToLookup.longitude);var latitude=(0, _getCoordinateKey$2.default)(point,keysToLookup.latitude);var altitude=(0, _getCoordinateKey$2.default)(point,keysToLookup.altitude);return _objectSpread$1({latitude:latitude,longitude:longitude},altitude?{altitude:altitude}:{})};var _default$z=getCoordinateKeys;getCoordinateKeys$1.default=_default$z; - -var isValidLatitude$1 = {}; - -Object.defineProperty(isValidLatitude$1,"__esModule",{value:true});isValidLatitude$1.default=void 0;var _isDecimal$2=_interopRequireDefault$p(isDecimal$1);var _isSexagesimal$2=_interopRequireDefault$p(isSexagesimal$1);var _sexagesimalToDecimal$2=_interopRequireDefault$p(sexagesimalToDecimal$1);var _constants$b=constants;function _interopRequireDefault$p(obj){return obj&&obj.__esModule?obj:{default:obj}}var isValidLatitude=function isValidLatitude(value){if((0, _isDecimal$2.default)(value)){if(parseFloat(value)>_constants$b.MAXLAT||value<_constants$b.MINLAT){return false}return true}if((0, _isSexagesimal$2.default)(value)){return isValidLatitude((0, _sexagesimalToDecimal$2.default)(value))}return false};var _default$y=isValidLatitude;isValidLatitude$1.default=_default$y; - -var isValidLongitude$1 = {}; - -Object.defineProperty(isValidLongitude$1,"__esModule",{value:true});isValidLongitude$1.default=void 0;var _isDecimal$1=_interopRequireDefault$o(isDecimal$1);var _isSexagesimal$1=_interopRequireDefault$o(isSexagesimal$1);var _sexagesimalToDecimal$1=_interopRequireDefault$o(sexagesimalToDecimal$1);var _constants$a=constants;function _interopRequireDefault$o(obj){return obj&&obj.__esModule?obj:{default:obj}}var isValidLongitude=function isValidLongitude(value){if((0, _isDecimal$1.default)(value)){if(parseFloat(value)>_constants$a.MAXLON||value<_constants$a.MINLON){return false}return true}if((0, _isSexagesimal$1.default)(value)){return isValidLongitude((0, _sexagesimalToDecimal$1.default)(value))}return false};var _default$x=isValidLongitude;isValidLongitude$1.default=_default$x; - -Object.defineProperty(isValidCoordinate$1,"__esModule",{value:true});isValidCoordinate$1.default=void 0;var _getCoordinateKeys2=_interopRequireDefault$n(getCoordinateKeys$1);var _isValidLatitude=_interopRequireDefault$n(isValidLatitude$1);var _isValidLongitude=_interopRequireDefault$n(isValidLongitude$1);function _interopRequireDefault$n(obj){return obj&&obj.__esModule?obj:{default:obj}}var isValidCoordinate=function isValidCoordinate(point){var _getCoordinateKeys=(0, _getCoordinateKeys2.default)(point),latitude=_getCoordinateKeys.latitude,longitude=_getCoordinateKeys.longitude;if(Array.isArray(point)&&point.length>=2){return (0, _isValidLongitude.default)(point[0])&&(0, _isValidLatitude.default)(point[1])}if(typeof latitude==="undefined"||typeof longitude==="undefined"){return false}var lon=point[longitude];var lat=point[latitude];if(typeof lat==="undefined"||typeof lon==="undefined"){return false}if((0, _isValidLatitude.default)(lat)===false||(0, _isValidLongitude.default)(lon)===false){return false}return true};var _default$w=isValidCoordinate;isValidCoordinate$1.default=_default$w; - -Object.defineProperty(toDecimal$1,"__esModule",{value:true});toDecimal$1.default=void 0;var _isDecimal=_interopRequireDefault$m(isDecimal$1);var _isSexagesimal=_interopRequireDefault$m(isSexagesimal$1);var _sexagesimalToDecimal=_interopRequireDefault$m(sexagesimalToDecimal$1);var _isValidCoordinate=_interopRequireDefault$m(isValidCoordinate$1);var _getCoordinateKeys=_interopRequireDefault$m(getCoordinateKeys$1);function _interopRequireDefault$m(obj){return obj&&obj.__esModule?obj:{default:obj}}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly)symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable});keys.push.apply(keys,symbols);}return keys}function _objectSpread(target){for(var i=1;i3&&arguments[3]!==undefined?arguments[3]:6371000;var lat=(0, _getLatitude$9.default)(start);var lng=(0, _getLongitude$9.default)(start);var delta=distance/radius;var theta=(0, _toRad$7.default)(bearing);var phi1=(0, _toRad$7.default)(lat);var lambda1=(0, _toRad$7.default)(lng);var phi2=Math.asin(Math.sin(phi1)*Math.cos(delta)+Math.cos(phi1)*Math.sin(delta)*Math.cos(theta));var lambda2=lambda1+Math.atan2(Math.sin(theta)*Math.sin(delta)*Math.cos(phi1),Math.cos(delta)-Math.sin(phi1)*Math.sin(phi2));var longitude=(0, _toDeg$4.default)(lambda2);if(longitude<_constants$7.MINLON||longitude>_constants$7.MAXLON){lambda2=(lambda2+3*Math.PI)%(2*Math.PI)-Math.PI;longitude=(0, _toDeg$4.default)(lambda2);}return {latitude:(0, _toDeg$4.default)(phi2),longitude:longitude}};var _default$q=computeDestinationPoint;computeDestinationPoint$1.default=_default$q; - -var convertArea$1 = {}; - -Object.defineProperty(convertArea$1,"__esModule",{value:true});convertArea$1.default=void 0;var _constants$6=constants;var convertArea=function convertArea(squareMeters){var targetUnit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"m";var factor=_constants$6.areaConversion[targetUnit];if(factor){return squareMeters*factor}throw new Error("Invalid unit used for area conversion.")};var _default$p=convertArea;convertArea$1.default=_default$p; - -var convertDistance$1 = {}; - -Object.defineProperty(convertDistance$1,"__esModule",{value:true});convertDistance$1.default=void 0;var _constants$5=constants;var convertDistance=function convertDistance(meters){var targetUnit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"m";var factor=_constants$5.distanceConversion[targetUnit];if(factor){return meters*factor}throw new Error("Invalid unit used for distance conversion.")};var _default$o=convertDistance;convertDistance$1.default=_default$o; - -var convertSpeed$1 = {}; - -Object.defineProperty(convertSpeed$1,"__esModule",{value:true});convertSpeed$1.default=void 0;var _constants$4=constants;var convertSpeed=function convertSpeed(metersPerSecond){var targetUnit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"kmh";switch(targetUnit){case"kmh":return metersPerSecond*_constants$4.timeConversion.h*_constants$4.distanceConversion.km;case"mph":return metersPerSecond*_constants$4.timeConversion.h*_constants$4.distanceConversion.mi;default:return metersPerSecond;}};var _default$n=convertSpeed;convertSpeed$1.default=_default$n; - -var decimalToSexagesimal = {}; - -Object.defineProperty(decimalToSexagesimal,"__esModule",{value:true});decimalToSexagesimal.default=void 0;function _slicedToArray$1(arr,i){return _arrayWithHoles$1(arr)||_iterableToArrayLimit$1(arr,i)||_unsupportedIterableToArray$1(arr,i)||_nonIterableRest$1()}function _nonIterableRest$1(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray$1(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray$1(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(o);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray$1(o,minLen)}function _arrayLikeToArray$1(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i1&&arguments[1]!==undefined?arguments[1]:4;var factor=Math.pow(10,decimals);return Math.round(number*factor)/factor};var decimal2sexagesimalNext=function decimal2sexagesimalNext(decimal){var _decimal$toString$spl=decimal.toString().split("."),_decimal$toString$spl2=_slicedToArray$1(_decimal$toString$spl,2),pre=_decimal$toString$spl2[0],post=_decimal$toString$spl2[1];var deg=Math.abs(Number(pre));var min0=Number("0."+(post||0))*60;var sec0=min0.toString().split(".");var min=Math.floor(min0);var sec=imprecise(Number("0."+(sec0[1]||0))*60).toString();var _sec$split=sec.split("."),_sec$split2=_slicedToArray$1(_sec$split,2),secPreDec=_sec$split2[0],_sec$split2$=_sec$split2[1],secDec=_sec$split2$===void 0?"0":_sec$split2$;return deg+"\xB0 "+min.toString().padStart(2,"0")+"' "+secPreDec.padStart(2,"0")+"."+secDec.padEnd(1,"0")+"\""};var _default$m=decimal2sexagesimalNext;decimalToSexagesimal.default=_default$m; - -var findNearest$1 = {}; - -var orderByDistance$1 = {}; - -var getDistance$2 = {}; - -var robustAcos$1 = {}; - -Object.defineProperty(robustAcos$1,"__esModule",{value:true});robustAcos$1.default=void 0;var robustAcos=function robustAcos(value){if(value>1){return 1}if(value<-1){return -1}return value};var _default$l=robustAcos;robustAcos$1.default=_default$l; - -Object.defineProperty(getDistance$2,"__esModule",{value:true});getDistance$2.default=void 0;var _getLatitude$8=_interopRequireDefault$i(getLatitude$1);var _getLongitude$8=_interopRequireDefault$i(getLongitude$1);var _toRad$6=_interopRequireDefault$i(toRad$1);var _robustAcos$1=_interopRequireDefault$i(robustAcos$1);var _constants$3=constants;function _interopRequireDefault$i(obj){return obj&&obj.__esModule?obj:{default:obj}}var getDistance$1=function getDistance(from,to){var accuracy=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;accuracy=typeof accuracy!=="undefined"&&!isNaN(accuracy)?accuracy:1;var fromLat=(0, _getLatitude$8.default)(from);var fromLon=(0, _getLongitude$8.default)(from);var toLat=(0, _getLatitude$8.default)(to);var toLon=(0, _getLongitude$8.default)(to);var distance=Math.acos((0, _robustAcos$1.default)(Math.sin((0, _toRad$6.default)(toLat))*Math.sin((0, _toRad$6.default)(fromLat))+Math.cos((0, _toRad$6.default)(toLat))*Math.cos((0, _toRad$6.default)(fromLat))*Math.cos((0, _toRad$6.default)(fromLon)-(0, _toRad$6.default)(toLon))))*_constants$3.earthRadius;return Math.round(distance/accuracy)*accuracy};var _default$k=getDistance$1;getDistance$2.default=_default$k; - -Object.defineProperty(orderByDistance$1,"__esModule",{value:true});orderByDistance$1.default=void 0;var _getDistance$5=_interopRequireDefault$h(getDistance$2);function _interopRequireDefault$h(obj){return obj&&obj.__esModule?obj:{default:obj}}var orderByDistance=function orderByDistance(point,coords){var distanceFn=arguments.length>2&&arguments[2]!==undefined?arguments[2]:_getDistance$5.default;distanceFn=typeof distanceFn==="function"?distanceFn:_getDistance$5.default;return coords.slice().sort(function(a,b){return distanceFn(point,a)-distanceFn(point,b)})};var _default$j=orderByDistance;orderByDistance$1.default=_default$j; - -Object.defineProperty(findNearest$1,"__esModule",{value:true});findNearest$1.default=void 0;var _orderByDistance=_interopRequireDefault$g(orderByDistance$1);function _interopRequireDefault$g(obj){return obj&&obj.__esModule?obj:{default:obj}}var findNearest=function findNearest(point,coords){return (0, _orderByDistance.default)(point,coords)[0]};var _default$i=findNearest;findNearest$1.default=_default$i; - -var getAreaOfPolygon$1 = {}; - -Object.defineProperty(getAreaOfPolygon$1,"__esModule",{value:true});getAreaOfPolygon$1.default=void 0;var _toRad$5=_interopRequireDefault$f(toRad$1);var _getLatitude$7=_interopRequireDefault$f(getLatitude$1);var _getLongitude$7=_interopRequireDefault$f(getLongitude$1);var _constants$2=constants;function _interopRequireDefault$f(obj){return obj&&obj.__esModule?obj:{default:obj}}var getAreaOfPolygon=function getAreaOfPolygon(points){var area=0;if(points.length>2){var lowerIndex;var middleIndex;var upperIndex;for(var i=0;iMIN_LAT_RAD&&maxLatMAX_LON_RAD){maxLon-=Math.PI*2;}}else {minLat=Math.max(minLat,MIN_LAT_RAD);maxLat=Math.min(maxLat,MAX_LAT_RAD);minLon=MIN_LON_RAD;maxLon=MAX_LON_RAD;}return [{latitude:(0, _toDeg$3.default)(minLat),longitude:(0, _toDeg$3.default)(minLon)},{latitude:(0, _toDeg$3.default)(maxLat),longitude:(0, _toDeg$3.default)(maxLon)}]};var _default$f=getBoundsOfDistance;getBoundsOfDistance$1.default=_default$f; - -var getCenter$1 = {}; - -Object.defineProperty(getCenter$1,"__esModule",{value:true});getCenter$1.default=void 0;var _getLatitude$4=_interopRequireDefault$c(getLatitude$1);var _getLongitude$4=_interopRequireDefault$c(getLongitude$1);var _toRad$3=_interopRequireDefault$c(toRad$1);var _toDeg$2=_interopRequireDefault$c(toDeg$1);function _interopRequireDefault$c(obj){return obj&&obj.__esModule?obj:{default:obj}}var getCenter=function getCenter(points){if(Array.isArray(points)===false||points.length===0){return false}var numberOfPoints=points.length;var sum=points.reduce(function(acc,point){var pointLat=(0, _toRad$3.default)((0, _getLatitude$4.default)(point));var pointLon=(0, _toRad$3.default)((0, _getLongitude$4.default)(point));return {X:acc.X+Math.cos(pointLat)*Math.cos(pointLon),Y:acc.Y+Math.cos(pointLat)*Math.sin(pointLon),Z:acc.Z+Math.sin(pointLat)}},{X:0,Y:0,Z:0});var X=sum.X/numberOfPoints;var Y=sum.Y/numberOfPoints;var Z=sum.Z/numberOfPoints;return {longitude:(0, _toDeg$2.default)(Math.atan2(Y,X)),latitude:(0, _toDeg$2.default)(Math.atan2(Z,Math.sqrt(X*X+Y*Y)))}};var _default$e=getCenter;getCenter$1.default=_default$e; - -var getCenterOfBounds$1 = {}; - -Object.defineProperty(getCenterOfBounds$1,"__esModule",{value:true});getCenterOfBounds$1.default=void 0;var _getBounds=_interopRequireDefault$b(getBounds$1);function _interopRequireDefault$b(obj){return obj&&obj.__esModule?obj:{default:obj}}var getCenterOfBounds=function getCenterOfBounds(coords){var bounds=(0, _getBounds.default)(coords);var latitude=bounds.minLat+(bounds.maxLat-bounds.minLat)/2;var longitude=bounds.minLng+(bounds.maxLng-bounds.minLng)/2;return {latitude:parseFloat(latitude.toFixed(6)),longitude:parseFloat(longitude.toFixed(6))}};var _default$d=getCenterOfBounds;getCenterOfBounds$1.default=_default$d; - -var getCompassDirection$1 = {}; - -var getRhumbLineBearing$1 = {}; - -Object.defineProperty(getRhumbLineBearing$1,"__esModule",{value:true});getRhumbLineBearing$1.default=void 0;var _getLatitude$3=_interopRequireDefault$a(getLatitude$1);var _getLongitude$3=_interopRequireDefault$a(getLongitude$1);var _toRad$2=_interopRequireDefault$a(toRad$1);var _toDeg$1=_interopRequireDefault$a(toDeg$1);function _interopRequireDefault$a(obj){return obj&&obj.__esModule?obj:{default:obj}}var getRhumbLineBearing=function getRhumbLineBearing(origin,dest){var diffLon=(0, _toRad$2.default)((0, _getLongitude$3.default)(dest))-(0, _toRad$2.default)((0, _getLongitude$3.default)(origin));var diffPhi=Math.log(Math.tan((0, _toRad$2.default)((0, _getLatitude$3.default)(dest))/2+Math.PI/4)/Math.tan((0, _toRad$2.default)((0, _getLatitude$3.default)(origin))/2+Math.PI/4));if(Math.abs(diffLon)>Math.PI){if(diffLon>0){diffLon=(Math.PI*2-diffLon)*-1;}else {diffLon=Math.PI*2+diffLon;}}return ((0, _toDeg$1.default)(Math.atan2(diffLon,diffPhi))+360)%360};var _default$c=getRhumbLineBearing;getRhumbLineBearing$1.default=_default$c; - -Object.defineProperty(getCompassDirection$1,"__esModule",{value:true});getCompassDirection$1.default=void 0;var _getRhumbLineBearing=_interopRequireDefault$9(getRhumbLineBearing$1);function _interopRequireDefault$9(obj){return obj&&obj.__esModule?obj:{default:obj}}var getCompassDirection=function getCompassDirection(origin,dest){var bearingFn=arguments.length>2&&arguments[2]!==undefined?arguments[2]:_getRhumbLineBearing.default;var bearing=typeof bearingFn==="function"?bearingFn(origin,dest):(0, _getRhumbLineBearing.default)(origin,dest);if(isNaN(bearing)){throw new Error("Could not calculate bearing for given points. Check your bearing function")}switch(Math.round(bearing/22.5)){case 1:return "NNE";case 2:return "NE";case 3:return "ENE";case 4:return "E";case 5:return "ESE";case 6:return "SE";case 7:return "SSE";case 8:return "S";case 9:return "SSW";case 10:return "SW";case 11:return "WSW";case 12:return "W";case 13:return "WNW";case 14:return "NW";case 15:return "NNW";default:return "N";}};var _default$b=getCompassDirection;getCompassDirection$1.default=_default$b; - -var getDistanceFromLine$1 = {}; - -Object.defineProperty(getDistanceFromLine$1,"__esModule",{value:true});getDistanceFromLine$1.default=void 0;var _getDistance$4=_interopRequireDefault$8(getDistance$2);var _robustAcos=_interopRequireDefault$8(robustAcos$1);function _interopRequireDefault$8(obj){return obj&&obj.__esModule?obj:{default:obj}}var getDistanceFromLine=function getDistanceFromLine(point,lineStart,lineEnd){var accuracy=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;var d1=(0, _getDistance$4.default)(lineStart,point,accuracy);var d2=(0, _getDistance$4.default)(point,lineEnd,accuracy);var d3=(0, _getDistance$4.default)(lineStart,lineEnd,accuracy);var alpha=Math.acos((0, _robustAcos.default)((d1*d1+d3*d3-d2*d2)/(2*d1*d3)));var beta=Math.acos((0, _robustAcos.default)((d2*d2+d3*d3-d1*d1)/(2*d2*d3)));if(alpha>Math.PI/2){return d1}if(beta>Math.PI/2){return d2}return Math.sin(alpha)*d1};var _default$a=getDistanceFromLine;getDistanceFromLine$1.default=_default$a; - -var getGreatCircleBearing$1 = {}; - -Object.defineProperty(getGreatCircleBearing$1,"__esModule",{value:true});getGreatCircleBearing$1.default=void 0;var _getLatitude$2=_interopRequireDefault$7(getLatitude$1);var _getLongitude$2=_interopRequireDefault$7(getLongitude$1);var _toRad$1=_interopRequireDefault$7(toRad$1);var _toDeg=_interopRequireDefault$7(toDeg$1);function _interopRequireDefault$7(obj){return obj&&obj.__esModule?obj:{default:obj}}var getGreatCircleBearing=function getGreatCircleBearing(origin,dest){var destLat=(0, _getLatitude$2.default)(dest);var detLon=(0, _getLongitude$2.default)(dest);var originLat=(0, _getLatitude$2.default)(origin);var originLon=(0, _getLongitude$2.default)(origin);var bearing=((0, _toDeg.default)(Math.atan2(Math.sin((0, _toRad$1.default)(detLon)-(0, _toRad$1.default)(originLon))*Math.cos((0, _toRad$1.default)(destLat)),Math.cos((0, _toRad$1.default)(originLat))*Math.sin((0, _toRad$1.default)(destLat))-Math.sin((0, _toRad$1.default)(originLat))*Math.cos((0, _toRad$1.default)(destLat))*Math.cos((0, _toRad$1.default)(detLon)-(0, _toRad$1.default)(originLon))))+360)%360;return bearing};var _default$9=getGreatCircleBearing;getGreatCircleBearing$1.default=_default$9; - -var getPathLength$1 = {}; - -Object.defineProperty(getPathLength$1,"__esModule",{value:true});getPathLength$1.default=void 0;var _getDistance$3=_interopRequireDefault$6(getDistance$2);function _interopRequireDefault$6(obj){return obj&&obj.__esModule?obj:{default:obj}}function _typeof(obj){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function _typeof(obj){return typeof obj};}else {_typeof=function _typeof(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};}return _typeof(obj)}var getPathLength=function getPathLength(points){var distanceFn=arguments.length>1&&arguments[1]!==undefined?arguments[1]:_getDistance$3.default;return points.reduce(function(acc,point){if(_typeof(acc)==="object"&&acc.last!==null){acc.distance+=distanceFn(point,acc.last);}acc.last=point;return acc},{last:null,distance:0}).distance};var _default$8=getPathLength;getPathLength$1.default=_default$8; - -var getPreciseDistance = {}; - -Object.defineProperty(getPreciseDistance,"__esModule",{value:true});getPreciseDistance.default=void 0;var _getLatitude$1=_interopRequireDefault$5(getLatitude$1);var _getLongitude$1=_interopRequireDefault$5(getLongitude$1);var _toRad=_interopRequireDefault$5(toRad$1);var _constants=constants;function _interopRequireDefault$5(obj){return obj&&obj.__esModule?obj:{default:obj}}var getDistance=function getDistance(start,end){var accuracy=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;accuracy=typeof accuracy!=="undefined"&&!isNaN(accuracy)?accuracy:1;var startLat=(0, _getLatitude$1.default)(start);var startLon=(0, _getLongitude$1.default)(start);var endLat=(0, _getLatitude$1.default)(end);var endLon=(0, _getLongitude$1.default)(end);var b=6356752.314245;var ellipsoidParams=1/298.257223563;var L=(0, _toRad.default)(endLon-startLon);var cosSigma;var sigma;var sinAlpha;var cosSqAlpha;var cos2SigmaM;var sinSigma;var U1=Math.atan((1-ellipsoidParams)*Math.tan((0, _toRad.default)(parseFloat(startLat))));var U2=Math.atan((1-ellipsoidParams)*Math.tan((0, _toRad.default)(parseFloat(endLat))));var sinU1=Math.sin(U1);var cosU1=Math.cos(U1);var sinU2=Math.sin(U2);var cosU2=Math.cos(U2);var lambda=L;var lambdaP;var iterLimit=100;do{var sinLambda=Math.sin(lambda);var cosLambda=Math.cos(lambda);sinSigma=Math.sqrt(cosU2*sinLambda*(cosU2*sinLambda)+(cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma===0){return 0}cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;sigma=Math.atan2(sinSigma,cosSigma);sinAlpha=cosU1*cosU2*sinLambda/sinSigma;cosSqAlpha=1-sinAlpha*sinAlpha;cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;if(isNaN(cos2SigmaM)){cos2SigmaM=0;}var C=ellipsoidParams/16*cosSqAlpha*(4+ellipsoidParams*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*ellipsoidParams*sinAlpha*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));}while(Math.abs(lambda-lambdaP)>1e-12&&--iterLimit>0);if(iterLimit===0){return NaN}var uSq=cosSqAlpha*(_constants.earthRadius*_constants.earthRadius-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));var distance=b*A*(sigma-deltaSigma);return Math.round(distance/accuracy)*accuracy};var _default$7=getDistance;getPreciseDistance.default=_default$7; - -var getRoughCompassDirection$1 = {}; - -Object.defineProperty(getRoughCompassDirection$1,"__esModule",{value:true});getRoughCompassDirection$1.default=void 0;var getRoughCompassDirection=function getRoughCompassDirection(exact){if(/^(NNE|NE|NNW|N)$/.test(exact)){return "N"}if(/^(ENE|E|ESE|SE)$/.test(exact)){return "E"}if(/^(SSE|S|SSW|SW)$/.test(exact)){return "S"}if(/^(WSW|W|WNW|NW)$/.test(exact)){return "W"}};var _default$6=getRoughCompassDirection;getRoughCompassDirection$1.default=_default$6; - -var getSpeed$1 = {}; - -Object.defineProperty(getSpeed$1,"__esModule",{value:true});getSpeed$1.default=void 0;var _getDistance$2=_interopRequireDefault$4(getDistance$2);function _interopRequireDefault$4(obj){return obj&&obj.__esModule?obj:{default:obj}}var getSpeed=function getSpeed(start,end){var distanceFn=arguments.length>2&&arguments[2]!==undefined?arguments[2]:_getDistance$2.default;var distance=distanceFn(start,end);var time=Number(end.time)-Number(start.time);var metersPerSecond=distance/time*1000;return metersPerSecond};var _default$5=getSpeed;getSpeed$1.default=_default$5; - -var isPointInLine$1 = {}; - -Object.defineProperty(isPointInLine$1,"__esModule",{value:true});isPointInLine$1.default=void 0;var _getDistance$1=_interopRequireDefault$3(getDistance$2);function _interopRequireDefault$3(obj){return obj&&obj.__esModule?obj:{default:obj}}var isPointInLine=function isPointInLine(point,lineStart,lineEnd){return (0, _getDistance$1.default)(lineStart,point)+(0, _getDistance$1.default)(point,lineEnd)===(0, _getDistance$1.default)(lineStart,lineEnd)};var _default$4=isPointInLine;isPointInLine$1.default=_default$4; - -var isPointInPolygon$1 = {}; - -Object.defineProperty(isPointInPolygon$1,"__esModule",{value:true});isPointInPolygon$1.default=void 0;var _getLatitude=_interopRequireDefault$2(getLatitude$1);var _getLongitude=_interopRequireDefault$2(getLongitude$1);function _interopRequireDefault$2(obj){return obj&&obj.__esModule?obj:{default:obj}}var isPointInPolygon=function isPointInPolygon(point,polygon){var isInside=false;var totalPolys=polygon.length;for(var i=-1,j=totalPolys-1;++iarr.length)len=arr.length;for(var i=0,arr2=new Array(len);i { - ArrowDirection2["NONE"] = "none"; - ArrowDirection2["FROM_SIDE_1_TO_SIDE_2"] = "fromSide1ToSide2"; - ArrowDirection2["FROM_SIDE_2_TO_SIDE_1"] = "fromSide2ToSide1"; - return ArrowDirection2; -})(ArrowDirection || {}); -const defaultProps$5 = { - sizeMinPixels: { type: "number", min: 0, value: 0 }, - // min size in pixels - sizeMaxPixels: { type: "number", min: 0, value: Number.MAX_SAFE_INTEGER }, - // max size in pixels - // getDistance: { type: 'accessor', value: (arrow: Arrow) => arrow.distance }, - getLine: { type: "function", value: (arrow) => arrow.line }, - // getLinePositions: { - // type: 'function', - // value: (line: Line) => line.positions, - // }, - getSize: { type: "accessor", value: 1 }, - getColor: { type: "accessor", value: DEFAULT_COLOR }, - getSpeedFactor: { type: "accessor", value: 1 }, - getDirection: { type: "accessor", value: "none" /* NONE */ }, - animated: { type: "boolean", value: true }, - getLineParallelIndex: { type: "accessor", value: 0 }, - getLineAngles: { type: "accessor", value: [0, 0, 0] }, - maxParallelOffset: { type: "number", value: 100 }, - minParallelOffset: { type: "number", value: 3 }, - opacity: { type: "number", value: 1 }, - getDistanceBetweenLines: { type: "accessor", value: 1e3 } -}; -class ArrowLayer extends Layer { - static layerName = "ArrowLayer"; - static defaultProps = defaultProps$5; - getShaders() { - return super.getShaders({ vs, fs, modules: [project32, picking] }); - } - getArrowLineAttributes(arrow) { - const line = this.props.getLine(arrow); - if (!line) { - throw new Error("Invalid line"); - } - const attributes = this.state.lineAttributes.get(line); - if (!attributes) { - throw new Error(`Line ${line.id} not found`); - } - return attributes; - } - initializeState() { - const { device } = this.context; - if (!device.features.has("texture-blend-float-webgl")) { - throw new Error("Arrow layer not supported on this browser"); - } - const maxTextureSize = device.getParametersWebGL( - GL.MAX_TEXTURE_SIZE - ); - this.state = { - maxTextureSize - }; - this.getAttributeManager()?.addInstanced({ - instanceSize: { - size: 1, - type: "float32", - transition: true, - accessor: "getSize", - defaultValue: 1 - }, - instanceColor: { - size: this.props.colorFormat.length, - transition: true, - type: "unorm8", - // normalized: true, - accessor: "getColor", - defaultValue: [0, 0, 0, 255] - }, - instanceSpeedFactor: { - size: 1, - type: "float32", - transition: true, - accessor: "getSpeedFactor", - defaultValue: 1 - }, - instanceArrowDistance: { - size: 1, - transition: true, - accessor: "getDistance", - type: "float32", - defaultValue: 0 - }, - instanceArrowDirection: { - size: 1, - type: "float32", - transition: true, - accessor: "getDirection", - transform: (direction) => { - switch (direction) { - case "none" /* NONE */: - return 0; - case "fromSide1ToSide2" /* FROM_SIDE_1_TO_SIDE_2 */: - return 1; - case "fromSide2ToSide1" /* FROM_SIDE_2_TO_SIDE_1 */: - return 2; - default: - throw new Error("impossible"); - } - }, - defaultValue: 0 - }, - instanceLineDistance: { - size: 1, - transition: true, - type: "float32", - accessor: (arrow) => this.getArrowLineAttributes(arrow).distance - }, - instanceLinePositionsTextureOffset: { - size: 1, - transition: true, - type: "sint32", - accessor: (arrow) => this.getArrowLineAttributes(arrow).positionsTextureOffset - }, - instanceLineDistancesTextureOffset: { - size: 1, - transition: true, - type: "sint32", - accessor: (arrow) => this.getArrowLineAttributes(arrow).distancesTextureOffset - }, - instanceLinePointCount: { - size: 1, - transition: true, - type: "sint32", - accessor: (arrow) => this.getArrowLineAttributes(arrow).pointCount - }, - instanceLineParallelIndex: { - size: 1, - accessor: "getLineParallelIndex", - type: "float32" - }, - instanceLineAngles: { - size: 3, - accessor: "getLineAngles", - type: "float32" - }, - instanceProximityFactors: { - size: 2, - accessor: "getProximityFactors", - //TODO where is it ??? - type: "float32" - }, - instanceDistanceBetweenLines: { - size: 1, - transition: true, - accessor: "getDistanceBetweenLines", - type: "float32", - defaultValue: 1e3 - } - }); - } - finalizeState(context) { - super.finalizeState(context); - this.state.stop = true; - } - createTexture2D(device, data, elementSize, format) { - const start = performance.now(); - const { maxTextureSize } = this.state; - const elementCount = data.length / elementSize; - const width = Math.min(maxTextureSize, elementCount); - const height = Math.ceil(elementCount / width); - if (height > maxTextureSize) { - throw new Error( - `Texture size ${width}*${height} cannot be greater than ${maxTextureSize}` - ); - } - const newLength = width * height * elementSize; - if (data.length < newLength) { - const oldLength = data.length; - data.length = newLength; - data.fill(0, oldLength, newLength); - } - const texture2d = device.createTexture({ - width, - height, - format, - type: GL.FLOAT, - data: new Float32Array(data), - parameters: { - [GL.TEXTURE_MAG_FILTER]: GL.NEAREST, - [GL.TEXTURE_MIN_FILTER]: GL.NEAREST, - [GL.TEXTURE_WRAP_S]: GL.CLAMP_TO_EDGE, - [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE - }, - mipmaps: false - }); - const stop = performance.now(); - console.info( - `Texture of ${newLength} elements (${width} * ${height}) created in ${stop - start} ms` - ); - return texture2d; - } - createTexturesStructure(props) { - const start = performance.now(); - const linePositionsTextureData = []; - const lineDistancesTextureData = []; - const lineAttributes = /* @__PURE__ */ new Map(); - let lineDistance = 0; - const lines = [ - ...new Set(props.data.map((arrow) => this.props.getLine(arrow))) - ]; - lines.forEach((line) => { - const positions = props.getLinePositions(line); - if (!positions) { - throw new Error(`Invalid positions for line ${line.id}`); - } - const linePositionsTextureOffset = linePositionsTextureData.length / 2; - const lineDistancesTextureOffset = lineDistancesTextureData.length; - let linePointCount = 0; - if (positions.length > 0) { - positions.forEach((position) => { - linePositionsTextureData.push(position[0]); - linePositionsTextureData.push(position[1]); - linePointCount++; - }); - lineDistancesTextureData.push(...line.cumulativeDistances); - lineDistance = line.cumulativeDistances[line.cumulativeDistances.length - 1]; - } - if (linePointCount > MAX_LINE_POINT_COUNT) { - throw new Error( - `Too many line point count (${linePointCount}), maximum is ${MAX_LINE_POINT_COUNT}` - ); - } - lineAttributes.set(line, { - distance: lineDistance, - positionsTextureOffset: linePositionsTextureOffset, - distancesTextureOffset: lineDistancesTextureOffset, - pointCount: linePointCount - }); - }); - const stop = performance.now(); - console.info(`Texture data created in ${stop - start} ms`); - return { - linePositionsTextureData, - lineDistancesTextureData, - lineAttributes - }; - } - updateGeometry({ props, changeFlags }) { - const geometryChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getLinePositions); - if (geometryChanged) { - const { device } = this.context; - const { - linePositionsTextureData, - lineDistancesTextureData, - lineAttributes - } = this.createTexturesStructure(props); - const linePositionsTexture = this.createTexture2D( - device, - linePositionsTextureData, - 2, - "rg32float" - //GL.RG32F, - ); - const lineDistancesTexture = this.createTexture2D( - device, - lineDistancesTextureData, - 1, - "r32float" - //GL.R32F, - ); - this.setState({ - linePositionsTexture, - lineDistancesTexture, - lineAttributes - }); - if (!changeFlags.dataChanged) { - this.getAttributeManager()?.invalidateAll(); - } - } - } - updateModel({ changeFlags }) { - if (changeFlags.somethingChanged) { - const { device } = this.context; - const { model } = this.state; - if (model) { - model.destroy(); - } - this.setState({ - model: this._getModel(device) - }); - this.getAttributeManager()?.invalidateAll(); - } - } - updateState(updateParams) { - super.updateState(updateParams); - this.updateGeometry(updateParams); - this.updateModel(updateParams); - const { props, oldProps } = updateParams; - if (props.animated !== oldProps.animated) { - this.setState({ - stop: !props.animated, - timestamp: 0 - }); - if (props.animated) { - this.startAnimation(); - } - } - } - animate(timestamp) { - if (this.state.stop) { - return; - } - this.setState({ - timestamp - }); - this.startAnimation(); - } - startAnimation() { - window.requestAnimationFrame((timestamp) => this.animate(timestamp)); - } - draw({ - uniforms, - renderPass - }) { - const { sizeMinPixels, sizeMaxPixels, opacity } = this.props; - const { - model, - linePositionsTexture, - lineDistancesTexture, - timestamp - // maxTextureSize, - } = this.state; - model.setBindings({ - linePositionsTexture, - lineDistancesTexture - }); - model.setUniforms({ - ...uniforms, - sizeMinPixels, - sizeMaxPixels, - // maxTextureSize, - linePositionsTextureSize: [ - linePositionsTexture.width, - linePositionsTexture.height - ], - opacity, - lineDistancesTextureSize: [ - lineDistancesTexture.width, - lineDistancesTexture.height - ], - timestamp, - maxParallelOffset: this.props.maxParallelOffset, - minParallelOffset: this.props.minParallelOffset - }); - model.draw(renderPass); - } - _getModel(device) { - const positions = [ - -1, - -1, - 0, - 0, - 1, - 0, - 0, - -0.6, - 0, - 1, - -1, - 0, - 0, - 1, - 0, - 0, - -0.6, - 0 - ]; - return new Model( - device, - Object.assign(this.getShaders(), { - id: this.props.id, - bufferLayout: this.getAttributeManager().getBufferLayouts(), - geometry: new Geometry({ - topology: "triangle-list", - vertexCount: 6, - attributes: { - positions: { - size: 3, - value: new Float32Array(positions) - } - } - }), - isInstanced: true - }) - ); - } -} - -const substationPositionByIdIndexer = (map, substation) => { - map.set(substation.id, substation.coordinate); - return map; -}; -const linePositionByIdIndexer = (map, line) => { - map.set(line.id, line.coordinates); - return map; -}; -class GeoData { - substationPositionsById = /* @__PURE__ */ new Map(); - linePositionsById = /* @__PURE__ */ new Map(); - constructor(substationPositionsById, linePositionsById) { - this.substationPositionsById = substationPositionsById; - this.linePositionsById = linePositionsById; - } - setSubstationPositions(positions) { - this.substationPositionsById = positions.reduce( - substationPositionByIdIndexer, - /* @__PURE__ */ new Map() - ); - } - updateSubstationPositions(substationIdsToUpdate, fetchedPositions) { - fetchedPositions.forEach( - (pos) => this.substationPositionsById.set(pos.id, pos.coordinate) - ); - substationIdsToUpdate.filter((id) => !fetchedPositions.map((pos) => pos.id).includes(id)).forEach((id) => this.substationPositionsById.delete(id)); - } - getSubstationPosition(substationId) { - const position = this.substationPositionsById.get(substationId); - if (!position) { - console.warn(`Position not found for ${substationId}`); - return [0, 0]; - } - return [position.lon, position.lat]; - } - setLinePositions(positions) { - this.linePositionsById = positions.reduce( - linePositionByIdIndexer, - /* @__PURE__ */ new Map() - ); - } - updateLinePositions(lineIdsToUpdate, fetchedPositions) { - fetchedPositions.forEach((pos) => { - this.linePositionsById.set(pos.id, pos.coordinates); - }); - lineIdsToUpdate.filter((id) => !fetchedPositions.map((pos) => pos.id).includes(id)).forEach((id) => this.linePositionsById.delete(id)); - } - /** - * Get line positions always ordered from side 1 to side 2. - */ - getLinePositions(network, line, detailed = true) { - const voltageLevel1 = network.getVoltageLevel(line.voltageLevelId1); - if (!voltageLevel1) { - throw new Error( - `Voltage level side 1 '${line.voltageLevelId1}' not found` - ); - } - const voltageLevel2 = network.getVoltageLevel(line.voltageLevelId2); - if (!voltageLevel2) { - throw new Error( - `Voltage level side 2 '${line.voltageLevelId1}' not found` - ); - } - const substationPosition1 = this.getSubstationPosition( - voltageLevel1.substationId - ); - const substationPosition2 = this.getSubstationPosition( - voltageLevel2.substationId - ); - if (substationPosition1[0] === 0 && substationPosition1[1] === 0 || substationPosition2[0] === 0 && substationPosition2[1] === 0) { - return [ - [0, 0], - [0, 0] - ]; - } - if (detailed) { - const linePositions = this.linePositionsById.get(line.id); - if (linePositions) { - const positions = new Array(linePositions.length); - for (const [index, position] of linePositions.entries()) { - positions[index] = [position.lon, position.lat]; - } - return positions; - } - } - return [substationPosition1, substationPosition2]; - } - getLineDistances(positions) { - if (positions !== null && positions.length > 1) { - const cumulativeDistanceArray = [0]; - let cumulativeDistance = 0; - let segmentDistance; - let ruler; - for (let i = 0; i < positions.length - 1; i++) { - ruler = new CheapRuler(positions[i][1], "meters"); - segmentDistance = ruler.lineDistance(positions.slice(i, i + 2)); - cumulativeDistance = cumulativeDistance + segmentDistance; - cumulativeDistanceArray[i + 1] = cumulativeDistance; - } - return cumulativeDistanceArray; - } - return null; - } - /** - * Find the segment in which we reach the wanted distance and return the segment - * along with the remaining distance to travel on this segment to be at the exact wanted distance - * (implemented using a binary search) - */ - findSegment(positions, cumulativeDistances, wantedDistance) { - let lowerBound = 0; - let upperBound = cumulativeDistances.length - 1; - let middlePoint; - while (lowerBound + 1 !== upperBound) { - middlePoint = Math.floor((lowerBound + upperBound) / 2); - const middlePointDistance = cumulativeDistances[middlePoint]; - if (middlePointDistance <= wantedDistance) { - lowerBound = middlePoint; - } else { - upperBound = middlePoint; - } - } - return { - idx: lowerBound, - segment: positions.slice(lowerBound, lowerBound + 2), - remainingDistance: wantedDistance - cumulativeDistances[lowerBound] - }; - } - labelDisplayPosition(positions, cumulativeDistances, arrowPosition, arrowDirection, lineParallelIndex, lineAngle, proximityAngle, distanceBetweenLines, proximityFactor) { - if (arrowPosition > 1 || arrowPosition < 0) { - throw new Error( - "Proportional position value incorrect: " + arrowPosition - ); - } - if (cumulativeDistances === null || cumulativeDistances.length < 2 || cumulativeDistances[cumulativeDistances.length - 1] === 0) { - return null; - } - const lineDistance = cumulativeDistances[cumulativeDistances.length - 1]; - let wantedDistance = lineDistance * arrowPosition; - if (cumulativeDistances.length === 2) { - wantedDistance = wantedDistance - 2 * distanceBetweenLines * arrowPosition * proximityFactor; - } - const goodSegment = this.findSegment( - positions, - cumulativeDistances, - wantedDistance - ); - let multiplier; - switch (arrowDirection) { - case ArrowDirection.FROM_SIDE_2_TO_SIDE_1: - multiplier = 1.005; - break; - case ArrowDirection.FROM_SIDE_1_TO_SIDE_2: - multiplier = 0.995; - break; - case ArrowDirection.NONE: - multiplier = 1; - break; - default: - throw new Error("impossible"); - } - const remainingDistance = goodSegment.remainingDistance * multiplier; - const angle = this.getMapAngle( - goodSegment.segment[0], - goodSegment.segment[1] - ); - const neededOffset = this.getLabelOffset(angle, 20, arrowDirection); - const position = { - position: es.computeDestinationPoint( - goodSegment.segment[0], - remainingDistance, - angle - ), - angle, - offset: neededOffset - }; - position.position = es.computeDestinationPoint( - position.position, - distanceBetweenLines * lineParallelIndex, - lineAngle + 90 - ); - if (cumulativeDistances.length === 2) { - position.position = es.computeDestinationPoint( - position.position, - -distanceBetweenLines * proximityFactor, - lineAngle - ); - } else if (goodSegment.idx === 0 || goodSegment.idx === cumulativeDistances.length - 2) { - const segmentDistance = cumulativeDistances[goodSegment.idx + 1] - cumulativeDistances[goodSegment.idx]; - const alreadyDoneDistance = segmentDistance - remainingDistance; - let labelDistanceInSegment; - if (goodSegment.idx === 0) { - labelDistanceInSegment = -alreadyDoneDistance; - } else { - labelDistanceInSegment = remainingDistance; - } - const labelPercentage = labelDistanceInSegment / segmentDistance; - position.position = es.computeDestinationPoint( - position.position, - distanceBetweenLines * labelPercentage, - proximityAngle - ); - } - return position; - } - getLabelOffset(angle, offsetDistance, arrowDirection) { - const radiantAngle = (-angle + 90) / (180 / Math.PI); - let direction = 0; - switch (arrowDirection) { - case ArrowDirection.FROM_SIDE_2_TO_SIDE_1: - direction = 1; - break; - case ArrowDirection.FROM_SIDE_1_TO_SIDE_2: - direction = -1; - break; - case ArrowDirection.NONE: - direction = 0; - break; - default: - throw new Error("impossible"); - } - return [ - Math.cos(radiantAngle) * offsetDistance * direction, - -Math.sin(radiantAngle) * offsetDistance * direction - ]; - } - //returns the angle between point1 and point2 in degrees [0-360) - getMapAngle(point1, point2) { - let angle = es.getRhumbLineBearing(point1, point2); - const angle2 = es.getGreatCircleBearing(point1, point2); - const coeff = 0.1; - angle = coeff * angle + (1 - coeff) * angle2; - return angle; - } -} - -const SUBSTATION_RADIUS = 500; -const SUBSTATION_RADIUS_MAX_PIXEL = 5; -const SUBSTATION_RADIUS_MIN_PIXEL = 1; - -var react = {exports: {}}; - -var react_production_min = {}; - -/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -var hasRequiredReact_production_min; - -function requireReact_production_min () { - if (hasRequiredReact_production_min) return react_production_min; - hasRequiredReact_production_min = 1; -var l=Symbol.for("react.element"),n=Symbol.for("react.portal"),p=Symbol.for("react.fragment"),q=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),t=Symbol.for("react.provider"),u=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),w=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),z=Symbol.iterator;function A(a){if(null===a||"object"!==typeof a)return null;a=z&&a[z]||a["@@iterator"];return "function"===typeof a?a:null} - var B={isMounted:function(){return !1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B;}E.prototype.isReactComponent={}; - E.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,a,b,"setState");};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate");};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B;}var H=G.prototype=new F; - H.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0}; - function M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=""+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - printWarning('warn', format, args); - } - } - } - function error(format) { - { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - - printWarning('error', format, args); - } - } - } - - function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } // eslint-disable-next-line react-internal/safe-string-coercion - - - var argsWithFormat = args.map(function (item) { - return String(item); - }); // Careful: RN currently depends on this prefix - - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging - - Function.prototype.apply.call(console[level], console, argsWithFormat); - } - } - - var didWarnStateUpdateForUnmountedComponent = {}; - - function warnNoop(publicInstance, callerName) { - { - var _constructor = publicInstance.constructor; - var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; - var warningKey = componentName + "." + callerName; - - if (didWarnStateUpdateForUnmountedComponent[warningKey]) { - return; - } - - error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); - - didWarnStateUpdateForUnmountedComponent[warningKey] = true; - } - } - /** - * This is the abstract API for an update queue. - */ - - - var ReactNoopUpdateQueue = { - /** - * Checks whether or not this composite component is mounted. - * @param {ReactClass} publicInstance The instance we want to test. - * @return {boolean} True if mounted, false otherwise. - * @protected - * @final - */ - isMounted: function (publicInstance) { - return false; - }, - - /** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {?function} callback Called after component is updated. - * @param {?string} callerName name of the calling function in the public API. - * @internal - */ - enqueueForceUpdate: function (publicInstance, callback, callerName) { - warnNoop(publicInstance, 'forceUpdate'); - }, - - /** - * Replaces all of the state. Always use this or `setState` to mutate state. - * You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} completeState Next state. - * @param {?function} callback Called after component is updated. - * @param {?string} callerName name of the calling function in the public API. - * @internal - */ - enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { - warnNoop(publicInstance, 'replaceState'); - }, - - /** - * Sets a subset of the state. This only exists because _pendingState is - * internal. This provides a merging strategy that is not available to deep - * properties which is confusing. TODO: Expose pendingState or don't use it - * during the merge. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} partialState Next partial state to be merged with state. - * @param {?function} callback Called after component is updated. - * @param {?string} Name of the calling function in the public API. - * @internal - */ - enqueueSetState: function (publicInstance, partialState, callback, callerName) { - warnNoop(publicInstance, 'setState'); - } - }; - - var assign = Object.assign; - - var emptyObject = {}; - - { - Object.freeze(emptyObject); - } - /** - * Base class helpers for the updating state of a component. - */ - - - function Component(props, context, updater) { - this.props = props; - this.context = context; // If a component has string refs, we will assign a different object later. - - this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the - // renderer. - - this.updater = updater || ReactNoopUpdateQueue; - } - - Component.prototype.isReactComponent = {}; - /** - * Sets a subset of the state. Always use this to mutate - * state. You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * There is no guarantee that calls to `setState` will run synchronously, - * as they may eventually be batched together. You can provide an optional - * callback that will be executed when the call to setState is actually - * completed. - * - * When a function is provided to setState, it will be called at some point in - * the future (not synchronously). It will be called with the up to date - * component arguments (state, props, context). These values can be different - * from this.* because your function may be called after receiveProps but before - * shouldComponentUpdate, and this new state, props, and context will not yet be - * assigned to this. - * - * @param {object|function} partialState Next partial state or function to - * produce next partial state to be merged with current state. - * @param {?function} callback Called after state is updated. - * @final - * @protected - */ - - Component.prototype.setState = function (partialState, callback) { - if (typeof partialState !== 'object' && typeof partialState !== 'function' && partialState != null) { - throw new Error('setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.'); - } - - this.updater.enqueueSetState(this, partialState, callback, 'setState'); - }; - /** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {?function} callback Called after update is complete. - * @final - * @protected - */ - - - Component.prototype.forceUpdate = function (callback) { - this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); - }; - /** - * Deprecated APIs. These APIs used to exist on classic React classes but since - * we would like to deprecate them, we're not going to move them over to this - * modern base class. Instead, we define a getter that warns if it's accessed. - */ - - - { - var deprecatedAPIs = { - isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], - replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] - }; - - var defineDeprecationWarning = function (methodName, info) { - Object.defineProperty(Component.prototype, methodName, { - get: function () { - warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); - - return undefined; - } - }); - }; - - for (var fnName in deprecatedAPIs) { - if (deprecatedAPIs.hasOwnProperty(fnName)) { - defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); - } - } - } - - function ComponentDummy() {} - - ComponentDummy.prototype = Component.prototype; - /** - * Convenience component with default shallow equality check for sCU. - */ - - function PureComponent(props, context, updater) { - this.props = props; - this.context = context; // If a component has string refs, we will assign a different object later. - - this.refs = emptyObject; - this.updater = updater || ReactNoopUpdateQueue; - } - - var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); - pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. - - assign(pureComponentPrototype, Component.prototype); - pureComponentPrototype.isPureReactComponent = true; - - // an immutable object with a single mutable value - function createRef() { - var refObject = { - current: null - }; - - { - Object.seal(refObject); - } - - return refObject; - } - - var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare - - function isArray(a) { - return isArrayImpl(a); - } - - /* - * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol - * and Temporal.* types. See https://github.com/facebook/react/pull/22064. - * - * The functions in this module will throw an easier-to-understand, - * easier-to-debug exception with a clear errors message message explaining the - * problem. (Instead of a confusing exception thrown inside the implementation - * of the `value` object). - */ - // $FlowFixMe only called in DEV, so void return is not possible. - function typeName(value) { - { - // toStringTag is needed for namespaced types like Temporal.Instant - var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag; - var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; - return type; - } - } // $FlowFixMe only called in DEV, so void return is not possible. - - - function willCoercionThrow(value) { - { - try { - testStringCoercion(value); - return false; - } catch (e) { - return true; - } - } - } - - function testStringCoercion(value) { - // If you ended up here by following an exception call stack, here's what's - // happened: you supplied an object or symbol value to React (as a prop, key, - // DOM attribute, CSS property, string ref, etc.) and when React tried to - // coerce it to a string using `'' + value`, an exception was thrown. - // - // The most common types that will cause this exception are `Symbol` instances - // and Temporal objects like `Temporal.Instant`. But any object that has a - // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this - // exception. (Library authors do this to prevent users from using built-in - // numeric operators like `+` or comparison operators like `>=` because custom - // methods are needed to perform accurate arithmetic or comparison.) - // - // To fix the problem, coerce this object or symbol value to a string before - // passing it to React. The most reliable way is usually `String(value)`. - // - // To find which value is throwing, check the browser or debugger console. - // Before this exception was thrown, there should be `console.error` output - // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the - // problem and how that type was used: key, atrribute, input value prop, etc. - // In most cases, this console output also shows the component and its - // ancestor components where the exception happened. - // - // eslint-disable-next-line react-internal/safe-string-coercion - return '' + value; - } - function checkKeyStringCoercion(value) { - { - if (willCoercionThrow(value)) { - error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value)); - - return testStringCoercion(value); // throw (to help callers find troubleshooting comments) - } - } - } - - function getWrappedName(outerType, innerType, wrapperName) { - var displayName = outerType.displayName; - - if (displayName) { - return displayName; - } - - var functionName = innerType.displayName || innerType.name || ''; - return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName; - } // Keep in sync with react-reconciler/getComponentNameFromFiber - - - function getContextName(type) { - return type.displayName || 'Context'; - } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead. - - - function getComponentNameFromType(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; - } - - { - if (typeof type.tag === 'number') { - error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.'); - } - } - - if (typeof type === 'function') { - return type.displayName || type.name || null; - } - - if (typeof type === 'string') { - return type; - } - - switch (type) { - case REACT_FRAGMENT_TYPE: - return 'Fragment'; - - case REACT_PORTAL_TYPE: - return 'Portal'; - - case REACT_PROFILER_TYPE: - return 'Profiler'; - - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; - - case REACT_SUSPENSE_TYPE: - return 'Suspense'; - - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; - - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + '.Consumer'; - - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + '.Provider'; - - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); - - case REACT_MEMO_TYPE: - var outerName = type.displayName || null; - - if (outerName !== null) { - return outerName; - } - - return getComponentNameFromType(type.type) || 'Memo'; - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - return getComponentNameFromType(init(payload)); - } catch (x) { - return null; - } - } - - // eslint-disable-next-line no-fallthrough - } - } - - return null; - } - - var hasOwnProperty = Object.prototype.hasOwnProperty; - - var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true - }; - var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; - - { - didWarnAboutStringRefs = {}; - } - - function hasValidRef(config) { - { - if (hasOwnProperty.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.ref !== undefined; - } - - function hasValidKey(config) { - { - if (hasOwnProperty.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.key !== undefined; - } - - function defineKeyPropWarningGetter(props, displayName) { - var warnAboutAccessingKey = function () { - { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - - error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - } - }; - - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); - } - - function defineRefPropWarningGetter(props, displayName) { - var warnAboutAccessingRef = function () { - { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - - error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - } - }; - - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); - } - - function warnIfStringRefCannotBeAutoConverted(config) { - { - if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { - var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); - - if (!didWarnAboutStringRefs[componentName]) { - error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); - - didWarnAboutStringRefs[componentName] = true; - } - } - } - } - /** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, instanceof check - * will not work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} props - * @param {*} key - * @param {string|object} ref - * @param {*} owner - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @internal - */ - - - var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allows us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - // Record the component responsible for creating this element. - _owner: owner - }; - - { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. - - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); // self and source are DEV only properties. - - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. - - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - - return element; - }; - /** - * Create and return a new ReactElement of the given type. - * See https://reactjs.org/docs/react-api.html#createelement - */ - - function createElement(type, config, children) { - var propName; // Reserved names are extracted - - var props = {}; - var key = null; - var ref = null; - var self = null; - var source = null; - - if (config != null) { - if (hasValidRef(config)) { - ref = config.ref; - - { - warnIfStringRefCannotBeAutoConverted(config); - } - } - - if (hasValidKey(config)) { - { - checkKeyStringCoercion(config.key); - } - - key = '' + config.key; - } - - self = config.__self === undefined ? null : config.__self; - source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object - - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } - } // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. - - - var childrenLength = arguments.length - 2; - - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - - { - if (Object.freeze) { - Object.freeze(childArray); - } - } - - props.children = childArray; - } // Resolve default props - - - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; - } - } - } - - { - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - } - - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); - } - function cloneAndReplaceKey(oldElement, newKey) { - var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); - return newElement; - } - /** - * Clone and return a new ReactElement using element as the starting point. - * See https://reactjs.org/docs/react-api.html#cloneelement - */ - - function cloneElement(element, config, children) { - if (element === null || element === undefined) { - throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); - } - - var propName; // Original props are copied - - var props = assign({}, element.props); // Reserved names are extracted - - var key = element.key; - var ref = element.ref; // Self is preserved since the owner is preserved. - - var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a - // transpiler, and the original source is probably a better indicator of the - // true owner. - - var source = element._source; // Owner will be preserved, unless ref is overridden - - var owner = element._owner; - - if (config != null) { - if (hasValidRef(config)) { - // Silently steal the ref from the parent. - ref = config.ref; - owner = ReactCurrentOwner.current; - } - - if (hasValidKey(config)) { - { - checkKeyStringCoercion(config.key); - } - - key = '' + config.key; - } // Remaining properties override existing props - - - var defaultProps; - - if (element.type && element.type.defaultProps) { - defaultProps = element.type.defaultProps; - } - - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - if (config[propName] === undefined && defaultProps !== undefined) { - // Resolve default props - props[propName] = defaultProps[propName]; - } else { - props[propName] = config[propName]; - } - } - } - } // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. - - - var childrenLength = arguments.length - 2; - - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - - props.children = childArray; - } - - return ReactElement(element.type, key, ref, self, source, owner, props); - } - /** - * Verifies the object is a ReactElement. - * See https://reactjs.org/docs/react-api.html#isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a ReactElement. - * @final - */ - - function isValidElement(object) { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; - } - - var SEPARATOR = '.'; - var SUBSEPARATOR = ':'; - /** - * Escape and wrap key so it is safe to use as a reactid - * - * @param {string} key to be escaped. - * @return {string} the escaped key. - */ - - function escape(key) { - var escapeRegex = /[=:]/g; - var escaperLookup = { - '=': '=0', - ':': '=2' - }; - var escapedString = key.replace(escapeRegex, function (match) { - return escaperLookup[match]; - }); - return '$' + escapedString; - } - /** - * TODO: Test that a single child and an array with one item have the same key - * pattern. - */ - - - var didWarnAboutMaps = false; - var userProvidedKeyEscapeRegex = /\/+/g; - - function escapeUserProvidedKey(text) { - return text.replace(userProvidedKeyEscapeRegex, '$&/'); - } - /** - * Generate a key string that identifies a element within a set. - * - * @param {*} element A element that could contain a manual key. - * @param {number} index Index that is used if a manual key is not provided. - * @return {string} - */ - - - function getElementKey(element, index) { - // Do some typechecking here since we call this blindly. We want to ensure - // that we don't block potential future ES APIs. - if (typeof element === 'object' && element !== null && element.key != null) { - // Explicit key - { - checkKeyStringCoercion(element.key); - } - - return escape('' + element.key); - } // Implicit key determined by the index in the set - - - return index.toString(36); - } - - function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { - var type = typeof children; - - if (type === 'undefined' || type === 'boolean') { - // All of the above are perceived as null. - children = null; - } - - var invokeCallback = false; - - if (children === null) { - invokeCallback = true; - } else { - switch (type) { - case 'string': - case 'number': - invokeCallback = true; - break; - - case 'object': - switch (children.$$typeof) { - case REACT_ELEMENT_TYPE: - case REACT_PORTAL_TYPE: - invokeCallback = true; - } - - } - } - - if (invokeCallback) { - var _child = children; - var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array - // so that it's consistent if the number of children grows: - - var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; - - if (isArray(mappedChild)) { - var escapedChildKey = ''; - - if (childKey != null) { - escapedChildKey = escapeUserProvidedKey(childKey) + '/'; - } - - mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { - return c; - }); - } else if (mappedChild != null) { - if (isValidElement(mappedChild)) { - { - // The `if` statement here prevents auto-disabling of the safe - // coercion ESLint rule, so we must manually disable it below. - // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key - if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) { - checkKeyStringCoercion(mappedChild.key); - } - } - - mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as - // traverseAllChildren used to do for objects as children - escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key - mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number - // eslint-disable-next-line react-internal/safe-string-coercion - escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); - } - - array.push(mappedChild); - } - - return 1; - } - - var child; - var nextName; - var subtreeCount = 0; // Count of children found in the current subtree. - - var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; - - if (isArray(children)) { - for (var i = 0; i < children.length; i++) { - child = children[i]; - nextName = nextNamePrefix + getElementKey(child, i); - subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); - } - } else { - var iteratorFn = getIteratorFn(children); - - if (typeof iteratorFn === 'function') { - var iterableChildren = children; - - { - // Warn about using Maps as children - if (iteratorFn === iterableChildren.entries) { - if (!didWarnAboutMaps) { - warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); - } - - didWarnAboutMaps = true; - } - } - - var iterator = iteratorFn.call(iterableChildren); - var step; - var ii = 0; - - while (!(step = iterator.next()).done) { - child = step.value; - nextName = nextNamePrefix + getElementKey(child, ii++); - subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); - } - } else if (type === 'object') { - // eslint-disable-next-line react-internal/safe-string-coercion - var childrenString = String(children); - throw new Error("Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.'); - } - } - - return subtreeCount; - } - - /** - * Maps children that are typically specified as `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenmap - * - * The provided mapFunction(child, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} func The map function. - * @param {*} context Context for mapFunction. - * @return {object} Object containing the ordered map of results. - */ - function mapChildren(children, func, context) { - if (children == null) { - return children; - } - - var result = []; - var count = 0; - mapIntoArray(children, result, '', '', function (child) { - return func.call(context, child, count++); - }); - return result; - } - /** - * Count the number of children that are typically specified as - * `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrencount - * - * @param {?*} children Children tree container. - * @return {number} The number of children. - */ - - - function countChildren(children) { - var n = 0; - mapChildren(children, function () { - n++; // Don't return anything - }); - return n; - } - - /** - * Iterates through children that are typically specified as `props.children`. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenforeach - * - * The provided forEachFunc(child, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} forEachFunc - * @param {*} forEachContext Context for forEachContext. - */ - function forEachChildren(children, forEachFunc, forEachContext) { - mapChildren(children, function () { - forEachFunc.apply(this, arguments); // Don't return anything. - }, forEachContext); - } - /** - * Flatten a children object (typically specified as `props.children`) and - * return an array with appropriately re-keyed children. - * - * See https://reactjs.org/docs/react-api.html#reactchildrentoarray - */ - - - function toArray(children) { - return mapChildren(children, function (child) { - return child; - }) || []; - } - /** - * Returns the first child in a collection of children and verifies that there - * is only one child in the collection. - * - * See https://reactjs.org/docs/react-api.html#reactchildrenonly - * - * The current implementation of this function assumes that a single child gets - * passed without a wrapper, but the purpose of this helper function is to - * abstract away the particular structure of children. - * - * @param {?object} children Child collection structure. - * @return {ReactElement} The first and only `ReactElement` contained in the - * structure. - */ - - - function onlyChild(children) { - if (!isValidElement(children)) { - throw new Error('React.Children.only expected to receive a single React element child.'); - } - - return children; - } - - function createContext(defaultValue) { - // TODO: Second argument used to be an optional `calculateChangedBits` - // function. Warn to reserve for future use? - var context = { - $$typeof: REACT_CONTEXT_TYPE, - // As a workaround to support multiple concurrent renderers, we categorize - // some renderers as primary and others as secondary. We only expect - // there to be two concurrent renderers at most: React Native (primary) and - // Fabric (secondary); React DOM (primary) and React ART (secondary). - // Secondary renderers store their context values on separate fields. - _currentValue: defaultValue, - _currentValue2: defaultValue, - // Used to track how many concurrent renderers this context currently - // supports within in a single renderer. Such as parallel server rendering. - _threadCount: 0, - // These are circular - Provider: null, - Consumer: null, - // Add these to use same hidden class in VM as ServerContext - _defaultValue: null, - _globalName: null - }; - context.Provider = { - $$typeof: REACT_PROVIDER_TYPE, - _context: context - }; - var hasWarnedAboutUsingNestedContextConsumers = false; - var hasWarnedAboutUsingConsumerProvider = false; - var hasWarnedAboutDisplayNameOnConsumer = false; - - { - // A separate object, but proxies back to the original context object for - // backwards compatibility. It has a different $$typeof, so we can properly - // warn for the incorrect usage of Context as a Consumer. - var Consumer = { - $$typeof: REACT_CONTEXT_TYPE, - _context: context - }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here - - Object.defineProperties(Consumer, { - Provider: { - get: function () { - if (!hasWarnedAboutUsingConsumerProvider) { - hasWarnedAboutUsingConsumerProvider = true; - - error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); - } - - return context.Provider; - }, - set: function (_Provider) { - context.Provider = _Provider; - } - }, - _currentValue: { - get: function () { - return context._currentValue; - }, - set: function (_currentValue) { - context._currentValue = _currentValue; - } - }, - _currentValue2: { - get: function () { - return context._currentValue2; - }, - set: function (_currentValue2) { - context._currentValue2 = _currentValue2; - } - }, - _threadCount: { - get: function () { - return context._threadCount; - }, - set: function (_threadCount) { - context._threadCount = _threadCount; - } - }, - Consumer: { - get: function () { - if (!hasWarnedAboutUsingNestedContextConsumers) { - hasWarnedAboutUsingNestedContextConsumers = true; - - error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); - } - - return context.Consumer; - } - }, - displayName: { - get: function () { - return context.displayName; - }, - set: function (displayName) { - if (!hasWarnedAboutDisplayNameOnConsumer) { - warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); - - hasWarnedAboutDisplayNameOnConsumer = true; - } - } - } - }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty - - context.Consumer = Consumer; - } - - { - context._currentRenderer = null; - context._currentRenderer2 = null; - } - - return context; - } - - var Uninitialized = -1; - var Pending = 0; - var Resolved = 1; - var Rejected = 2; - - function lazyInitializer(payload) { - if (payload._status === Uninitialized) { - var ctor = payload._result; - var thenable = ctor(); // Transition to the next state. - // This might throw either because it's missing or throws. If so, we treat it - // as still uninitialized and try again next time. Which is the same as what - // happens if the ctor or any wrappers processing the ctor throws. This might - // end up fixing it if the resolution was a concurrency bug. - - thenable.then(function (moduleObject) { - if (payload._status === Pending || payload._status === Uninitialized) { - // Transition to the next state. - var resolved = payload; - resolved._status = Resolved; - resolved._result = moduleObject; - } - }, function (error) { - if (payload._status === Pending || payload._status === Uninitialized) { - // Transition to the next state. - var rejected = payload; - rejected._status = Rejected; - rejected._result = error; - } - }); - - if (payload._status === Uninitialized) { - // In case, we're still uninitialized, then we're waiting for the thenable - // to resolve. Set it as pending in the meantime. - var pending = payload; - pending._status = Pending; - pending._result = thenable; - } - } - - if (payload._status === Resolved) { - var moduleObject = payload._result; - - { - if (moduleObject === undefined) { - error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. - 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))\n\n" + 'Did you accidentally put curly braces around the import?', moduleObject); - } - } - - { - if (!('default' in moduleObject)) { - error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. - 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); - } - } - - return moduleObject.default; - } else { - throw payload._result; - } - } - - function lazy(ctor) { - var payload = { - // We use these fields to store the result. - _status: Uninitialized, - _result: ctor - }; - var lazyType = { - $$typeof: REACT_LAZY_TYPE, - _payload: payload, - _init: lazyInitializer - }; - - { - // In production, this would just set it on the object. - var defaultProps; - var propTypes; // $FlowFixMe - - Object.defineProperties(lazyType, { - defaultProps: { - configurable: true, - get: function () { - return defaultProps; - }, - set: function (newDefaultProps) { - error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); - - defaultProps = newDefaultProps; // Match production behavior more closely: - // $FlowFixMe - - Object.defineProperty(lazyType, 'defaultProps', { - enumerable: true - }); - } - }, - propTypes: { - configurable: true, - get: function () { - return propTypes; - }, - set: function (newPropTypes) { - error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); - - propTypes = newPropTypes; // Match production behavior more closely: - // $FlowFixMe - - Object.defineProperty(lazyType, 'propTypes', { - enumerable: true - }); - } - } - }); - } - - return lazyType; - } - - function forwardRef(render) { - { - if (render != null && render.$$typeof === REACT_MEMO_TYPE) { - error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); - } else if (typeof render !== 'function') { - error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); - } else { - if (render.length !== 0 && render.length !== 2) { - error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); - } - } - - if (render != null) { - if (render.defaultProps != null || render.propTypes != null) { - error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); - } - } - } - - var elementType = { - $$typeof: REACT_FORWARD_REF_TYPE, - render: render - }; - - { - var ownName; - Object.defineProperty(elementType, 'displayName', { - enumerable: false, - configurable: true, - get: function () { - return ownName; - }, - set: function (name) { - ownName = name; // The inner component shouldn't inherit this display name in most cases, - // because the component may be used elsewhere. - // But it's nice for anonymous functions to inherit the name, - // so that our component-stack generation logic will display their frames. - // An anonymous function generally suggests a pattern like: - // React.forwardRef((props, ref) => {...}); - // This kind of inner function is not used elsewhere so the side effect is okay. - - if (!render.name && !render.displayName) { - render.displayName = name; - } - } - }); - } - - return elementType; - } - - var REACT_MODULE_REFERENCE; - - { - REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); - } - - function isValidElementType(type) { - if (typeof type === 'string' || typeof type === 'function') { - return true; - } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). - - - if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) { - return true; - } - - if (typeof type === 'object' && type !== null) { - if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object - // types supported by any Flight configuration anywhere since - // we don't know which Flight build this will end up being used - // with. - type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { - return true; - } - } - - return false; - } - - function memo(type, compare) { - { - if (!isValidElementType(type)) { - error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); - } - } - - var elementType = { - $$typeof: REACT_MEMO_TYPE, - type: type, - compare: compare === undefined ? null : compare - }; - - { - var ownName; - Object.defineProperty(elementType, 'displayName', { - enumerable: false, - configurable: true, - get: function () { - return ownName; - }, - set: function (name) { - ownName = name; // The inner component shouldn't inherit this display name in most cases, - // because the component may be used elsewhere. - // But it's nice for anonymous functions to inherit the name, - // so that our component-stack generation logic will display their frames. - // An anonymous function generally suggests a pattern like: - // React.memo((props) => {...}); - // This kind of inner function is not used elsewhere so the side effect is okay. - - if (!type.name && !type.displayName) { - type.displayName = name; - } - } - }); - } - - return elementType; - } - - function resolveDispatcher() { - var dispatcher = ReactCurrentDispatcher.current; - - { - if (dispatcher === null) { - error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.'); - } - } // Will result in a null access error if accessed outside render phase. We - // intentionally don't throw our own error because this is in a hot path. - // Also helps ensure this is inlined. - - - return dispatcher; - } - function useContext(Context) { - var dispatcher = resolveDispatcher(); - - { - // TODO: add a more generic warning for invalid values. - if (Context._context !== undefined) { - var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs - // and nobody should be using this in existing code. - - if (realContext.Consumer === Context) { - error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); - } else if (realContext.Provider === Context) { - error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); - } - } - } - - return dispatcher.useContext(Context); - } - function useState(initialState) { - var dispatcher = resolveDispatcher(); - return dispatcher.useState(initialState); - } - function useReducer(reducer, initialArg, init) { - var dispatcher = resolveDispatcher(); - return dispatcher.useReducer(reducer, initialArg, init); - } - function useRef(initialValue) { - var dispatcher = resolveDispatcher(); - return dispatcher.useRef(initialValue); - } - function useEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useEffect(create, deps); - } - function useInsertionEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useInsertionEffect(create, deps); - } - function useLayoutEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useLayoutEffect(create, deps); - } - function useCallback(callback, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useCallback(callback, deps); - } - function useMemo(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useMemo(create, deps); - } - function useImperativeHandle(ref, create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useImperativeHandle(ref, create, deps); - } - function useDebugValue(value, formatterFn) { - { - var dispatcher = resolveDispatcher(); - return dispatcher.useDebugValue(value, formatterFn); - } - } - function useTransition() { - var dispatcher = resolveDispatcher(); - return dispatcher.useTransition(); - } - function useDeferredValue(value) { - var dispatcher = resolveDispatcher(); - return dispatcher.useDeferredValue(value); - } - function useId() { - var dispatcher = resolveDispatcher(); - return dispatcher.useId(); - } - function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { - var dispatcher = resolveDispatcher(); - return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); - } - - // Helpers to patch console.logs to avoid logging during side-effect free - // replaying on render function. This currently only patches the object - // lazily which won't cover if the log function was extracted eagerly. - // We could also eagerly patch the method. - var disabledDepth = 0; - var prevLog; - var prevInfo; - var prevWarn; - var prevError; - var prevGroup; - var prevGroupCollapsed; - var prevGroupEnd; - - function disabledLog() {} - - disabledLog.__reactDisabledLog = true; - function disableLogs() { - { - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 - - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - /* eslint-enable react-internal/no-production-logging */ - } - - disabledDepth++; - } - } - function reenableLogs() { - { - disabledDepth--; - - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - var props = { - configurable: true, - enumerable: true, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - log: assign({}, props, { - value: prevLog - }), - info: assign({}, props, { - value: prevInfo - }), - warn: assign({}, props, { - value: prevWarn - }), - error: assign({}, props, { - value: prevError - }), - group: assign({}, props, { - value: prevGroup - }), - groupCollapsed: assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: assign({}, props, { - value: prevGroupEnd - }) - }); - /* eslint-enable react-internal/no-production-logging */ - } - - if (disabledDepth < 0) { - error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); - } - } - } - - var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; - var prefix; - function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === undefined) { - // Extract the VM specific prefix used by each line. - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ''; - } - } // We use the prefix to ensure our stacks line up with native stack frames. - - - return '\n' + prefix + name; - } - } - var reentry = false; - var componentFrameCache; - - { - var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); - } - - function describeNativeComponentFrame(fn, construct) { - // If something asked for a stack inside a fake render, it should get ignored. - if ( !fn || reentry) { - return ''; - } - - { - var frame = componentFrameCache.get(fn); - - if (frame !== undefined) { - return frame; - } - } - - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. - - Error.prepareStackTrace = undefined; - var previousDispatcher; - - { - previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function - // for warnings. - - ReactCurrentDispatcher$1.current = null; - disableLogs(); - } - - try { - // This should throw. - if (construct) { - // Something should be setting the props in the constructor. - var Fake = function () { - throw Error(); - }; // $FlowFixMe - - - Object.defineProperty(Fake.prototype, 'props', { - set: function () { - // We use a throwing setter instead of frozen or non-writable props - // because that won't throw in a non-strict mode function. - throw Error(); - } - }); - - if (typeof Reflect === 'object' && Reflect.construct) { - // We construct a different control for this case to include any extra - // frames added by the construct call. - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - - fn(); - } - } catch (sample) { - // This is inlined manually because closure doesn't do it for us. - if (sample && control && typeof sample.stack === 'string') { - // This extracts the first frame from the sample that isn't also in the control. - // Skipping one frame that we assume is the frame that calls the two. - var sampleLines = sample.stack.split('\n'); - var controlLines = control.stack.split('\n'); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - // We expect at least one stack frame to be shared. - // Typically this will be the root most one. However, stack frames may be - // cut off due to maximum stack limits. In this case, one maybe cut off - // earlier than the other. We assume that the sample is longer or the same - // and there for cut off earlier. So we should find the root most frame in - // the sample somewhere in the control. - c--; - } - - for (; s >= 1 && c >= 0; s--, c--) { - // Next we find the first one that isn't the same which should be the - // frame that called our sample function and the control. - if (sampleLines[s] !== controlLines[c]) { - // In V8, the first line is describing the message but other VMs don't. - // If we're about to return the first line, and the control is also on the same - // line, that's a pretty good indicator that our sample threw at same line as - // the control. I.e. before we entered the sample frame. So we ignore this result. - // This can happen if you passed a class to function component, or non-function. - if (s !== 1 || c !== 1) { - do { - s--; - c--; // We may still have similar intermediate frames from the construct call. - // The next one that isn't the same should be our match though. - - if (c < 0 || sampleLines[s] !== controlLines[c]) { - // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. - var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "" - // but we have a user-provided "displayName" - // splice it in to make the stack more readable. - - - if (fn.displayName && _frame.includes('')) { - _frame = _frame.replace('', fn.displayName); - } - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, _frame); - } - } // Return the line we found. - - - return _frame; - } - } while (s >= 1 && c >= 0); - } - - break; - } - } - } - } finally { - reentry = false; - - { - ReactCurrentDispatcher$1.current = previousDispatcher; - reenableLogs(); - } - - Error.prepareStackTrace = previousPrepareStackTrace; - } // Fallback to just using the name if we couldn't make it throw. - - - var name = fn ? fn.displayName || fn.name : ''; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, syntheticFrame); - } - } - - return syntheticFrame; - } - function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); - } - } - - function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); - } - - function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - - if (type == null) { - return ''; - } - - if (typeof type === 'function') { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - - if (typeof type === 'string') { - return describeBuiltInComponentFrame(type); - } - - switch (type) { - case REACT_SUSPENSE_TYPE: - return describeBuiltInComponentFrame('Suspense'); - - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame('SuspenseList'); - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - - case REACT_MEMO_TYPE: - // Memo may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - // Lazy may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) {} - } - } - } - - return ''; - } - - var loggedTypeFailures = {}; - var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - - function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame$1.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame$1.setExtraStackFrame(null); - } - } - } - - function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - // $FlowFixMe This is okay but Flow doesn't know it. - var has = Function.call.bind(hasOwnProperty); - - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - // eslint-disable-next-line react-internal/prod-error-codes - var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); - err.name = 'Invariant Violation'; - throw err; - } - - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); - } catch (ex) { - error$1 = ex; - } - - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - - error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); - - setCurrentlyValidatingElement(null); - } - - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - - error('Failed %s type: %s', location, error$1.message); - - setCurrentlyValidatingElement(null); - } - } - } - } - } - - function setCurrentlyValidatingElement$1(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - setExtraStackFrame(stack); - } else { - setExtraStackFrame(null); - } - } - } - - var propTypesMisspellWarningShown; - - { - propTypesMisspellWarningShown = false; - } - - function getDeclarationErrorAddendum() { - if (ReactCurrentOwner.current) { - var name = getComponentNameFromType(ReactCurrentOwner.current.type); - - if (name) { - return '\n\nCheck the render method of `' + name + '`.'; - } - } - - return ''; - } - - function getSourceInfoErrorAddendum(source) { - if (source !== undefined) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; - } - - return ''; - } - - function getSourceInfoErrorAddendumForProps(elementProps) { - if (elementProps !== null && elementProps !== undefined) { - return getSourceInfoErrorAddendum(elementProps.__source); - } - - return ''; - } - /** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ - - - var ownerHasKeyUseWarning = {}; - - function getCurrentComponentErrorInfo(parentType) { - var info = getDeclarationErrorAddendum(); - - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; - } - } - - return info; - } - /** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ - - - function validateExplicitKey(element, parentType) { - if (!element._store || element._store.validated || element.key != null) { - return; - } - - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; - } - - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. - - var childOwner = ''; - - if (element && element._owner && element._owner !== ReactCurrentOwner.current) { - // Give the component that originally created this child. - childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; - } - - { - setCurrentlyValidatingElement$1(element); - - error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); - - setCurrentlyValidatingElement$1(null); - } - } - /** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ - - - function validateChildKeys(node, parentType) { - if (typeof node !== 'object') { - return; - } - - if (isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - - if (isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - - if (typeof iteratorFn === 'function') { - // Entry iterators used to provide implicit keys, - // but now we print a separate warning for them later. - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } - } - } - /** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ - - - function validatePropTypes(element) { - { - var type = element.type; - - if (type === null || type === undefined || typeof type === 'string') { - return; - } - - var propTypes; - - if (typeof type === 'function') { - propTypes = type.propTypes; - } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. - // Inner props are checked in the reconciler. - type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - - if (propTypes) { - // Intentionally inside to avoid triggering lazy initializers: - var name = getComponentNameFromType(type); - checkPropTypes(propTypes, element.props, 'prop', name, element); - } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: - - var _name = getComponentNameFromType(type); - - error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); - } - - if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { - error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); - } - } - } - /** - * Given a fragment, validate that it can only be provided with fragment props - * @param {ReactElement} fragment - */ - - - function validateFragmentProps(fragment) { - { - var keys = Object.keys(fragment.props); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - - if (key !== 'children' && key !== 'key') { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - - setCurrentlyValidatingElement$1(null); - break; - } - } - - if (fragment.ref !== null) { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid attribute `ref` supplied to `React.Fragment`.'); - - setCurrentlyValidatingElement$1(null); - } - } - } - function createElementWithValidation(type, props, children) { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. - - if (!validType) { - var info = ''; - - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; - } - - var sourceInfo = getSourceInfoErrorAddendumForProps(props); - - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - - var typeString; - - if (type === null) { - typeString = 'null'; - } else if (isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentNameFromType(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; - } - - { - error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); - } - } - - var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. - - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) - - - if (validType) { - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], type); - } - } - - if (type === REACT_FRAGMENT_TYPE) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } - - return element; - } - var didWarnAboutDeprecatedCreateFactory = false; - function createFactoryWithValidation(type) { - var validatedFactory = createElementWithValidation.bind(null, type); - validatedFactory.type = type; - - { - if (!didWarnAboutDeprecatedCreateFactory) { - didWarnAboutDeprecatedCreateFactory = true; - - warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); - } // Legacy hook: remove it - - - Object.defineProperty(validatedFactory, 'type', { - enumerable: false, - get: function () { - warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); - - Object.defineProperty(this, 'type', { - value: type - }); - return type; - } - }); - } - - return validatedFactory; - } - function cloneElementWithValidation(element, props, children) { - var newElement = cloneElement.apply(this, arguments); - - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], newElement.type); - } - - validatePropTypes(newElement); - return newElement; - } - - function startTransition(scope, options) { - var prevTransition = ReactCurrentBatchConfig.transition; - ReactCurrentBatchConfig.transition = {}; - var currentTransition = ReactCurrentBatchConfig.transition; - - { - ReactCurrentBatchConfig.transition._updatedFibers = new Set(); - } - - try { - scope(); - } finally { - ReactCurrentBatchConfig.transition = prevTransition; - - { - if (prevTransition === null && currentTransition._updatedFibers) { - var updatedFibersCount = currentTransition._updatedFibers.size; - - if (updatedFibersCount > 10) { - warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.'); - } - - currentTransition._updatedFibers.clear(); - } - } - } - } - - var didWarnAboutMessageChannel = false; - var enqueueTaskImpl = null; - function enqueueTask(task) { - if (enqueueTaskImpl === null) { - try { - // read require off the module object to get around the bundlers. - // we don't want them to detect a require and bundle a Node polyfill. - var requireString = ('require' + Math.random()).slice(0, 7); - var nodeRequire = module && module[requireString]; // assuming we're in node, let's try to get node's - // version of setImmediate, bypassing fake timers if any. - - enqueueTaskImpl = nodeRequire.call(module, 'timers').setImmediate; - } catch (_err) { - // we're in a browser - // we can't use regular timers because they may still be faked - // so we try MessageChannel+postMessage instead - enqueueTaskImpl = function (callback) { - { - if (didWarnAboutMessageChannel === false) { - didWarnAboutMessageChannel = true; - - if (typeof MessageChannel === 'undefined') { - error('This browser does not have a MessageChannel implementation, ' + 'so enqueuing tasks via await act(async () => ...) will fail. ' + 'Please file an issue at https://github.com/facebook/react/issues ' + 'if you encounter this warning.'); - } - } - } - - var channel = new MessageChannel(); - channel.port1.onmessage = callback; - channel.port2.postMessage(undefined); - }; - } - } - - return enqueueTaskImpl(task); - } - - var actScopeDepth = 0; - var didWarnNoAwaitAct = false; - function act(callback) { - { - // `act` calls can be nested, so we track the depth. This represents the - // number of `act` scopes on the stack. - var prevActScopeDepth = actScopeDepth; - actScopeDepth++; - - if (ReactCurrentActQueue.current === null) { - // This is the outermost `act` scope. Initialize the queue. The reconciler - // will detect the queue and use it instead of Scheduler. - ReactCurrentActQueue.current = []; - } - - var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; - var result; - - try { - // Used to reproduce behavior of `batchedUpdates` in legacy mode. Only - // set to `true` while the given callback is executed, not for updates - // triggered during an async event, because this is how the legacy - // implementation of `act` behaved. - ReactCurrentActQueue.isBatchingLegacy = true; - result = callback(); // Replicate behavior of original `act` implementation in legacy mode, - // which flushed updates immediately after the scope function exits, even - // if it's an async function. - - if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) { - var queue = ReactCurrentActQueue.current; - - if (queue !== null) { - ReactCurrentActQueue.didScheduleLegacyUpdate = false; - flushActQueue(queue); - } - } - } catch (error) { - popActScope(prevActScopeDepth); - throw error; - } finally { - ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; - } - - if (result !== null && typeof result === 'object' && typeof result.then === 'function') { - var thenableResult = result; // The callback is an async function (i.e. returned a promise). Wait - // for it to resolve before exiting the current scope. - - var wasAwaited = false; - var thenable = { - then: function (resolve, reject) { - wasAwaited = true; - thenableResult.then(function (returnValue) { - popActScope(prevActScopeDepth); - - if (actScopeDepth === 0) { - // We've exited the outermost act scope. Recursively flush the - // queue until there's no remaining work. - recursivelyFlushAsyncActWork(returnValue, resolve, reject); - } else { - resolve(returnValue); - } - }, function (error) { - // The callback threw an error. - popActScope(prevActScopeDepth); - reject(error); - }); - } - }; - - { - if (!didWarnNoAwaitAct && typeof Promise !== 'undefined') { - // eslint-disable-next-line no-undef - Promise.resolve().then(function () {}).then(function () { - if (!wasAwaited) { - didWarnNoAwaitAct = true; - - error('You called act(async () => ...) without await. ' + 'This could lead to unexpected testing behaviour, ' + 'interleaving multiple act calls and mixing their ' + 'scopes. ' + 'You should - await act(async () => ...);'); - } - }); - } - } - - return thenable; - } else { - var returnValue = result; // The callback is not an async function. Exit the current scope - // immediately, without awaiting. - - popActScope(prevActScopeDepth); - - if (actScopeDepth === 0) { - // Exiting the outermost act scope. Flush the queue. - var _queue = ReactCurrentActQueue.current; - - if (_queue !== null) { - flushActQueue(_queue); - ReactCurrentActQueue.current = null; - } // Return a thenable. If the user awaits it, we'll flush again in - // case additional work was scheduled by a microtask. - - - var _thenable = { - then: function (resolve, reject) { - // Confirm we haven't re-entered another `act` scope, in case - // the user does something weird like await the thenable - // multiple times. - if (ReactCurrentActQueue.current === null) { - // Recursively flush the queue until there's no remaining work. - ReactCurrentActQueue.current = []; - recursivelyFlushAsyncActWork(returnValue, resolve, reject); - } else { - resolve(returnValue); - } - } - }; - return _thenable; - } else { - // Since we're inside a nested `act` scope, the returned thenable - // immediately resolves. The outer scope will flush the queue. - var _thenable2 = { - then: function (resolve, reject) { - resolve(returnValue); - } - }; - return _thenable2; - } - } - } - } - - function popActScope(prevActScopeDepth) { - { - if (prevActScopeDepth !== actScopeDepth - 1) { - error('You seem to have overlapping act() calls, this is not supported. ' + 'Be sure to await previous act() calls before making a new one. '); - } - - actScopeDepth = prevActScopeDepth; - } - } - - function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { - { - var queue = ReactCurrentActQueue.current; - - if (queue !== null) { - try { - flushActQueue(queue); - enqueueTask(function () { - if (queue.length === 0) { - // No additional work was scheduled. Finish. - ReactCurrentActQueue.current = null; - resolve(returnValue); - } else { - // Keep flushing work until there's none left. - recursivelyFlushAsyncActWork(returnValue, resolve, reject); - } - }); - } catch (error) { - reject(error); - } - } else { - resolve(returnValue); - } - } - } - - var isFlushing = false; - - function flushActQueue(queue) { - { - if (!isFlushing) { - // Prevent re-entrance. - isFlushing = true; - var i = 0; - - try { - for (; i < queue.length; i++) { - var callback = queue[i]; - - do { - callback = callback(true); - } while (callback !== null); - } - - queue.length = 0; - } catch (error) { - // If something throws, leave the remaining callbacks on the queue. - queue = queue.slice(i + 1); - throw error; - } finally { - isFlushing = false; - } - } - } - } - - var createElement$1 = createElementWithValidation ; - var cloneElement$1 = cloneElementWithValidation ; - var createFactory = createFactoryWithValidation ; - var Children = { - map: mapChildren, - forEach: forEachChildren, - count: countChildren, - toArray: toArray, - only: onlyChild - }; - - exports.Children = Children; - exports.Component = Component; - exports.Fragment = REACT_FRAGMENT_TYPE; - exports.Profiler = REACT_PROFILER_TYPE; - exports.PureComponent = PureComponent; - exports.StrictMode = REACT_STRICT_MODE_TYPE; - exports.Suspense = REACT_SUSPENSE_TYPE; - exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; - exports.act = act; - exports.cloneElement = cloneElement$1; - exports.createContext = createContext; - exports.createElement = createElement$1; - exports.createFactory = createFactory; - exports.createRef = createRef; - exports.forwardRef = forwardRef; - exports.isValidElement = isValidElement; - exports.lazy = lazy; - exports.memo = memo; - exports.startTransition = startTransition; - exports.unstable_act = act; - exports.useCallback = useCallback; - exports.useContext = useContext; - exports.useDebugValue = useDebugValue; - exports.useDeferredValue = useDeferredValue; - exports.useEffect = useEffect; - exports.useId = useId; - exports.useImperativeHandle = useImperativeHandle; - exports.useInsertionEffect = useInsertionEffect; - exports.useLayoutEffect = useLayoutEffect; - exports.useMemo = useMemo; - exports.useReducer = useReducer; - exports.useRef = useRef; - exports.useState = useState; - exports.useSyncExternalStore = useSyncExternalStore; - exports.useTransition = useTransition; - exports.version = ReactVersion; - /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ - if ( - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === - 'function' - ) { - __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); - } - - })(); - } - } (react_development, react_development.exports)); - return react_development.exports; -} - -if (process.env.NODE_ENV === 'production') { - react.exports = requireReact_production_min(); -} else { - react.exports = requireReact_development(); -} - -var reactExports = react.exports; - -const SvgBoltBlack24Dp = (props) => /* @__PURE__ */ reactExports.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", enableBackground: "new 0 0 24 24", height: "24px", viewBox: "0 0 24 24", width: "24px", fill: "#000000", ...props }, /* @__PURE__ */ reactExports.createElement("g", null, /* @__PURE__ */ reactExports.createElement("rect", { fill: "none", height: 24, width: 24 })), /* @__PURE__ */ reactExports.createElement("g", null, /* @__PURE__ */ reactExports.createElement("path", { d: "M11,21h-1l1-7H7.5c-0.88,0-0.33-0.75-0.31-0.78C8.48,10.94,10.42,7.54,13.01,3h1l-1,7h3.51c0.4,0,0.62,0.19,0.4,0.66 C12.97,17.55,11,21,11,21z" }))); - -const SvgLockBlack24Dp = (props) => /* @__PURE__ */ reactExports.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24px", viewBox: "0 0 24 24", width: "24px", fill: "#000000", ...props }, /* @__PURE__ */ reactExports.createElement("g", { fill: "none" }, /* @__PURE__ */ reactExports.createElement("path", { d: "M0 0h24v24H0V0z" }), /* @__PURE__ */ reactExports.createElement("path", { d: "M0 0h24v24H0V0z", opacity: 0.87 })), /* @__PURE__ */ reactExports.createElement("path", { d: "M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z" })); - -function getNominalVoltageColor(nominalVoltage) { - if (nominalVoltage >= 300) { - return [255, 0, 0]; - } else if (nominalVoltage >= 170 && nominalVoltage < 300) { - return [34, 139, 34]; - } else if (nominalVoltage >= 120 && nominalVoltage < 170) { - return [1, 175, 175]; - } else if (nominalVoltage >= 70 && nominalVoltage < 120) { - return [204, 85, 0]; - } else if (nominalVoltage >= 50 && nominalVoltage < 70) { - return [160, 32, 240]; - } else if (nominalVoltage >= 30 && nominalVoltage < 50) { - return [255, 130, 144]; - } else { - return [171, 175, 40]; - } -} -const INVALID_FLOW_OPACITY = 0.2; - -const defaultProps$4 = { - getLineParallelIndex: { type: "accessor", value: 0 }, - getLineAngle: { type: "accessor", value: 0 }, - distanceBetweenLines: { type: "number", value: 1e3 }, - maxParallelOffset: { type: "number", value: 100 }, - minParallelOffset: { type: "number", value: 3 }, - substationRadius: { type: "number", value: 500 }, - substationMaxPixel: { type: "number", value: 5 }, - minSubstationRadiusPixel: { type: "number", value: 1 } -}; -class ForkLineLayer extends LineLayer$1 { - static layerName = "ForkLineLayer"; - static defaultProps = defaultProps$4; - // declare state: LineLayer['state']; - getShaders() { - const shaders = super.getShaders(); - shaders.inject = { - "vs:#decl": ` -in float instanceLineParallelIndex; -in float instanceLineAngle; -in float instanceOffsetStart; -in float instanceProximityFactor; -uniform float distanceBetweenLines; -uniform float maxParallelOffset; -uniform float minParallelOffset; -uniform float substationRadius; -uniform float substationMaxPixel; -uniform float minSubstationRadiusPixel; - `, - "float segmentIndex = positions.x": `; - target = source ; - float offsetPixels = clamp(project_size_to_pixel( distanceBetweenLines), minParallelOffset, maxParallelOffset ); - float offsetCommonSpace = project_pixel_size(offsetPixels); - - float offsetSubstation = clamp(project_size_to_pixel(substationRadius*instanceOffsetStart ), - minSubstationRadiusPixel, - substationMaxPixel * instanceOffsetStart ); - float offsetSubstationCommonSpace = project_pixel_size(offsetSubstation) ; - - vec4 trans = vec4(cos(instanceLineAngle), -sin(instanceLineAngle ), 0, 0.) * instanceLineParallelIndex; - - trans.x -= sin(instanceLineAngle) * instanceProximityFactor; - trans.y -= cos(instanceLineAngle) * instanceProximityFactor; - - source+=project_common_position_to_clipspace(trans * (offsetSubstationCommonSpace / sqrt(trans.x*trans.x+trans.y*trans.y))) - project_uCenter; - target+=project_common_position_to_clipspace(trans * offsetCommonSpace) - project_uCenter; - - ` - }; - return shaders; - } - initializeState() { - super.initializeState(); - this.getAttributeManager()?.addInstanced({ - instanceLineParallelIndex: { - size: 1, - type: "float32", - accessor: "getLineParallelIndex" - }, - instanceLineAngle: { - size: 1, - type: "float32", - accessor: "getLineAngle" - }, - instanceOffsetStart: { - size: 1, - type: "float32", - accessor: "getSubstationOffset" - }, - instanceProximityFactor: { - size: 1, - type: "float32", - accessor: "getProximityFactor" - } - }); - } - draw({ - uniforms - }) { - super.draw({ - uniforms: { - ...uniforms, - distanceBetweenLines: this.props.getDistanceBetweenLines, - maxParallelOffset: this.props.getMaxParallelOffset, - minParallelOffset: this.props.getMinParallelOffset, - substationRadius: this.props.getSubstationRadius, - substationMaxPixel: this.props.getSubstationMaxPixel, - minSubstationRadiusPixel: this.props.getMinSubstationRadiusPixel - } - }); - } -} - -const defaultProps$3 = { - getLineParallelIndex: { type: "accessor", value: 0 }, - getLineAngle: { type: "accessor", value: 0 }, - distanceBetweenLines: { type: "number", value: 1e3 }, - maxParallelOffset: { type: "number", value: 100 }, - minParallelOffset: { type: "number", value: 3 } -}; -class ParallelPathLayer extends PathLayer { - static layerName = "ParallelPathLayer"; - static defaultProps = defaultProps$3; - getShaders() { - const shaders = super.getShaders(); - shaders.inject = Object.assign({}, shaders.inject, { - "vs:#decl": shaders.inject["vs:#decl"] + `//Note: with the following attribute, we have reached the limit (16 on most platforms) of the number of attributes. -// with webgl2, this might be raised in the future to 32 on most platforms... -// The PathLayer that this class extends already uses 13 attributes (and 15 with the dash extension). -// we have packed all our attributes together in a single attribute to -// workaround the low limit of the number of vertex attrbutes... -// To pack the attributes, for now we use a very simple system. If needed, we can change it to a more efficient packing. -// We just add an extra float to the line angles vec3. The -// extra float contains the previous attributes: -// parallelIndex (an half integer, between -15.5 and +15.5 (32 lines max..)) -// proximityFactors (two floats, between 0 and 1) -// -// To simplify further, we use only positive integers for -// this extra float, ie values only from 0 to 2^24. For parallelIndex, we encode the half integers from -15.5 to 15.5 -// to 0..62, which fits in 6 bits. -// For proximityFactors, We switch from floating to a fixed precision of 9 bits -// without the 0 (ie multiples of 512: 1/512, 2/512, ..., 1). -// So in the 24 bits of the integer value of the float, we have 6 bits of parallel index, -// 9 bits of proximity factor start, 9 bits of proximity factor end, for a total of 24 bits. -//Note2: packing the attributes together, in addition to not beeing very readable, -// also has the downside that you can't update one attribute and reconstruct -// only its buffer, so it hurts performance a bit in this case. -// But this is a rare case for us (changing parameters) so it doesn't matter much. -in vec4 instanceExtraAttributes; -uniform float distanceBetweenLines; -uniform float maxParallelOffset; -uniform float minParallelOffset; -`, - "vs:#main-end": shaders.inject["vs:#main-end"] + ` -bool isSegmentEnd = isEnd > EPSILON; -bool isFirstSegment = (instanceTypes == 1.0 || instanceTypes == 3.0); -bool isLastSegment = (instanceTypes == 2.0 || instanceTypes == 3.0); - -float instanceLineAngle = instanceExtraAttributes[1]; -if ( !isSegmentEnd && isFirstSegment ){ - instanceLineAngle = instanceExtraAttributes[0]; -} -else if ( isSegmentEnd && isLastSegment){ - instanceLineAngle = instanceExtraAttributes[2]; -} -float instanceLineParallelIndex = (mod(instanceExtraAttributes[3], 64.0) - 31.0) / 2.0; - -float offsetPixels = clamp(project_size_to_pixel(distanceBetweenLines), minParallelOffset, maxParallelOffset); -float offsetCommonSpace = project_pixel_size(offsetPixels); -vec4 trans = vec4(cos(instanceLineAngle), -sin(instanceLineAngle), 0, 0.) * instanceLineParallelIndex; - -if(isSegmentEnd && isLastSegment) { - float pf = (mod(instanceExtraAttributes[3] / 64.0, 512.0) + 1.0) / 512.0; - trans.x += sin(instanceLineAngle) * pf ; - trans.y += cos(instanceLineAngle) * pf; -} -else if (!isSegmentEnd && isFirstSegment) -{ - float pf = (mod(instanceExtraAttributes[3] / 32768.0, 512.0) + 1.0) / 512.0; - trans.x -= sin(instanceLineAngle) * pf; - trans.y -= cos(instanceLineAngle) * pf; -} - -trans = trans * offsetCommonSpace; -gl_Position += project_common_position_to_clipspace(trans) - project_uCenter; -` - }); - return shaders; - } - initializeState() { - super.initializeState(); - this.getAttributeManager()?.addInstanced({ - // too much instances variables need to compact some... - instanceExtraAttributes: { - size: 4, - type: "float32", - accessor: "getExtraAttributes" - } - }); - } - draw({ - uniforms - }) { - super.draw({ - uniforms: { - ...uniforms, - distanceBetweenLines: this.props.distanceBetweenLines, - maxParallelOffset: this.props.maxParallelOffset, - minParallelOffset: this.props.minParallelOffset - } - }); - } -} - -const DISTANCE_BETWEEN_ARROWS = 1e4; -const START_ARROW_POSITION = 0.1; -const END_ARROW_POSITION = 0.9; -var LineFlowMode = /* @__PURE__ */ ((LineFlowMode2) => { - LineFlowMode2["STATIC_ARROWS"] = "staticArrows"; - LineFlowMode2["ANIMATED_ARROWS"] = "animatedArrows"; - LineFlowMode2["FEEDERS"] = "feeders"; - return LineFlowMode2; -})(LineFlowMode || {}); -var LineFlowColorMode = /* @__PURE__ */ ((LineFlowColorMode2) => { - LineFlowColorMode2["NOMINAL_VOLTAGE"] = "nominalVoltage"; - LineFlowColorMode2["OVERLOADS"] = "overloads"; - return LineFlowColorMode2; -})(LineFlowColorMode || {}); -const noDashArray = [0, 0]; -const dashArray = [15, 10]; -function doDash(lineConnection) { - return !lineConnection.terminal1Connected || !lineConnection.terminal2Connected; -} -function getArrowDirection(p) { - if (p < 0) { - return ArrowDirection.FROM_SIDE_2_TO_SIDE_1; - } else if (p > 0) { - return ArrowDirection.FROM_SIDE_1_TO_SIDE_2; - } else { - return ArrowDirection.NONE; - } -} -function getLineLoadingZoneOfSide(limit, intensity, lineFlowAlertThreshold) { - if (limit === void 0 || intensity === void 0 || intensity === 0) { - return 0 /* UNKNOWN */; - } else { - const threshold = lineFlowAlertThreshold * limit / 100; - if (intensity > 0 && intensity < threshold) { - return 1 /* SAFE */; - } else if (intensity >= threshold && intensity < limit) { - return 2 /* WARNING */; - } else { - return 3 /* OVERLOAD */; - } - } -} -function getLineLoadingZone(line, lineFlowAlertThreshold) { - const zone1 = getLineLoadingZoneOfSide( - line.currentLimits1?.permanentLimit, - line.i1, - lineFlowAlertThreshold - ); - const zone2 = getLineLoadingZoneOfSide( - line.currentLimits2?.permanentLimit, - line.i2, - lineFlowAlertThreshold - ); - return Math.max(zone1, zone2); -} -function getLineLoadingZoneColor(zone) { - if (zone === 0 /* UNKNOWN */) { - return [128, 128, 128]; - } else if (zone === 1 /* SAFE */) { - return [107, 178, 40]; - } else if (zone === 2 /* WARNING */) { - return [210, 179, 63]; - } else if (zone === 3 /* OVERLOAD */) { - return [255, 0, 0]; - } else { - throw new Error("Unsupported line loading zone: " + zone); - } -} -function getLineColor(line, nominalVoltageColor, props, lineConnection) { - if (props.lineFlowColorMode === "nominalVoltage" /* NOMINAL_VOLTAGE */) { - if (!lineConnection || !lineConnection.terminal1Connected && !lineConnection.terminal2Connected) { - return props.disconnectedLineColor; - } else { - return nominalVoltageColor; - } - } else if (props.lineFlowColorMode === "overloads" /* OVERLOADS */) { - const zone = getLineLoadingZone(line, props.lineFlowAlertThreshold); - return getLineLoadingZoneColor(zone); - } else { - return nominalVoltageColor; - } -} -function getLineIcon(lineStatus) { - return { - url: lineStatus === "PLANNED_OUTAGE" ? SvgLockBlack24Dp : lineStatus === "FORCED_OUTAGE" ? SvgBoltBlack24Dp : void 0, - height: 24, - width: 24, - mask: true - }; -} -const ArrowSpeed = { - STOPPED: 0, - SLOW: 1, - MEDIUM: 2, - FAST: 3, - CRAZY: 4 -}; -function getArrowSpeedOfSide(limit, intensity) { - if (limit === void 0 || intensity === void 0 || intensity === 0) { - return ArrowSpeed.STOPPED; - } else { - if (intensity > 0 && intensity < limit / 3) { - return ArrowSpeed.SLOW; - } else if (intensity >= limit / 3 && intensity < limit * 2 / 3) { - return ArrowSpeed.MEDIUM; - } else if (intensity >= limit * 2 / 3 && intensity < limit) { - return ArrowSpeed.FAST; - } else { - return ArrowSpeed.CRAZY; - } - } -} -function getArrowSpeed(line) { - const speed1 = getArrowSpeedOfSide( - line.currentLimits1?.permanentLimit, - line.i1 - ); - const speed2 = getArrowSpeedOfSide( - line.currentLimits2?.permanentLimit, - line.i2 - ); - return Math.max(speed1, speed2); -} -function getArrowSpeedFactor(speed) { - switch (speed) { - case ArrowSpeed.STOPPED: - return 0; - case ArrowSpeed.SLOW: - return 0.5; - case ArrowSpeed.MEDIUM: - return 2; - case ArrowSpeed.FAST: - return 4; - case ArrowSpeed.CRAZY: - return 10; - default: - throw new Error("Unknown arrow speed: " + speed); - } -} -const defaultProps$2 = { - network: null, - geoData: null, - getNominalVoltageColor: { type: "accessor", value: [255, 255, 255] }, - disconnectedLineColor: { type: "color", value: [255, 255, 255] }, - filteredNominalVoltages: null, - lineFlowMode: "feeders" /* FEEDERS */, - lineFlowColorMode: "nominalVoltage" /* NOMINAL_VOLTAGE */, - lineFlowAlertThreshold: 100, - showLineFlow: true, - lineFullPath: true, - lineParallelPath: true, - labelSize: 12, - iconSize: 48, - distanceBetweenLines: 1e3, - maxParallelOffset: 100, - minParallelOffset: 3, - substationRadius: { type: "number", value: SUBSTATION_RADIUS }, - substationMaxPixel: { type: "number", value: SUBSTATION_RADIUS_MAX_PIXEL }, - minSubstationRadiusPixel: { - type: "number", - value: SUBSTATION_RADIUS_MIN_PIXEL - } -}; -class LineLayer extends CompositeLayer { - static layerName = "LineLayer"; - static defaultProps = defaultProps$2; - initializeState(context) { - super.initializeState(context); - this.state = { - compositeData: [], - linesConnection: /* @__PURE__ */ new Map(), - linesStatus: /* @__PURE__ */ new Map() - }; - } - getVoltageLevelIndex(voltageLevelId) { - const { network } = this.props; - const vl = network.getVoltageLevel(voltageLevelId); - if (vl === void 0) { - return void 0; - } - const substation = network.getSubstation(vl.substationId); - if (substation === void 0) { - return void 0; - } - return [ - ...new Set( - substation.voltageLevels.map((vl2) => vl2.nominalV) - // only one voltage level - ) - ].sort((a, b) => { - return a - b; - }).indexOf(vl.nominalV) + 1; - } - //TODO this is a huge function, refactor - updateState({ props, oldProps, changeFlags }) { - let compositeData; - let linesConnection; - let linesStatus; - if (changeFlags.dataChanged) { - compositeData = []; - linesConnection = /* @__PURE__ */ new Map(); - linesStatus = /* @__PURE__ */ new Map(); - if (props.network != null && props.network.substations && props.data.length !== 0 && props.geoData != null) { - const lineNominalVoltageIndexer = (map, line) => { - const network = props.network; - const vl1 = network.getVoltageLevel(line.voltageLevelId1); - const vl2 = network.getVoltageLevel(line.voltageLevelId2); - const vl = vl1 || vl2; - let list = map.get(vl.nominalV); - if (!list) { - list = []; - map.set(vl.nominalV, list); - } - if (vl1.substationId !== vl2.substationId) { - list.push(line); - } - return map; - }; - const linesByNominalVoltage = props.data.reduce( - lineNominalVoltageIndexer, - /* @__PURE__ */ new Map() - ); - compositeData = Array.from(linesByNominalVoltage.entries()).map(([nominalV, lines]) => { - return { nominalV, lines }; - }).sort((a, b) => b.nominalV - a.nominalV); - compositeData.forEach((c) => { - const mapOriginDestination = /* @__PURE__ */ new Map(); - c.mapOriginDestination = mapOriginDestination; - c.lines.forEach((line) => { - linesConnection.set(line.id, { - terminal1Connected: line.terminal1Connected, - terminal2Connected: line.terminal2Connected - }); - linesStatus.set(line.id, { - operatingStatus: line.operatingStatus - }); - const key = this.genLineKey(line); - const val = mapOriginDestination.get(key); - if (val == null) { - mapOriginDestination.set(key, /* @__PURE__ */ new Set([line])); - } else { - mapOriginDestination.set(key, val.add(line)); - } - }); - }); - } - } else { - compositeData = this.state.compositeData; - linesConnection = this.state.linesConnection; - linesStatus = this.state.linesStatus; - if (props.updatedLines !== oldProps.updatedLines) { - props.updatedLines.forEach((line1) => { - linesConnection.set(line1.id, { - terminal1Connected: line1.terminal1Connected, - terminal2Connected: line1.terminal2Connected - }); - linesStatus.set(line1.id, { - operatingStatus: line1.operatingStatus - }); - }); - } - } - if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { - this.recomputeParallelLinesIndex( - compositeData, - props - ); - } - if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || oldProps.geoData !== props.geoData)) { - compositeData.forEach((c) => { - const lineMap = /* @__PURE__ */ new Map(); - c.lines.forEach((line) => { - const positions = props.geoData.getLinePositions( - props.network, - line, - props.lineFullPath - ); - const cumulativeDistances = props.geoData.getLineDistances(positions); - lineMap.set(line.id, { - positions, - cumulativeDistances, - line - }); - }); - c.lineMap = lineMap; - }); - } - if (changeFlags.dataChanged || changeFlags.propsChanged && (props.lineFullPath !== oldProps.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { - this.recomputeForkLines(compositeData, props); - } - if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { - compositeData.forEach((cData) => { - cData.activePower = []; - cData.lines.forEach((line) => { - const lineData = cData.lineMap.get(line.id); - const arrowDirection = getArrowDirection(line.p1); - const coordinates1 = props.geoData.labelDisplayPosition( - lineData.positions, - lineData.cumulativeDistances, - START_ARROW_POSITION, - arrowDirection, - line.parallelIndex, - line.angle * 180 / Math.PI, - line.angleStart * 180 / Math.PI, - props.distanceBetweenLines, - line.proximityFactorStart - ); - const coordinates2 = props.geoData.labelDisplayPosition( - lineData.positions, - lineData.cumulativeDistances, - END_ARROW_POSITION, - arrowDirection, - line.parallelIndex, - line.angle * 180 / Math.PI, - line.angleEnd * 180 / Math.PI, - props.distanceBetweenLines, - line.proximityFactorEnd - ); - if (coordinates1 !== null && coordinates2 !== null) { - cData.activePower.push({ - line, - p: line.p1, - printPosition: [ - coordinates1.position.longitude, - coordinates1.position.latitude - ], - offset: coordinates1.offset - }); - cData.activePower.push({ - line, - p: line.p2, - printPosition: [ - coordinates2.position.longitude, - coordinates2.position.latitude - ], - offset: coordinates2.offset - }); - } - }); - }); - } - if (changeFlags.dataChanged || changeFlags.propsChanged && (props.updatedLines !== oldProps.updatedLines || oldProps.lineFullPath !== props.lineFullPath || props.lineParallelPath !== oldProps.lineParallelPath || props.geoData !== oldProps.geoData)) { - compositeData.forEach((cData) => { - cData.operatingStatus = []; - cData.lines.forEach((line) => { - const lineStatus = linesStatus.get(line.id); - if (lineStatus !== void 0 && lineStatus.operatingStatus !== void 0 && lineStatus.operatingStatus !== "IN_OPERATION") { - const lineData = cData.lineMap.get(line.id); - const coordinatesIcon = props.geoData.labelDisplayPosition( - lineData.positions, - lineData.cumulativeDistances, - 0.5, - ArrowDirection.NONE, - line.parallelIndex, - line.angle * 180 / Math.PI, - line.angleEnd * 180 / Math.PI, - props.distanceBetweenLines, - line.proximityFactorEnd - ); - if (coordinatesIcon !== null) { - cData.operatingStatus.push({ - status: lineStatus.operatingStatus, - printPosition: [ - coordinatesIcon.position.longitude, - coordinatesIcon.position.latitude - ], - offset: coordinatesIcon.offset - }); - } - } - }); - }); - } - if (changeFlags.dataChanged || changeFlags.propsChanged && (oldProps.lineFullPath !== props.lineFullPath || props.geoData !== oldProps.geoData || //For lineFlowMode, recompute only if mode goes to or from LineFlowMode.FEEDERS - //because for LineFlowMode.STATIC_ARROWS and LineFlowMode.ANIMATED_ARROWS it's the same - props.lineFlowMode !== oldProps.lineFlowMode && (props.lineFlowMode === "feeders" /* FEEDERS */ || oldProps.lineFlowMode === "feeders" /* FEEDERS */))) { - compositeData.forEach((cData) => { - const lineMap = cData.lineMap; - cData.arrows = cData.lines.flatMap((line) => { - const lineData = lineMap.get(line.id); - line.cumulativeDistances = lineData.cumulativeDistances; - line.positions = lineData.positions; - if (props.lineFlowMode === "feeders" /* FEEDERS */) { - return [ - { - distance: START_ARROW_POSITION, - line - }, - { - distance: END_ARROW_POSITION, - line - } - ]; - } - const directLinePositions = props.geoData.getLinePositions( - props.network, - line, - false - ); - const directLineDistance = es.getDistance( - { - latitude: directLinePositions[0][1], - longitude: directLinePositions[0][0] - }, - { - latitude: directLinePositions[1][1], - longitude: directLinePositions[1][0] - } - ); - const arrowCount = Math.ceil( - directLineDistance / DISTANCE_BETWEEN_ARROWS - ); - return [...new Array(arrowCount).keys()].map((index) => { - return { - distance: index / arrowCount, - line - }; - }); - }); - }); - } - this.setState({ compositeData, linesConnection, linesStatus }); - } - genLineKey(line) { - return line.voltageLevelId1 > line.voltageLevelId2 ? line.voltageLevelId1 + "##" + line.voltageLevelId2 : line.voltageLevelId2 + "##" + line.voltageLevelId1; - } - recomputeParallelLinesIndex(compositeData, props) { - compositeData.forEach((cData) => { - const mapOriginDestination = cData.mapOriginDestination; - mapOriginDestination.forEach((samePathLine, key) => { - let truncatedSize = samePathLine.size; - if (truncatedSize > 32) { - console.warn( - "Warning, more than 32 parallel lines between vls " + key + ". The map will only show 32 parallel lines." - ); - truncatedSize = 32; - } - let index = -(truncatedSize - 1) / 2; - samePathLine.forEach((line) => { - line.parallelIndex = props.lineParallelPath ? index : 0; - if (index < 15) { - index += 1; - } - }); - }); - }); - } - recomputeForkLines(compositeData, props) { - const mapMinProximityFactor = /* @__PURE__ */ new Map(); - compositeData.forEach((cData) => { - cData.lines.forEach((line) => { - const positions = cData?.lineMap?.get(line.id)?.positions; - if (!positions) { - return; - } - line.origin = positions[0]; - line.end = positions[positions.length - 1]; - line.substationIndexStart = this.getVoltageLevelIndex( - line.voltageLevelId1 - ); - line.substationIndexEnd = this.getVoltageLevelIndex( - line.voltageLevelId2 - ); - line.angle = this.computeAngle( - props, - positions[0], - positions[positions.length - 1] - ); - line.angleStart = this.computeAngle( - props, - positions[0], - positions[1] - ); - line.angleEnd = this.computeAngle( - props, - positions[positions.length - 2], - positions[positions.length - 1] - ); - line.proximityFactorStart = this.getProximityFactor( - positions[0], - positions[1] - ); - line.proximityFactorEnd = this.getProximityFactor( - positions[positions.length - 2], - positions[positions.length - 1] - ); - const key = this.genLineKey(line); - const val = mapMinProximityFactor.get(key); - if (val == null) { - mapMinProximityFactor.set(key, { - lines: [line], - start: line.proximityFactorStart, - end: line.proximityFactorEnd - }); - } else { - val.lines.push(line); - val.start = Math.min(val.start, line.proximityFactorStart); - val.end = Math.min(val.end, line.proximityFactorEnd); - mapMinProximityFactor.set(key, val); - } - }); - }); - mapMinProximityFactor.forEach( - (samePathLine) => samePathLine.lines.forEach((line) => { - line.proximityFactorStart = samePathLine.start; - line.proximityFactorEnd = samePathLine.end; - }) - ); - } - getProximityFactor(firstPosition, secondPosition) { - let factor = es.getDistance(firstPosition, secondPosition) / (3 * this.props.distanceBetweenLines); - if (factor > 1) { - factor = 1; - } - return factor; - } - computeAngle(props, position1, position2) { - let angle = props.geoData.getMapAngle(position1, position2); - angle = angle * Math.PI / 180 + Math.PI; - if (angle < 0) { - angle += 2 * Math.PI; - } - return angle; - } - renderLayers() { - const layers = []; - const linePathUpdateTriggers = [ - this.props.lineFullPath, - this.props.geoData.linePositionsById, - this.props.network.lines - ]; - this.state.compositeData.forEach((cData) => { - const nominalVoltageColor = this.props.getNominalVoltageColor( - cData.nominalV - ); - const lineLayer = new ParallelPathLayer( - this.getSubLayerProps({ - id: "LineNominalVoltage" + cData.nominalV, - data: cData.lines, - widthScale: 20, - widthMinPixels: 1, - widthMaxPixels: 2, - getPath: (line) => this.props.geoData.getLinePositions( - this.props.network, - line, - this.props.lineFullPath - ), - getColor: (line) => getLineColor( - line, - nominalVoltageColor, - this.props, - this.state.linesConnection.get(line.id) - ), - getWidth: 2, - getLineParallelIndex: (line) => line.parallelIndex, - getExtraAttributes: (line) => [ - line.angleStart, - line.angle, - line.angleEnd, - line.parallelIndex * 2 + 31 + 64 * (Math.ceil(line.proximityFactorStart * 512) - 1) + 64 * 512 * (Math.ceil(line.proximityFactorEnd * 512) - 1) - ], - distanceBetweenLines: this.props.distanceBetweenLines, - maxParallelOffset: this.props.maxParallelOffset, - minParallelOffset: this.props.minParallelOffset, - visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - cData.nominalV - ), - updateTriggers: { - getPath: linePathUpdateTriggers, - getExtraAttributes: [ - this.props.lineParallelPath, - linePathUpdateTriggers - ], - getColor: [ - this.props.disconnectedLineColor, - this.props.lineFlowColorMode, - this.props.lineFlowAlertThreshold, - this.props.updatedLines - ], - getDashArray: [this.props.updatedLines] - }, - getDashArray: (line) => doDash(this.state.linesConnection.get(line.id)) ? dashArray : noDashArray, - extensions: [new PathStyleExtension({ dash: true })] - }) - ); - layers.push(lineLayer); - const arrowLayer = new ArrowLayer( - this.getSubLayerProps({ - id: "ArrowNominalVoltage" + cData.nominalV, - data: cData.arrows, - sizeMinPixels: 3, - sizeMaxPixels: 7, - getDistance: (arrow) => arrow.distance, - getLine: (arrow) => arrow.line, - getLinePositions: (line) => this.props.geoData.getLinePositions( - this.props.network, - line, - this.props.lineFullPath - ), - getColor: (arrow) => getLineColor( - arrow.line, - nominalVoltageColor, - this.props, - this.state.linesConnection.get(arrow.line.id) - ), - getSize: 700, - getSpeedFactor: (arrow) => getArrowSpeedFactor(getArrowSpeed(arrow.line)), - getLineParallelIndex: (arrow) => arrow.line.parallelIndex, - getLineAngles: (arrow) => [ - arrow.line.angleStart, - arrow.line.angle, - arrow.line.angleEnd - ], - getProximityFactors: (arrow) => [ - arrow.line.proximityFactorStart, - arrow.line.proximityFactorEnd - ], - getDistanceBetweenLines: () => this.props.distanceBetweenLines, - maxParallelOffset: this.props.maxParallelOffset, - minParallelOffset: this.props.minParallelOffset, - getDirection: (arrow) => { - return getArrowDirection(arrow.line.p1); - }, - animated: this.props.showLineFlow && this.props.lineFlowMode === "animatedArrows" /* ANIMATED_ARROWS */, - visible: this.props.showLineFlow && (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - cData.nominalV - )), - opacity: this.props.areFlowsValid ? 1 : INVALID_FLOW_OPACITY, - updateTriggers: { - getLinePositions: linePathUpdateTriggers, - getLineParallelIndex: [this.props.lineParallelPath], - getLineAngles: linePathUpdateTriggers, - getColor: [ - this.props.disconnectedLineColor, - this.props.lineFlowColorMode, - this.props.lineFlowAlertThreshold, - this.props.updatedLines - ], - opacity: [this.props.areFlowsValid] - } - }) - ); - layers.push(arrowLayer); - const startFork = new ForkLineLayer( - this.getSubLayerProps({ - id: "LineForkStart" + cData.nominalV, - getSourcePosition: (line) => line.origin, - getTargetPosition: (line) => line.end, - getSubstationOffset: (line) => line.substationIndexStart, - data: cData.lines, - widthScale: 20, - widthMinPixels: 1, - widthMaxPixels: 2, - getColor: (line) => getLineColor( - line, - nominalVoltageColor, - this.props, - this.state.linesConnection.get(line.id) - ), - getWidth: 2, - getProximityFactor: (line) => line.proximityFactorStart, - getLineParallelIndex: (line) => line.parallelIndex, - getLineAngle: (line) => line.angleStart, - getDistanceBetweenLines: this.props.distanceBetweenLines, - getMaxParallelOffset: this.props.maxParallelOffset, - getMinParallelOffset: this.props.minParallelOffset, - getSubstationRadius: this.props.substationRadius, - getSubstationMaxPixel: this.props.substationMaxPixel, - getMinSubstationRadiusPixel: this.props.minSubstationRadiusPixel, - visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - cData.nominalV - ), - updateTriggers: { - getLineParallelIndex: linePathUpdateTriggers, - getSourcePosition: linePathUpdateTriggers, - getTargetPosition: linePathUpdateTriggers, - getLineAngle: linePathUpdateTriggers, - getProximityFactor: linePathUpdateTriggers, - getColor: [ - this.props.disconnectedLineColor, - this.props.lineFlowColorMode, - this.props.lineFlowAlertThreshold, - this.props.updatedLines - ] - } - }) - ); - layers.push(startFork); - const endFork = new ForkLineLayer( - this.getSubLayerProps({ - id: "LineForkEnd" + cData.nominalV, - getSourcePosition: (line) => line.end, - getTargetPosition: (line) => line.origin, - getSubstationOffset: (line) => line.substationIndexEnd, - data: cData.lines, - widthScale: 20, - widthMinPixels: 1, - widthMaxPixels: 2, - getColor: (line) => getLineColor( - line, - nominalVoltageColor, - this.props, - this.state.linesConnection.get(line.id) - ), - getWidth: 2, - getProximityFactor: (line) => line.proximityFactorEnd, - getLineParallelIndex: (line) => -line.parallelIndex, - getLineAngle: (line) => line.angleEnd + Math.PI, - getDistanceBetweenLines: this.props.distanceBetweenLines, - getMaxParallelOffset: this.props.maxParallelOffset, - getMinParallelOffset: this.props.minParallelOffset, - getSubstationRadius: this.props.substationRadius, - getSubstationMaxPixel: this.props.substationMaxPixel, - getMinSubstationRadiusPixel: this.props.minSubstationRadiusPixel, - visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - cData.nominalV - ), - updateTriggers: { - getLineParallelIndex: [this.props.lineParallelPath], - getSourcePosition: linePathUpdateTriggers, - getTargetPosition: linePathUpdateTriggers, - getLineAngle: linePathUpdateTriggers, - getProximityFactor: linePathUpdateTriggers, - getColor: [ - this.props.disconnectedLineColor, - this.props.lineFlowColorMode, - this.props.lineFlowAlertThreshold, - this.props.updatedLines - ] - } - }) - ); - layers.push(endFork); - const lineActivePowerLabelsLayer = new TextLayer( - this.getSubLayerProps({ - id: "ActivePower" + cData.nominalV, - data: cData.activePower, - getText: (activePower) => activePower.p !== void 0 ? Math.round(activePower.p).toString() : "", - // The position passed to this layer causes a bug when zooming and maxParallelOffset is reached: - // the label is not correctly positioned on the lines, they are slightly off. - // In the custom layers, we clamp the distanceBetweenLines. This is not done in the deck.gl TextLayer - // and IconLayer or in the position calculated here. - getPosition: (activePower) => activePower.printPosition, - getColor: this.props.labelColor, - fontFamily: "Roboto", - getSize: this.props.labelSize, - getAngle: 0, - getPixelOffset: (activePower) => activePower.offset.map((x) => x), - getTextAnchor: "middle", - visible: (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - cData.nominalV - )) && this.props.labelsVisible, - opacity: this.props.areFlowsValid ? 1 : INVALID_FLOW_OPACITY, - updateTriggers: { - getPosition: [ - this.props.lineParallelPath, - linePathUpdateTriggers - ], - getPixelOffset: linePathUpdateTriggers, - opacity: [this.props.areFlowsValid] - } - }) - ); - layers.push(lineActivePowerLabelsLayer); - const lineStatusIconLayer = new IconLayer( - this.getSubLayerProps({ - id: "OperatingStatus" + cData.nominalV, - data: cData.operatingStatus, - // The position passed to this layer causes a bug when zooming and maxParallelOffset is reached: - // the icon is not correctly positioned on the lines, they are slightly off. - // In the custom layers, we clamp the distanceBetweenLines. This is not done in the deck.gl TextLayer - // and IconLayer or in the position calculated here. - getPosition: (operatingStatus) => operatingStatus.printPosition, - getIcon: (operatingStatus) => getLineIcon(operatingStatus.status), - getSize: this.props.iconSize, - getColor: () => this.props.labelColor, - getPixelOffset: (operatingStatus) => operatingStatus.offset, - visible: (!this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes( - cData.nominalV - )) && this.props.labelsVisible, - updateTriggers: { - getPosition: [ - this.props.lineParallelPath, - linePathUpdateTriggers - ], - getPixelOffset: linePathUpdateTriggers, - getIcon: [this.state.linesStatus], - getColor: [this.props.labelColor] - } - }) - ); - layers.push(lineStatusIconLayer); - }); - return layers; - } -} - -const EQUIPMENT_INFOS_TYPES = { - LIST: { type: "LIST" }, - MAP: { type: "MAP" }, - FORM: { type: "FORM" }, - TAB: { type: "TAB" }, - TOOLTIP: { type: "TOOLTIP" } -}; -var EQUIPMENT_TYPES = /* @__PURE__ */ ((EQUIPMENT_TYPES2) => { - EQUIPMENT_TYPES2["SUBSTATION"] = "SUBSTATION"; - EQUIPMENT_TYPES2["VOLTAGE_LEVEL"] = "VOLTAGE_LEVEL"; - EQUIPMENT_TYPES2["LINE"] = "LINE"; - EQUIPMENT_TYPES2["TWO_WINDINGS_TRANSFORMER"] = "TWO_WINDINGS_TRANSFORMER"; - EQUIPMENT_TYPES2["THREE_WINDINGS_TRANSFORMER"] = "THREE_WINDINGS_TRANSFORMER"; - EQUIPMENT_TYPES2["HVDC_LINE"] = "HVDC_LINE"; - EQUIPMENT_TYPES2["GENERATOR"] = "GENERATOR"; - EQUIPMENT_TYPES2["BATTERY"] = "BATTERY"; - EQUIPMENT_TYPES2["LOAD"] = "LOAD"; - EQUIPMENT_TYPES2["SHUNT_COMPENSATOR"] = "SHUNT_COMPENSATOR"; - EQUIPMENT_TYPES2["TIE_LINE"] = "TIE_LINE"; - EQUIPMENT_TYPES2["DANGLING_LINE"] = "DANGLING_LINE"; - EQUIPMENT_TYPES2["STATIC_VAR_COMPENSATOR"] = "STATIC_VAR_COMPENSATOR"; - EQUIPMENT_TYPES2["HVDC_CONVERTER_STATION"] = "HVDC_CONVERTER_STATION"; - EQUIPMENT_TYPES2["VSC_CONVERTER_STATION"] = "VSC_CONVERTER_STATION"; - EQUIPMENT_TYPES2["LCC_CONVERTER_STATION"] = "LCC_CONVERTER_STATION"; - EQUIPMENT_TYPES2["SWITCH"] = "SWITCH"; - return EQUIPMENT_TYPES2; -})(EQUIPMENT_TYPES || {}); -const isVoltageLevel = (object) => "substationId" in object; -const isSubstation = (object) => "voltageLevels" in object; -const isLine = (object) => "id" in object && "voltageLevelId1" in object && "voltageLevelId2" in object; -var ConvertersMode = /* @__PURE__ */ ((ConvertersMode2) => { - ConvertersMode2[ConvertersMode2["SIDE_1_RECTIFIER_SIDE_2_INVERTER"] = 0] = "SIDE_1_RECTIFIER_SIDE_2_INVERTER"; - ConvertersMode2[ConvertersMode2["SIDE_1_INVERTER_SIDE_2_RECTIFIER"] = 1] = "SIDE_1_INVERTER_SIDE_2_RECTIFIER"; - return ConvertersMode2; -})(ConvertersMode || {}); - -const elementIdIndexer = (map, element) => { - map.set(element.id, element); - return map; -}; -class MapEquipments { - substations = []; - substationsById = /* @__PURE__ */ new Map(); - lines = []; - linesById = /* @__PURE__ */ new Map(); - tieLines = []; - tieLinesById = /* @__PURE__ */ new Map(); - hvdcLines = []; - hvdcLinesById = /* @__PURE__ */ new Map(); - voltageLevels = []; - voltageLevelsById = /* @__PURE__ */ new Map(); - nominalVoltages = []; - intlRef = void 0; - constructor() { - } - newMapEquipmentForUpdate() { - return Object.assign(Object.create(Object.getPrototypeOf(this)), this); - } - checkAndGetValues(equipments) { - return equipments ? equipments : []; - } - completeSubstationsInfos(equipementsToIndex) { - const nominalVoltagesSet = new Set(this.nominalVoltages); - if (equipementsToIndex?.length === 0) { - this.substationsById = /* @__PURE__ */ new Map(); - this.voltageLevelsById = /* @__PURE__ */ new Map(); - } - const substations = equipementsToIndex?.length > 0 ? equipementsToIndex : this.substations; - substations.forEach((substation) => { - substation.voltageLevels = substation.voltageLevels.sort( - (voltageLevel1, voltageLevel2) => voltageLevel1.nominalV - voltageLevel2.nominalV - ); - this.substationsById.set(substation.id, substation); - substation.voltageLevels.forEach((voltageLevel) => { - voltageLevel.substationId = substation.id; - voltageLevel.substationName = substation.name; - this.voltageLevelsById.set(voltageLevel.id, voltageLevel); - nominalVoltagesSet.add(voltageLevel.nominalV); - }); - }); - this.voltageLevels = Array.from(this.voltageLevelsById.values()); - this.nominalVoltages = Array.from(nominalVoltagesSet).sort( - (a, b) => b - a - ); - } - updateEquipments(currentEquipments, newEquipements, _equipmentType) { - currentEquipments.forEach((equipment1, index) => { - const found = newEquipements.filter( - (equipment2) => equipment2.id === equipment1.id - ); - currentEquipments[index] = found.length > 0 ? found[0] : equipment1; - }); - const eqptsToAdd = newEquipements.filter( - (eqpt) => !currentEquipments.some((otherEqpt) => otherEqpt.id === eqpt.id) - ); - if (eqptsToAdd.length === 0) { - return currentEquipments; - } - return [...currentEquipments, ...eqptsToAdd]; - } - updateSubstations(substations, fullReload) { - if (fullReload) { - this.substations = []; - } - let voltageLevelAdded = false; - this.substations.forEach((substation1, index) => { - const found = substations.filter( - (substation2) => substation2.id === substation1.id - ); - if (found.length > 0) { - if (found[0].voltageLevels.length > substation1.voltageLevels.length) { - voltageLevelAdded = true; - } - this.substations[index] = found[0]; - } - }); - let substationAdded = false; - substations.forEach((substation1) => { - const found = this.substations.find( - (substation2) => substation2.id === substation1.id - ); - if (found === void 0) { - this.substations.push(substation1); - substationAdded = true; - } - }); - if (substationAdded || voltageLevelAdded) { - this.substations = [...this.substations]; - } - this.completeSubstationsInfos(fullReload ? [] : substations); - } - completeLinesInfos(equipementsToIndex) { - if (equipementsToIndex?.length > 0) { - equipementsToIndex.forEach((line) => { - this.linesById?.set(line.id, line); - }); - } else { - this.linesById = this.lines.reduce(elementIdIndexer, /* @__PURE__ */ new Map()); - } - } - completeTieLinesInfos(equipementsToIndex) { - if (equipementsToIndex?.length > 0) { - equipementsToIndex.forEach((tieLine) => { - this.tieLinesById?.set(tieLine.id, tieLine); - }); - } else { - this.tieLinesById = this.tieLines.reduce( - elementIdIndexer, - /* @__PURE__ */ new Map() - ); - } - } - updateLines(lines, fullReload) { - if (fullReload) { - this.lines = []; - } - this.lines = this.updateEquipments( - this.lines, - lines, - EQUIPMENT_TYPES.LINE - ); - this.completeLinesInfos(fullReload ? [] : lines); - } - updateTieLines(tieLines, fullReload) { - if (fullReload) { - this.tieLines = []; - } - this.tieLines = this.updateEquipments( - this.tieLines, - tieLines, - EQUIPMENT_TYPES.TIE_LINE - ); - this.completeTieLinesInfos(fullReload ? [] : tieLines); - } - updateHvdcLines(hvdcLines, fullReload) { - if (fullReload) { - this.hvdcLines = []; - } - this.hvdcLines = this.updateEquipments( - this.hvdcLines, - hvdcLines, - EQUIPMENT_TYPES.HVDC_LINE - ); - this.completeHvdcLinesInfos(fullReload ? [] : hvdcLines); - } - completeHvdcLinesInfos(equipementsToIndex) { - if (equipementsToIndex?.length > 0) { - equipementsToIndex.forEach((hvdcLine) => { - this.hvdcLinesById?.set(hvdcLine.id, hvdcLine); - }); - } else { - this.hvdcLinesById = this.hvdcLines.reduce( - elementIdIndexer, - /* @__PURE__ */ new Map() - ); - } - } - removeBranchesOfVoltageLevel(branchesList, voltageLevelId) { - const remainingLines = branchesList.filter( - (l) => l.voltageLevelId1 !== voltageLevelId && l.voltageLevelId2 !== voltageLevelId - ); - branchesList.filter((l) => !remainingLines.includes(l)).map((l) => this.linesById.delete(l.id)); - return remainingLines; - } - removeEquipment(equipmentType, equipmentId) { - switch (equipmentType) { - case EQUIPMENT_TYPES.LINE: { - this.lines = this.lines.filter((l) => l.id !== equipmentId); - this.linesById.delete(equipmentId); - break; - } - case EQUIPMENT_TYPES.VOLTAGE_LEVEL: { - const substationId = this.voltageLevelsById.get(equipmentId)?.substationId; - if (substationId === void 0) { - return; - } - const substation = this.substationsById.get(substationId); - if (substation === void 0) { - return; - } - substation.voltageLevels = substation.voltageLevels.filter( - (l) => l.id !== equipmentId - ); - this.removeBranchesOfVoltageLevel(this.lines, equipmentId); - this.substations = [...this.substations]; - break; - } - case EQUIPMENT_TYPES.SUBSTATION: { - this.substations = this.substations.filter( - (l) => l.id !== equipmentId - ); - const substation = this.substationsById.get(equipmentId); - if (substation === void 0) { - return; - } - substation.voltageLevels.map( - (vl) => this.removeEquipment(EQUIPMENT_TYPES.VOLTAGE_LEVEL, vl.id) - ); - this.completeSubstationsInfos([substation]); - break; - } - } - } - getVoltageLevels() { - return this.voltageLevels; - } - getVoltageLevel(id) { - return this.voltageLevelsById.get(id); - } - getSubstations() { - return this.substations; - } - getSubstation(id) { - return this.substationsById.get(id); - } - getNominalVoltages() { - return this.nominalVoltages; - } - getLines() { - return this.lines; - } - getLine(id) { - return this.linesById.get(id); - } - getHvdcLines() { - return this.hvdcLines; - } - getHvdcLine(id) { - return this.hvdcLinesById.get(id); - } - getTieLines() { - return this.tieLines; - } - getTieLine(id) { - return this.tieLinesById.get(id); - } -} - -const defaultProps$1 = { - getRadiusMaxPixels: { type: "accessor", value: 1 } -}; -class ScatterplotLayerExt extends ScatterplotLayer { - static layerName = "ScatterplotLayerExt"; - static defaultProps = defaultProps$1; - getShaders() { - const shaders = super.getShaders(); - return Object.assign({}, shaders, { - vs: shaders.vs.replace( - ", radiusMaxPixels", - ", instanceRadiusMaxPixels" - ), - // hack to replace the uniform variable to corresponding attribute - inject: { - "vs:#decl": `in float instanceRadiusMaxPixels; -` - } - }); - } - initializeState() { - super.initializeState(); - this.getAttributeManager()?.addInstanced({ - instanceRadiusMaxPixels: { - size: 1, - transition: true, - accessor: "getRadiusMaxPixels", - type: "float32", - defaultValue: 0 - } - }); - } -} - -const voltageLevelNominalVoltageIndexer = (map, voltageLevel) => { - let list = map.get(voltageLevel.nominalV); - if (!list) { - list = []; - map.set(voltageLevel.nominalV, list); - } - list.push(voltageLevel); - return map; -}; -const defaultProps = { - getNominalVoltageColor: { type: "function", value: () => [255, 255, 255] }, - filteredNominalVoltages: null, - labelsVisible: false, - labelColor: { type: "color", value: [255, 255, 255] }, - labelSize: 12 -}; -class SubstationLayer extends CompositeLayer { - static layerName = "SubstationLayer"; - static defaultProps = defaultProps; - initializeState(context) { - super.initializeState(context); - this.state = { - compositeData: [], - substationsLabels: [] - }; - } - updateState({ - props: { data, filteredNominalVoltages, geoData, getNameOrId, network }, - oldProps, - changeFlags - }) { - if (changeFlags.dataChanged) { - const metaVoltageLevelsByNominalVoltage = /* @__PURE__ */ new Map(); - if (network != null && geoData != null) { - data.forEach((substation) => { - const voltageLevelsByNominalVoltage = substation.voltageLevels.reduce( - voltageLevelNominalVoltageIndexer, - /* @__PURE__ */ new Map() - ); - const nominalVoltages = [ - ...new Set( - substation.voltageLevels.map((voltageLevel) => voltageLevel.nominalV).sort( - (nominalVoltage1, nominalVoltage2) => nominalVoltage1 - nominalVoltage2 - ) - ) - ]; - Array.from(voltageLevelsByNominalVoltage.entries()).forEach( - ([nominalV, voltageLevels]) => { - let metaVoltageLevels = metaVoltageLevelsByNominalVoltage.get(nominalV); - if (!metaVoltageLevels) { - metaVoltageLevels = []; - metaVoltageLevelsByNominalVoltage.set( - nominalV, - metaVoltageLevels - ); - } - metaVoltageLevels.push({ - voltageLevels, - nominalVoltageIndex: nominalVoltages.indexOf(nominalV) - }); - } - ); - }); - } - const metaVoltageLevelsByNominalVoltageArray = Array.from( - metaVoltageLevelsByNominalVoltage - ).map((e) => { - return { nominalV: e[0], metaVoltageLevels: e[1] }; - }).sort((a, b) => b.nominalV - a.nominalV); - this.setState({ - metaVoltageLevelsByNominalVoltage: metaVoltageLevelsByNominalVoltageArray - }); - } - if (changeFlags.dataChanged || getNameOrId !== oldProps.getNameOrId || filteredNominalVoltages !== oldProps.filteredNominalVoltages) { - let substationsLabels = data; - if (network != null && geoData != null && filteredNominalVoltages != null) { - substationsLabels = substationsLabels.filter( - (substation) => substation.voltageLevels.find( - (v) => filteredNominalVoltages.includes(v.nominalV) - ) !== void 0 - ); - } - this.setState({ substationsLabels }); - } - } - renderLayers() { - const layers = []; - this.state.metaVoltageLevelsByNominalVoltage?.forEach((e) => { - const substationsLayer = new ScatterplotLayerExt( - this.getSubLayerProps({ - id: "NominalVoltage" + e.nominalV, - data: e.metaVoltageLevels, - radiusMinPixels: SUBSTATION_RADIUS_MIN_PIXEL, - getRadiusMaxPixels: (metaVoltageLevel) => SUBSTATION_RADIUS_MAX_PIXEL * (metaVoltageLevel.nominalVoltageIndex + 1), - getPosition: (metaVoltageLevel) => this.props.geoData.getSubstationPosition( - metaVoltageLevel.voltageLevels[0].substationId - ), - getFillColor: this.props.getNominalVoltageColor(e.nominalV), - getRadius: (voltageLevel) => SUBSTATION_RADIUS * (voltageLevel.nominalVoltageIndex + 1), - visible: !this.props.filteredNominalVoltages || this.props.filteredNominalVoltages.includes(e.nominalV), - updateTriggers: { - getPosition: [ - this.props?.geoData?.substationPositionsById, - this.props?.network?.substations - ] - } - }) - ); - layers.push(substationsLayer); - }); - const substationLabelsLayer = new TextLayer( - this.getSubLayerProps({ - id: "Label", - data: this.state.substationsLabels, - getPosition: (substation) => this.props.geoData.getSubstationPosition(substation.id), - getText: (substation) => this.props.getNameOrId(substation), - getColor: this.props.labelColor, - fontFamily: "Roboto", - getSize: this.props.labelSize, - getAngle: 0, - getTextAnchor: "start", - getAlignmentBaseline: "center", - getPixelOffset: [20 / 1.5, 0], - visible: this.props.labelsVisible, - updateTriggers: { - getText: [this.props.getNameOrId], - getPosition: [ - this.props.geoData.substationPositionsById, - this.props.network.substations - ] - } - }) - ); - layers.push(substationLabelsLayer); - return layers; - } -} - -export { ConvertersMode, EQUIPMENT_INFOS_TYPES, EQUIPMENT_TYPES, GeoData, LineFlowColorMode, LineFlowMode, LineLayer, MapEquipments, SubstationLayer, getNominalVoltageColor, isLine, isSubstation, isVoltageLevel }; diff --git a/packages/network-map-layers/dist/utils/colors.d.ts b/packages/network-map-layers/dist/utils/colors.d.ts deleted file mode 100644 index d0706c66..00000000 --- a/packages/network-map-layers/dist/utils/colors.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Color } from '@deck.gl/core'; - -export declare function getNominalVoltageColor(nominalVoltage: number): Color; -export declare const INVALID_FLOW_OPACITY = 0.2; -export declare const NAD_INVALID_FLOW_OPACITY = 0.4; diff --git a/packages/network-map-layers/dist/utils/equipment-types.d.ts b/packages/network-map-layers/dist/utils/equipment-types.d.ts deleted file mode 100644 index d0c03d7a..00000000 --- a/packages/network-map-layers/dist/utils/equipment-types.d.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { LineStatus } from '../network/line-layer'; - -export declare const EQUIPMENT_INFOS_TYPES: { - LIST: { - type: string; - }; - MAP: { - type: string; - }; - FORM: { - type: string; - }; - TAB: { - type: string; - }; - TOOLTIP: { - type: string; - }; -}; -export declare enum EQUIPMENT_TYPES { - SUBSTATION = "SUBSTATION", - VOLTAGE_LEVEL = "VOLTAGE_LEVEL", - LINE = "LINE", - TWO_WINDINGS_TRANSFORMER = "TWO_WINDINGS_TRANSFORMER", - THREE_WINDINGS_TRANSFORMER = "THREE_WINDINGS_TRANSFORMER", - HVDC_LINE = "HVDC_LINE", - GENERATOR = "GENERATOR", - BATTERY = "BATTERY", - LOAD = "LOAD", - SHUNT_COMPENSATOR = "SHUNT_COMPENSATOR", - TIE_LINE = "TIE_LINE", - DANGLING_LINE = "DANGLING_LINE", - STATIC_VAR_COMPENSATOR = "STATIC_VAR_COMPENSATOR", - HVDC_CONVERTER_STATION = "HVDC_CONVERTER_STATION", - VSC_CONVERTER_STATION = "VSC_CONVERTER_STATION", - LCC_CONVERTER_STATION = "LCC_CONVERTER_STATION", - SWITCH = "SWITCH" -} -export type LonLat = [number, number]; -export type VoltageLevel = { - id: string; - nominalV: number; - substationId: string; - substationName?: string; -}; -export type Substation = { - id: string; - name: string; - voltageLevels: VoltageLevel[]; -}; -export declare const isVoltageLevel: (object: Record) => object is VoltageLevel; -export declare const isSubstation: (object: Record) => object is Substation; -export type Line = { - id: string; - voltageLevelId1: string; - voltageLevelId2: string; - name: string; - terminal1Connected: boolean; - terminal2Connected: boolean; - p1: number; - p2: number; - i1?: number; - i2?: number; - operatingStatus?: LineStatus; - currentLimits1?: { - permanentLimit: number; - } | null; - currentLimits2?: { - permanentLimit: number; - } | null; - origin?: LonLat; - end?: LonLat; - substationIndexStart?: number; - substationIndexEnd?: number; - angle?: number; - angleStart?: number; - angleEnd?: number; - proximityFactorStart?: number; - proximityFactorEnd?: number; - parallelIndex?: number; - cumulativeDistances?: number[]; - positions?: LonLat[]; -}; -export declare const isLine: (object: Record) => object is Line; -export type TieLine = { - id: string; -}; -export declare enum ConvertersMode { - SIDE_1_RECTIFIER_SIDE_2_INVERTER = 0, - SIDE_1_INVERTER_SIDE_2_RECTIFIER = 1 -} -export type HvdcLine = { - id: string; - convertersMode: ConvertersMode; - r: number; - nominalV: number; - activePowerSetpoint: number; - maxP: number; -}; -export type Equipment = Line | Substation | TieLine | HvdcLine; -export type LineEquimentLine = Line & { - equipmentType: EQUIPMENT_TYPES.LINE; -}; -export type TieLineEquimentLine = Line & { - equipmentType: EQUIPMENT_TYPES.TIE_LINE; -}; -export type HvdcLineEquimentLine = Line & { - equipmentType: EQUIPMENT_TYPES.HVDC_LINE; -}; -export type EquimentLine = LineEquimentLine | TieLineEquimentLine | HvdcLineEquimentLine; diff --git a/packages/network-map-layers/package.json b/packages/network-map-layers/package.json index d82f1aef..c3dc03fd 100644 --- a/packages/network-map-layers/package.json +++ b/packages/network-map-layers/package.json @@ -18,7 +18,7 @@ } }, "scripts": { - "build": "tsc --p ./tsconfig.json && vite build" + "build": "vite build" }, "dependencies": { "@deck.gl/core": "^9.0.0", diff --git a/packages/single-line-diagram-viewer/package.json b/packages/single-line-diagram-viewer/package.json new file mode 100644 index 00000000..8a2c96a5 --- /dev/null +++ b/packages/single-line-diagram-viewer/package.json @@ -0,0 +1,34 @@ +{ + "name": "@powsybl/single-line-diagram-viewer", + "version": "0.6", + "description": "Typescript library to integrate a powsybl svg diagram in a javascript project.", + "author": "powsybl team", + "homepage": "https://www.powsybl.org/", + "license": "MPL-2.0", + "repository": "git://github.com/powsybl/powsybl-diagram-viewer.git", + "type": "module", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "module": "./dist/single-line-diagram-viewer.js", + "exports": { + ".": { + "import": "./dist/single-line-diagram-viewer.js" + } + }, + "scripts": { + "build": "vite build" + }, + "dependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.panzoom.js": "^2.1.2" + }, + "devDependencies": { + "typescript": "5.5.3", + "vite": "^5.3.3", + "vite-plugin-dts": "^3.9.1", + "vite-plugin-externalize-deps": "^0.8.0", + "vite-plugin-svgr": "^4.2.0" + } +} diff --git a/packages/single-line-diagram-viewer/src/index.ts b/packages/single-line-diagram-viewer/src/index.ts new file mode 100644 index 00000000..e756a1d0 --- /dev/null +++ b/packages/single-line-diagram-viewer/src/index.ts @@ -0,0 +1,12 @@ +export { SingleLineDiagramViewer } from './single-line-diagram-viewer'; +export type { + HandleTogglePopoverType, + OnBreakerCallbackType, + OnBusCallbackType, + OnFeederCallbackType, + OnNextVoltageCallbackType, + SLDMetadata, + SLDMetadataComponent, + SLDMetadataComponentSize, + SLDMetadataNode, +} from './single-line-diagram-viewer'; diff --git a/src/components/single-line-diagram-viewer/single-line-diagram-viewer.ts b/packages/single-line-diagram-viewer/src/single-line-diagram-viewer.ts similarity index 100% rename from src/components/single-line-diagram-viewer/single-line-diagram-viewer.ts rename to packages/single-line-diagram-viewer/src/single-line-diagram-viewer.ts diff --git a/packages/single-line-diagram-viewer/tsconfig.json b/packages/single-line-diagram-viewer/tsconfig.json new file mode 100644 index 00000000..ec617a27 --- /dev/null +++ b/packages/single-line-diagram-viewer/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "esnext", + "lib": ["ES2022"], + "target": "ESNext", + "declaration": true, + "outDir": "./dist", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "bundler", + "noEmit": true, + "resolveJsonModule": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/packages/single-line-diagram-viewer/vite.config.ts b/packages/single-line-diagram-viewer/vite.config.ts new file mode 100644 index 00000000..aea298f9 --- /dev/null +++ b/packages/single-line-diagram-viewer/vite.config.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2024, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import * as path from 'node:path'; +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import svgr from 'vite-plugin-svgr'; +import pkg from './package.json' assert { type: 'json' }; + +export default defineConfig((_config) => ({ + plugins: [svgr(), dts()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + build: { + minify: false, + lib: { + entry: path.resolve(__dirname, 'src/index.ts'), + formats: ['es'], + name: 'PowSyBl single line diagram viewer', + fileName: 'single-line-diagram-viewer', + }, + rollupOptions: { + external: [...Object.keys(pkg.dependencies), /^node:.*/], + }, + target: 'esnext', + }, +})); diff --git a/src/index.ts b/src/index.ts index 655cc00c..9f63612b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,13 +11,7 @@ export { LineFlowMode, MapEquipments, } from '@powsybl/network-map-layers'; -export { NetworkAreaDiagramViewer } from './components/network-area-diagram-viewer/network-area-diagram-viewer'; -export { - DRAW_EVENT, - default as NetworkMap, -} from './components/network-map-viewer/network/network-map'; -export type { NetworkMapRef } from './components/network-map-viewer/network/network-map'; -export { SingleLineDiagramViewer } from './components/single-line-diagram-viewer/single-line-diagram-viewer'; +export { SingleLineDiagramViewer } from '@powsybl/single-line-diagram-viewer'; export type { HandleTogglePopoverType, OnBreakerCallbackType, @@ -28,6 +22,12 @@ export type { SLDMetadataComponent, SLDMetadataComponentSize, SLDMetadataNode, -} from './components/single-line-diagram-viewer/single-line-diagram-viewer'; +} from '@powsybl/single-line-diagram-viewer'; +export { NetworkAreaDiagramViewer } from './components/network-area-diagram-viewer/network-area-diagram-viewer'; +export { + DRAW_EVENT, + default as NetworkMap, +} from './components/network-map-viewer/network/network-map'; +export type { NetworkMapRef } from './components/network-map-viewer/network/network-map'; export { DRAW_MODES } from './components/network-map-viewer/network/draw-control'; diff --git a/vite.config.ts b/vite.config.ts index 076fb1d1..fee066cc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -8,6 +8,7 @@ import react from '@vitejs/plugin-react'; import * as path from 'node:path'; import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; import svgr from 'vite-plugin-svgr'; export default defineConfig((_config) => ({ @@ -18,6 +19,7 @@ export default defineConfig((_config) => ({ // failOnWarning: config.mode !== 'development', // lintOnStart: true, // }), + dts(), ], resolve: { alias: { @@ -68,6 +70,8 @@ export default defineConfig((_config) => ({ '@luma.gl/core': 'LumaGlCore', '@svgdotjs/svg.js': 'SvgJs', '@powsybl/network-map-layers': 'PowsyblNetworkMapLayers', + '@powsybl/single-line-diagram-viewer': + 'PowsyblSingleLineDiagramViewer', 'react-map-gl/maplibre': 'ReactMapGlMaplibre', '@mapbox/mapbox-gl-draw': 'MapboxGlDraw', '@turf/boolean-point-in-polygon': From 0f501ef5b7a7b5969e5aa0505948bd3f6607b5a5 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Fri, 26 Jul 2024 13:32:07 +0200 Subject: [PATCH 06/10] fix selection regression in map --- package-lock.json | 57 +------------------ packages/network-map-layers/package.json | 6 +- .../network/network-map.tsx | 38 ++++++++----- 3 files changed, 31 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac5f70d6..32f80cf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16039,11 +16039,11 @@ "license": "MPL-2.0", "dependencies": { "@deck.gl/core": "^9.0.0", - "@deck.gl/extensions": "9.0.0", + "@deck.gl/extensions": "^9.0.0", "@deck.gl/layers": "^9.0.0", - "@luma.gl/constants": "9.0.0", + "@luma.gl/constants": "^9.0.0", "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "9.0.0" + "@luma.gl/engine": "^9.0.0" }, "devDependencies": { "typescript": "5.5.3", @@ -16053,57 +16053,6 @@ "vite-plugin-svgr": "^4.2.0" } }, - "packages/network-map-layers/node_modules/@deck.gl/extensions": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.0.tgz", - "integrity": "sha512-2QcWLXuQVdlOWCV/vqpZtIhAkYjv7Pvcd5bxI3b02mtkoICpryWSWYJDP6+vNxNvviwe9rVSvwTL6vqd/dwWDQ==", - "dependencies": { - "@luma.gl/constants": "^9.0.6", - "@luma.gl/shadertools": "^9.0.6", - "@math.gl/core": "^4.0.0" - }, - "peerDependencies": { - "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" - } - }, - "packages/network-map-layers/node_modules/@deck.gl/extensions/node_modules/@luma.gl/constants": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.16.tgz", - "integrity": "sha512-uVbtpTON0HYfX8MqgQ+wz+Hh9EvvTq0F1QXNtWjpizLsRFJIeWGO3a7uqz6Y6pzvzqCCYdN/GPGo/t+Vxt/D/w==" - }, - "packages/network-map-layers/node_modules/@luma.gl/constants": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.0.tgz", - "integrity": "sha512-0oVddffzzkYeHs2CKwehezQ0R5IkqM9Jq2FVYdnOAa02rAtqytWwvmhn4zs0Q/kYtHVn51OnkqIcB1vk5MsLJA==" - }, - "packages/network-map-layers/node_modules/@luma.gl/engine": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.0.tgz", - "integrity": "sha512-I5OUFvqkYlsz1zn0u9EcF+NDtWSCvtSA3Ki8dRcbhx3ff2f1UuMZ8w0H2f/0Dz4pfnRaSXFaxfx6EslbXK2TzQ==", - "dependencies": { - "@luma.gl/shadertools": "9.0.0", - "@math.gl/core": "^4.0.0", - "@probe.gl/log": "^4.0.2", - "@probe.gl/stats": "^4.0.2" - }, - "peerDependencies": { - "@luma.gl/core": "^9.0.0-beta" - } - }, - "packages/network-map-layers/node_modules/@luma.gl/engine/node_modules/@luma.gl/shadertools": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.0.tgz", - "integrity": "sha512-m8IdrG+bFz8P2onLDD0fdaH12ibMzShxZ4I/DDrz9HFq4CitdiMABQiqRmAzZNv0RxnyJ6xIYxvudgvUk18B3Q==", - "dependencies": { - "@math.gl/core": "^4.0.0", - "@math.gl/types": "^4.0.0" - }, - "peerDependencies": { - "@luma.gl/core": "^9.0.0-beta" - } - }, "packages/network-map-layers/node_modules/@microsoft/api-extractor": { "version": "7.47.2", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.47.2.tgz", diff --git a/packages/network-map-layers/package.json b/packages/network-map-layers/package.json index c3dc03fd..5f2609a0 100644 --- a/packages/network-map-layers/package.json +++ b/packages/network-map-layers/package.json @@ -22,11 +22,11 @@ }, "dependencies": { "@deck.gl/core": "^9.0.0", - "@deck.gl/extensions": "9.0.0", + "@deck.gl/extensions": "^9.0.0", "@deck.gl/layers": "^9.0.0", - "@luma.gl/constants": "9.0.0", + "@luma.gl/constants": "^9.0.0", "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "9.0.0" + "@luma.gl/engine": "^9.0.0" }, "devDependencies": { "typescript": "5.5.3", diff --git a/src/components/network-map-viewer/network/network-map.tsx b/src/components/network-map-viewer/network/network-map.tsx index 066e9950..b8a63b7b 100644 --- a/src/components/network-map-viewer/network/network-map.tsx +++ b/src/components/network-map-viewer/network/network-map.tsx @@ -42,8 +42,7 @@ import { ViewState, ViewStateChangeEvent, useControl, - useMap, -} from 'react-map-gl/maplibre'; +} from 'react-map-gl'; import { useNameOrId } from '../utils/equipmentInfosHandler'; import DrawControl, { DRAW_MODES, @@ -51,6 +50,12 @@ import DrawControl, { getMapDrawer, } from './draw-control'; +import mapboxgl from 'mapbox-gl'; +import 'mapbox-gl/dist/mapbox-gl.css'; +import maplibregl from 'maplibre-gl'; +import 'maplibre-gl/dist/maplibre-gl.css'; +import type { MapLib, MapRef } from 'react-map-gl'; + import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css'; import booleanPointInPolygon from '@turf/boolean-point-in-polygon'; import { PickingInfo } from 'deck.gl'; @@ -273,7 +278,7 @@ const NetworkMap = forwardRef( const [labelsVisible, setLabelsVisible] = useState(false); const [showLineFlow, setShowLineFlow] = useState(true); const [showTooltip, setShowTooltip] = useState(true); - const mapRef = useMap(); + const mapRef = useRef(null); const deckRef = useRef(null); const [centered, setCentered] = useState(INITIAL_CENTERED); const lastViewStateRef = useRef(); @@ -362,8 +367,6 @@ const NetworkMap = forwardRef( }); }, [centerOnSubstation]); - const mapLib = useMap(); - // TODO simplify this, now we use Map as the camera controlling component // so we don't need the deckgl ref anymore. The following comments are // probably outdated, cleanup everything: @@ -391,7 +394,7 @@ const NetworkMap = forwardRef( if (!geodata) { return; } // can't center on substation if no coordinate. - mapLib.current?.flyTo({ + mapRef.current?.flyTo({ center: [geodata.lon, geodata.lat], duration: 2000, }); @@ -423,7 +426,7 @@ const NetworkMap = forwardRef( ); const marginlon = (maxlon - minlon) / 10; const marginlat = (maxlat - minlat) / 10; - mapLib.current?.fitBounds( + mapRef.current?.fitBounds( [ [ minlon - marginlon / 2, @@ -725,10 +728,18 @@ const NetworkMap = forwardRef( [mapLibrary, mapTheme] ); - const mapboxAccessToken = mToken; - const key = mapLibrary === MAPBOX && mToken ? 'mapboxgl' : 'maplibregl'; + const mapLib = + mapLibrary === MAPBOX && mToken + ? { + mapLib: mapboxgl, + mapboxAccessToken: mToken, + } + : { + mapLib: maplibregl, + }; + // because the mapLib prop of react-map-gl is not reactive, we need to // unmount/mount the Map with 'key', so we need also to reset all state // associated with uncontrolled state of the map @@ -750,8 +761,8 @@ const NetworkMap = forwardRef( const polygonCoordinates = polygonFeatures?.geometry; if ( !polygonCoordinates || - 'geometries' in polygonCoordinates || - polygonCoordinates.coordinates.length < 3 + polygonCoordinates.type !== 'Polygon' || + polygonCoordinates.coordinates[0].length < 3 ) { return []; } @@ -829,18 +840,19 @@ const NetworkMap = forwardRef( return ( setDragging(true)} onDragEnd={() => setDragging(false)} onContextMenu={onMapContextMenu} + mapLib={mapLib.mapLib as MapLib} > {displayOverlayLoader && renderOverlay()} {isManualRefreshBackdropDisplayed && ( @@ -904,7 +916,7 @@ function getSubstationsInPolygon( !geoData || !polygonCoordinates || polygonCoordinates.type !== 'Polygon' || - polygonCoordinates.coordinates.length < 3 + polygonCoordinates.coordinates[0].length < 3 ) { return []; } From 5d014bc1ea084bf8b2a6b8d0fde643f5bb7f7e16 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Fri, 26 Jul 2024 14:37:09 +0200 Subject: [PATCH 07/10] remove svg type --- src/types/svg.d.ts | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 src/types/svg.d.ts diff --git a/src/types/svg.d.ts b/src/types/svg.d.ts deleted file mode 100644 index c2a2614b..00000000 --- a/src/types/svg.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.svg' { - const value: string; - export default value; -} From dd2696dc1e4fd479a028712187e3505d8cd8d825 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Fri, 26 Jul 2024 14:48:56 +0200 Subject: [PATCH 08/10] fix git ignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 50782a86..e46a8299 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,4 @@ # packages /packages/*/node_modules - +/packages/*/dist From 9173ca8baf999f8880bf711c1a30087300163e03 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Tue, 30 Jul 2024 09:57:05 +0200 Subject: [PATCH 09/10] use pot texture --- .../src/network/layers/arrow-layer.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/network-map-layers/src/network/layers/arrow-layer.ts b/packages/network-map-layers/src/network/layers/arrow-layer.ts index 507d3bed..b0e0c128 100644 --- a/packages/network-map-layers/src/network/layers/arrow-layer.ts +++ b/packages/network-map-layers/src/network/layers/arrow-layer.ts @@ -295,9 +295,12 @@ export class ArrowLayer extends Layer> { // we calculate the smallest texture width less or equals to MAX_TEXTURE_SIZE // (which is an property of the graphic card) const elementCount = data.length / elementSize; - const width = Math.min(maxTextureSize, elementCount); - const height = Math.ceil(elementCount / width); - if (height > maxTextureSize) { + const expSum = Math.ceil(Math.log2(elementCount)); + const widthExp = Math.ceil(expSum / 2); + const heightExp = expSum - widthExp; + const width = Math.pow(2, widthExp); + const height = Math.pow(2, heightExp); + if (height > maxTextureSize || width > maxTextureSize) { throw new Error( `Texture size ${width}*${height} cannot be greater than ${maxTextureSize}` ); @@ -306,8 +309,8 @@ export class ArrowLayer extends Layer> { // data length needs to be width * height (otherwise we get an error), so we pad the data array with zero until // reaching the correct size. const newLength = width * height * elementSize; + const oldLength = data.length; if (data.length < newLength) { - const oldLength = data.length; data.length = newLength; data.fill(0, oldLength, newLength); } @@ -329,7 +332,7 @@ export class ArrowLayer extends Layer> { const stop = performance.now(); console.info( - `Texture of ${newLength} elements (${width} * ${height}) created in ${ + `Texture of ${elementCount} elements of size ${elementSize} (${width} * ${height}) created in ${ stop - start } ms` ); From e4edeefa2a938aa821acfdc26507973da6bbd018 Mon Sep 17 00:00:00 2001 From: Arnaud Marant Date: Mon, 30 Sep 2024 17:35:09 +0200 Subject: [PATCH 10/10] fix type exports, deck/luma as peers, default fct --- package-lock.json | 1314 ++++++++++++----- package.json | 4 +- packages/network-map-layers/package.json | 7 +- packages/network-map-layers/src/index.ts | 8 +- .../src/network/geo-data.ts | 4 +- .../src/network/line-layer.ts | 5 +- .../src/network/substation-layer.ts | 3 +- packages/network-map-layers/vite.config.ts | 2 +- .../single-line-diagram-viewer/package.json | 7 +- 9 files changed, 951 insertions(+), 403 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32f80cf9..479a6faf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@powsybl/diagram-viewer", - "version": "0.5.1", + "version": "0.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@powsybl/diagram-viewer", - "version": "0.5.1", + "version": "0.6.0", "license": "MPL-2.0", "workspaces": [ "packages/network-map-layers", @@ -20,7 +20,7 @@ "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^9.0.24", + "deck.gl": "^9.0.31", "geolib": "^3.3.4", "mapbox-gl": "^3.4.0", "maplibre-gl": "^4.5.0", @@ -76,6 +76,10 @@ "react-intl": "^6.6.4" } }, + "node_modules/@amarant/single-line-diagram-viewer": { + "resolved": "packages/single-line-diagram-viewer", + "link": true + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -90,9 +94,9 @@ } }, "node_modules/@arcgis/core": { - "version": "4.30.8", - "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.30.8.tgz", - "integrity": "sha512-nb1PwcPcqIKwSBb0wGF3DAHnA+G/2xcgXoZCVZQo4pvQSBTJQNvuXDxFhTCugsAAPh96FiQ4FL6ibEFO/jM9lA==", + "version": "4.30.9", + "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.30.9.tgz", + "integrity": "sha512-tOM6QmXRikmD26uqIsFk2yxBwUpmAYJjp4vd9tl+VEfAXaLyArjHC8/op/OvyJZtfHNiL5zcSR7/YsiUddHPXA==", "peer": true, "dependencies": { "@esri/arcgis-html-sanitizer": "~4.0.3", @@ -1907,49 +1911,49 @@ } }, "node_modules/@deck.gl/aggregation-layers": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.24.tgz", - "integrity": "sha512-Of6f/yZNqpfL8+j0+5J9z7RTGjxo8D3Lo1vK1bSbLe+zITcvCazwCw+0+DaedKjorFglZoXgdOnTGR30ukuVhg==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.31.tgz", + "integrity": "sha512-yjTZoh0TGBxMCYbFJe+UljVwVvrbOKrprT2Orf5jClqPzSK8nmO0cLGG0Mg969Sv/M+5zImmIb5xiRSISpPJQQ==", "dependencies": { - "@luma.gl/constants": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/constants": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/web-mercator": "^4.0.0", "d3-hexbin": "^0.2.1" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", "@deck.gl/layers": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/arcgis": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.0.24.tgz", - "integrity": "sha512-5Xs0doIRaR2xutWffHX+avcD/mZmnWly3zH7d7iT+h9DcUtHMFypcF+apKxgm0LwSGV8oEH7xuCD7Fei3yJlTQ==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.0.31.tgz", + "integrity": "sha512-DuR8nT9sUba08cOengC1rsCjpXIlLwBCe2F3GK3yZtUTMfKHi1L/rhXCm2zIYcVICaELURxEtVx/bFARXug7Iw==", "dependencies": { - "@luma.gl/constants": "^9.0.15", + "@luma.gl/constants": "~9.0.27", "esri-loader": "^3.7.0" }, "peerDependencies": { "@arcgis/core": "^4.0.0", "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/carto": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.24.tgz", - "integrity": "sha512-SvQVzxErHHAdvp7SOB7zF5oIILm+QY7xjsQjUhXCJ4NsjSGzt3J0pKi8wqtuMzcLnopjMfDv34y8rbbYizGaHA==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.31.tgz", + "integrity": "sha512-go9zErSGm53OiyprDFaseSv3IO57M/PYaoT/NBMQ44gcxrKuavQb+ucMMCw/GWHJZfnyk+Phe0cPRBeAC7A58A==", "dependencies": { "@loaders.gl/gis": "^4.2.0", "@loaders.gl/loader-utils": "^4.2.0", "@loaders.gl/mvt": "^4.2.0", "@loaders.gl/schema": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", - "@luma.gl/core": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/core": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/web-mercator": "^4.0.0", "@types/d3-array": "^3.0.2", "@types/d3-color": "^1.4.2", @@ -1975,17 +1979,17 @@ } }, "node_modules/@deck.gl/core": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.24.tgz", - "integrity": "sha512-S27HfFg9SqqMZ1v5LwFFKpDg1npFmR7kRJXVL0FckmRbqdSdXE0UE6srCsOa787urGREMPUvxi0WDG9HO8Ve7w==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.31.tgz", + "integrity": "sha512-cRjDebDfn4Sil7IcSEjQO+10/tVVzR5MunFu9HpYdiKirzYdPih4SHp/KODrcPtk4qim6B3s70hxPtfD4+uWnQ==", "dependencies": { "@loaders.gl/core": "^4.2.0", "@loaders.gl/images": "^4.2.0", - "@luma.gl/constants": "^9.0.15", - "@luma.gl/core": "^9.0.15", - "@luma.gl/engine": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", - "@luma.gl/webgl": "^9.0.15", + "@luma.gl/constants": "~9.0.27", + "@luma.gl/core": "~9.0.27", + "@luma.gl/engine": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", + "@luma.gl/webgl": "~9.0.27", "@math.gl/core": "^4.0.0", "@math.gl/sun": "^4.0.0", "@math.gl/web-mercator": "^4.0.0", @@ -1998,24 +2002,24 @@ } }, "node_modules/@deck.gl/extensions": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.24.tgz", - "integrity": "sha512-iIGDN94dUe3OarjoSwemX6/bZhFX51wdzqelEPYuEe/F4xlYFFClsDMzROJ34QAdtXULKnG9Adgi101w4oYQgA==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.31.tgz", + "integrity": "sha512-ZTNfJIBCRXXugD52AWFNH5PLbAQfp25gvm73GTwbXIF5fHz7Ru2tqpBecxSpQJwfWVFGShPmhP8kPJZ/gUrhUQ==", "dependencies": { - "@luma.gl/constants": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/constants": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/core": "^4.0.0" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/geo-layers": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.24.tgz", - "integrity": "sha512-7HS9Y/EMs1KdIDtyCVaUf/0w7tklsjohbfalEd5KiGlCpYfkPypqFyL5otJq+QMYziWuuIsci71mfzKwBm63xQ==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.31.tgz", + "integrity": "sha512-EFDSExoBB0D75m4HhfOJbi4+MtUUbvsAEvWXAmpUjv2VFs8iJQh440cggl3CjjXqSgKDLlUe97XS05vBlSprcw==", "dependencies": { "@loaders.gl/3d-tiles": "^4.2.0", "@loaders.gl/gis": "^4.2.0", @@ -2025,8 +2029,8 @@ "@loaders.gl/terrain": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", "@loaders.gl/wms": "^4.2.0", - "@luma.gl/gltf": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/gltf": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/core": "^4.0.0", "@math.gl/culling": "^4.0.0", "@math.gl/web-mercator": "^4.0.0", @@ -2040,28 +2044,28 @@ "@deck.gl/layers": "^9.0.0", "@deck.gl/mesh-layers": "^9.0.0", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/google-maps": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.24.tgz", - "integrity": "sha512-/c6ssGImqWNtJjQmc4o70ZVTRUHGo5zoNiDf90SosIsJKYhKeEPzc+t5jDpF5cP26lsbmA+N6fAgi1Oc6jJ+dQ==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.31.tgz", + "integrity": "sha512-Irl0RUg2/dyS0B0mQ57v80BZZpP6fq40lF4CDFRevBw0QOlexRZic04MpBSQANBNFTmTPu3jcwqOKDl5oFGPRQ==", "dependencies": { - "@luma.gl/constants": "^9.0.15", + "@luma.gl/constants": "~9.0.27", "@math.gl/core": "^4.0.0", "@types/google.maps": "^3.48.6" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0" + "@luma.gl/core": "~9.0.0" } }, "node_modules/@deck.gl/json": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.24.tgz", - "integrity": "sha512-m+28f62en2eyt39xS7FkaEaqtog6stEKcKji9tmsAJPHGlLiymRMEqvJNMDHbMGpqTg8dZPiEJpivxZzVSOS4A==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.31.tgz", + "integrity": "sha512-fZmBKHywIU2K0uhLbHLdOAbu3wVtlDnq65KLw8s2oPCUS8m3ZJ/8mB6kqa7+hV5/cA7EIZk49zFJlw4Hyd3XYw==", "dependencies": { "expression-eval": "^5.0.0" }, @@ -2070,9 +2074,9 @@ } }, "node_modules/@deck.gl/layers": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.24.tgz", - "integrity": "sha512-P34fCYGZhMMmoslDD182u4onTxGOH9/9MBDa420RM5fGXq9PkzV9RCFZoW6Rd2S4684b3K96zcwi5jy6pzkeBA==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.31.tgz", + "integrity": "sha512-HqQIClj1t6nHTavALSAaMonREIOZ44HMHz7FLTIiBGq/phJNLAAgO9jxcgh3XLDm7hicfFpid6CSzFdMR9Ls0w==", "dependencies": { "@loaders.gl/images": "^4.2.0", "@loaders.gl/schema": "^4.2.0", @@ -2085,42 +2089,42 @@ "peerDependencies": { "@deck.gl/core": "^9.0.0", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/mapbox": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.24.tgz", - "integrity": "sha512-uJpxCIfqUb5053C3xCANPptgJA3LnvBXz1h5NoB3CEqz9pLdrLOlcNggx0KchHyAsC5ZQgM8WfwxKuajhn9+ag==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.31.tgz", + "integrity": "sha512-QAGpkBT02OBHwUEuDhrovj0e7F+qEFyYni1HuzbYnHN8AxPYkklZCdCv1RwLjA0DQ4TehUepOpm6XtavzODGhg==", "dependencies": { - "@luma.gl/constants": "^9.0.15", + "@luma.gl/constants": "~9.0.27", "@math.gl/web-mercator": "^4.0.0" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0" + "@luma.gl/core": "~9.0.0" } }, "node_modules/@deck.gl/mesh-layers": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.24.tgz", - "integrity": "sha512-GkPE+lCHGyTd6XqJaOZxSgCAg5Ym/K6U+NJYAnYBoANyPDnkqsFIRYPt40Ymb8/21DQh0NRCXi2s8htbUIUJsg==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.31.tgz", + "integrity": "sha512-cclhguAuJUH6tcW1bQGn3KfVvSEz0OPhrSX/D6mqBoFeSLcEeGARSj9l1ApOs3WWHbPqSvRukyJkz8oVaqmE3Q==", "dependencies": { "@loaders.gl/gltf": "^4.2.0", - "@luma.gl/gltf": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15" + "@luma.gl/gltf": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/react": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.24.tgz", - "integrity": "sha512-gVJTcE7IpIHnfgtu8XzoxQloy+rtyLs3tmzCjy90B4/gEkQCbhBh+hJBa13YgLUIhrkCZmgwiLVg/gCOV8UwRQ==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.31.tgz", + "integrity": "sha512-AZTIdYHDydsunfEDiL1+CY6SUqkz8BGzJ6R6iofY0vFO3g3uqBBnX5YUrg6cy9MXDr8mo3r8634a2ACQm1QbgQ==", "peerDependencies": { "@deck.gl/core": "^9.0.0", "react": ">=16.3.0", @@ -2128,9 +2132,9 @@ } }, "node_modules/@deck.gl/widgets": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.24.tgz", - "integrity": "sha512-k6T3g4dVamXY/EnRjOHuI4M9DWLkgVb1sKc5u+aXODDFJZrYN0d8yR0TKMF5028FQ6XLfOb7cADlQ2F6bjYaqQ==", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.31.tgz", + "integrity": "sha512-ZvjFBbAR8W9Lo7DULZM5Tjt+pnlkF0i9rYAJSFH2Xox0SVnFl54euyKHSjLd3/kd6ppu3114BAkxioVQzz6qbA==", "dependencies": { "preact": "^10.17.0" }, @@ -2774,21 +2778,24 @@ "peer": true }, "node_modules/@esri/calcite-components": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-2.10.1.tgz", - "integrity": "sha512-8M2ZBYcEk20x34TDxZ6H5rLCWtGrOJLtHA/k6yWL/GJTC85/gvY153XxbGN8F1ywJb/3imvhy/SlfNRPnVPQNQ==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-2.12.2.tgz", + "integrity": "sha512-Fmm7WpG+B7il0mpf7grL0ZsFJ06y6g04fGgcnpjLCjhmqy+kKiv8NFeMX529kVr5uyb43dcVOcbd/bv5RniJxg==", "peer": true, "dependencies": { - "@floating-ui/dom": "1.6.5", - "@stencil/core": "4.18.3", + "@esri/calcite-ui-icons": "3.31.0", + "@floating-ui/dom": "1.6.10", + "@stencil/core": "4.20.0", "@types/color": "3.0.6", + "@types/sortablejs": "1.15.7", "color": "4.2.3", - "composed-offset-position": "0.0.4", - "dayjs": "1.11.11", + "composed-offset-position": "0.0.6", + "dayjs": "1.11.12", "focus-trap": "7.5.4", + "interactjs": "1.10.27", "lodash-es": "4.17.21", "sortablejs": "1.15.1", - "timezone-groups": "0.8.0", + "timezone-groups": "0.9.1", "type-fest": "4.18.2" } }, @@ -2810,6 +2817,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@esri/calcite-ui-icons": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@esri/calcite-ui-icons/-/calcite-ui-icons-3.31.0.tgz", + "integrity": "sha512-Ca3xVXU0LoxljEebuM9r3ss4tyXBfHROcxlFmbNwa2kDTVNSjUKCBgthgXnMD7akgguwwcL7zGnAp645SkJpow==", + "peer": true, + "bin": { + "spriter": "bin/spriter.js" + } + }, "node_modules/@floating-ui/core": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", @@ -2819,12 +2835,12 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/react-dom": { @@ -2841,9 +2857,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.18.2", @@ -2981,6 +2997,12 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@interactjs/types": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz", + "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==", + "peer": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3706,9 +3728,9 @@ } }, "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", - "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", + "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==", "peer": true }, "node_modules/@lit/reactive-element": { @@ -3721,19 +3743,19 @@ } }, "node_modules/@loaders.gl/3d-tiles": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.2.2.tgz", - "integrity": "sha512-op7KelDjEahz+ViFmavJdHw10n6lRZeTefC/cVYVQ1Jfvb8T+55KaOOXGoZODo14/B8Z53FnyPGVqR68dBYARw==", - "dependencies": { - "@loaders.gl/compression": "4.2.2", - "@loaders.gl/crypto": "4.2.2", - "@loaders.gl/draco": "4.2.2", - "@loaders.gl/gltf": "4.2.2", - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/math": "4.2.2", - "@loaders.gl/tiles": "4.2.2", - "@loaders.gl/zip": "4.2.2", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.2.4.tgz", + "integrity": "sha512-SIBzJwnkxWL6EOict3bIONWaJSP9eXej2M6i9GrdlcG5Ge7lLYRyxVFPbDxPXd3pQtDix127gd0+c0j+fD31KA==", + "dependencies": { + "@loaders.gl/compression": "4.2.4", + "@loaders.gl/crypto": "4.2.4", + "@loaders.gl/draco": "4.2.4", + "@loaders.gl/gltf": "4.2.4", + "@loaders.gl/images": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/math": "4.2.4", + "@loaders.gl/tiles": "4.2.4", + "@loaders.gl/zip": "4.2.4", "@math.gl/core": "^4.0.1", "@math.gl/culling": "^4.0.1", "@math.gl/geospatial": "^4.0.1", @@ -3744,18 +3766,50 @@ "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/3d-tiles/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/3d-tiles/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/3d-tiles/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/3d-tiles/node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/@loaders.gl/compression": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.2.2.tgz", - "integrity": "sha512-dBFjMe4zLhE4NXfVsPkhs267/55qnxgP/AIhksOKTx30gQxCtcty6RWhfWGnluTnbAEXID2Uq/vfp1HYH7ZYCg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.2.4.tgz", + "integrity": "sha512-Ce+JGux4nNWTc5+F5GWOBlWdjsYoX2G5tr4V/j3z1ho/mVztZ31/+MJyDtYquxl3FrZ0yl4PiT4rBm4OK2ku+A==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", "@types/brotli": "^1.3.0", "@types/pako": "^1.0.1", "fflate": "0.7.4", @@ -3772,6 +3826,38 @@ "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/compression/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/compression/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/compression/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/core": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.2.2.tgz", @@ -3784,39 +3870,103 @@ } }, "node_modules/@loaders.gl/crypto": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.2.2.tgz", - "integrity": "sha512-0rbpHX8784wkcTb8+gjkzAxdA4p2CH3W5xxzdvpG4r37jVQwKYrh2NJxeF+xGIuuxlEaxD8x4kcyadKgCVtspA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.2.4.tgz", + "integrity": "sha512-rAIREpLd1Dk0CTMSXQWzaZ8//PjoXL2vUGlh4WsAoeIRf/sAekQzk1nALaL8yqBQSNquK4f++vK0YDrFrVr6iQ==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", "@types/crypto-js": "^4.0.2" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/crypto/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/crypto/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/crypto/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/draco": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.2.2.tgz", - "integrity": "sha512-WM7Zw6+04QzqlXjUYibR63Zi4I2iuBaDR41Rguur1s+ns2faiHDyEvuFlKtArTChFPQ8Xzf+6MNt7JeR8kpZTA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.2.4.tgz", + "integrity": "sha512-pPJ9x9KMCrCU71PvOXOi+9tL3TykFqmY/3msq3f8TKZEH/wnotVX4nIeL7xD7hrkY1nBvMp1q0WZPyDfMRrl7A==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", "draco3d": "1.5.7" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/draco/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/draco/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/draco/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/gis": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.2.2.tgz", - "integrity": "sha512-s9kD6yLMKn8+jAhDFDVWBeeKcDkJHFrscTnVWveGBfnC7IYT4gD6lQeHRIfXrJKs0LWmKPrAS8grTq7Ull8V6Q==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.2.4.tgz", + "integrity": "sha512-TwBOjhF/mrqukBP/ia2AwjMLg5ocZQxnobGj+rZMYjagMKeHtnoZjgr17d2YPbvCTUobzIS5xQ083YJ8iXkK/A==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", "@mapbox/vector-tile": "^1.3.1", "@math.gl/polygon": "^4.0.0", "pbf": "^3.2.1" @@ -3825,33 +3975,129 @@ "@loaders.gl/core": "^4.0.0" } }, - "node_modules/@loaders.gl/gltf": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.2.2.tgz", - "integrity": "sha512-AK90PnRoaZ1jw/QWkg6TEJG8Yxd/QefxwlbMRJvtgk7QafsYo8dMm0e7EYgyOms0wDOcPflm5LHkIoqViRp/ww==", + "node_modules/@loaders.gl/gis/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", "dependencies": { - "@loaders.gl/draco": "4.2.2", - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/textures": "4.2.2", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/gis/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/gis/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/gltf": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.2.4.tgz", + "integrity": "sha512-7nczbGkYrQhQeIUQ0LNQZFVxJZleD2R6sTGaxl9OPNK44Q52QTd5UfOc2gaQx/Is4BP9HI60YP45jkqG4PMtvg==", + "dependencies": { + "@loaders.gl/draco": "4.2.4", + "@loaders.gl/images": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/textures": "4.2.4", "@math.gl/core": "^4.0.0" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/gltf/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/gltf/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/gltf/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/images": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.2.2.tgz", - "integrity": "sha512-R53rkexvVT0i4YXt++r8gLq3reB6kWTLvdJL81J3R4YJbM5+kNSe40jJOA94LFYlsTN+oirF4lkLTe5YXGZPYQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.2.4.tgz", + "integrity": "sha512-g0pcuq4dVlKfgu+U99s8//Z/aawEkMBOzurXd+WVVFmcVsgCer4jKSywyn6UGbaV5ITPO9GUQCq9HQbah9zXjQ==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2" + "@loaders.gl/loader-utils": "4.2.4" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/images/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/images/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/images/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/loader-utils": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.2.tgz", @@ -3866,27 +4112,59 @@ } }, "node_modules/@loaders.gl/math": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.2.2.tgz", - "integrity": "sha512-nfiNNxXobhdKJILlHDWvm92SMEMMh1XAsb4BYvRIHyTzw4KzflFMS6C62v8ctAW6P8pQKyRvuos9LcRyroty1A==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.2.4.tgz", + "integrity": "sha512-t4uOoIhED+YCHUwWEojC3KmyYtBT2FYp7qL8ydfUK8VuOOvj2kQOXUxvIc98FQUzI7L7T6EMLLlpP/snRdTvHw==", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/images": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", "@math.gl/core": "^4.0.0" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, - "node_modules/@loaders.gl/mvt": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.2.2.tgz", - "integrity": "sha512-KglhYp1rwIs6h6AtrmKjrEYWxcX6xhlG3c3pTIFJwfA5nMBa+cmzD19vBRo1po9hzWKq4oqqhi7JL0ovH6GAqw==", + "node_modules/@loaders.gl/math/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", "dependencies": { - "@loaders.gl/gis": "4.2.2", - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/math/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/math/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/mvt": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.2.4.tgz", + "integrity": "sha512-ZqdUrBvl+edCaBhnMdwBLvwyaH/M8MMfjNeIS1aADA8SGB3PghM6G42kfdQzw0ZoLT9DY3DbzyoTja2ojRVipg==", + "dependencies": { + "@loaders.gl/gis": "4.2.4", + "@loaders.gl/images": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", "@math.gl/polygon": "^4.0.0", "pbf": "^3.2.1" }, @@ -3894,6 +4172,38 @@ "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/mvt/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/mvt/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/mvt/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/schema": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.2.tgz", @@ -3906,28 +4216,60 @@ } }, "node_modules/@loaders.gl/terrain": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.2.2.tgz", - "integrity": "sha512-M5wDS20y0TTq9giCONLOWSIznD9H4JxfU1wicyEGUOa8U2u0Fdau5TObr//fOcT+Tvemkvcn01Oxj8acJWIsGw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.2.4.tgz", + "integrity": "sha512-c7gQxNgQlUeiwSFvL0+v0Jgt/Tm0hQ61/FF+TdhBpSFCal1W2VVmK6Tehra00EUsgHzoOrmnN8LpHj89vtDOow==", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", + "@loaders.gl/images": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", "@mapbox/martini": "^0.2.0" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, - "node_modules/@loaders.gl/textures": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.2.2.tgz", - "integrity": "sha512-UlxCCi7VbCloj4VCzSULASgGVA059jglQYLc3kIHclvGoMcx3MJi0hID0MEQ6IhdO9Zyn4F42doVPrriNDVJFQ==", + "node_modules/@loaders.gl/terrain/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/terrain/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/terrain/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/textures": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.2.4.tgz", + "integrity": "sha512-0WrQfGnbjm8PzJiHeQa7K65qDmfW3FhOxfsCsk+alsZjFJTDIS6jaOfA2sA+BD0s8OYTsb/AZR5OAFnR1ZyVyg==", + "dependencies": { + "@loaders.gl/images": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", "@math.gl/types": "^4.0.1", "ktx-parse": "^0.0.4", "texture-compressor": "^1.0.2" @@ -3936,13 +4278,45 @@ "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/textures/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/textures/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/textures/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/tiles": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.2.2.tgz", - "integrity": "sha512-mozBA1FOrOFXa0lBxrRvHoRxsSb9T8D6ZfFIpbVR1z0zEWKm+NgRQzO8yS4IJD/CPFOn/r31SolZII6yXnzWbg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.2.4.tgz", + "integrity": "sha512-2QlCN7ZZXZLerikw8M0UlcD9prBHljTaMFaGhwMTmgt0G99BOZ12Py40ap++ZVUllSWWtb9Qs/mx4j57ElaQWQ==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/math": "4.2.2", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/math": "4.2.4", "@math.gl/core": "^4.0.0", "@math.gl/culling": "^4.0.0", "@math.gl/geospatial": "^4.0.0", @@ -3953,15 +4327,47 @@ "@loaders.gl/core": "^4.0.0" } }, - "node_modules/@loaders.gl/wms": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.2.2.tgz", - "integrity": "sha512-MoZqOgebyXsElfNbjX/el4jA9Rypusq7Z+cJ1tiP2yBTepuLkPBpXLeuUgt/v0MOqGoUWrkUY8I811ijkZYyjA==", + "node_modules/@loaders.gl/tiles/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/xml": "4.2.2", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/tiles/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/tiles/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/wms": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.2.4.tgz", + "integrity": "sha512-uFpEhoxDkdKpVqG84QvQ1l7Ce+t+sqJpJCCGRKx+6GYJvk7CdzeaGGvXXxnzJlcc7a6BqHESSLdYPjZ/F6aqUQ==", + "dependencies": { + "@loaders.gl/images": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/xml": "4.2.4", "@turf/rewind": "^5.1.5", "deep-strict-equal": "^0.2.0" }, @@ -3969,6 +4375,38 @@ "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/wms/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/wms/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/wms/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/worker-utils": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.2.tgz", @@ -3978,26 +4416,58 @@ } }, "node_modules/@loaders.gl/xml": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.2.2.tgz", - "integrity": "sha512-ADikkGCwkS6d2IwFPomVAZfTNEHC6xXqDFbzfhYThsG3ptPpeosjJmn4GdI4dyazTsQnKIeiqV/RLS4CvJgxzw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.2.4.tgz", + "integrity": "sha512-edaO7TbzqE96zTKMzxm2/kfTWEg+a3nGO7ztmMXtAfIohxyVp2/JCPBLEzAJAnGXQP36Ro5GfnVw53dX9kO/Bw==", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", + "@loaders.gl/loader-utils": "4.2.4", + "@loaders.gl/schema": "4.2.4", "fast-xml-parser": "^4.2.5" }, "peerDependencies": { "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/xml/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/xml/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/xml/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@loaders.gl/zip": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.2.2.tgz", - "integrity": "sha512-8wuhWrmGFUb9X7i1E9ObhqyiYuwQj6x0ttzujXE6o83T8TI1i88fySttMe0LSV2aIrTLo8A5n6MOf2LPSefPYg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.2.4.tgz", + "integrity": "sha512-jhKytc9Kg8ie6wLqyVrRtr/1azCz7QPzKyEtsQ697YS/XXyG5vcBv1LWGMe1M5leTj9+g0AhJly4y/heIxjMlg==", "dependencies": { - "@loaders.gl/compression": "4.2.2", - "@loaders.gl/crypto": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/compression": "4.2.4", + "@loaders.gl/crypto": "4.2.4", + "@loaders.gl/loader-utils": "4.2.4", "jszip": "^3.1.5", "md5": "^2.3.0" }, @@ -4005,15 +4475,47 @@ "@loaders.gl/core": "^4.0.0" } }, + "node_modules/@loaders.gl/zip/node_modules/@loaders.gl/loader-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.2.4.tgz", + "integrity": "sha512-ay9L8CQLY3db/PfJa+vDwyxmpxHtbe77BASfKRj/FWKrs3ydh1MxrQc6PWaHDL83YpG30wRBXGUEmPTkCvJqlw==", + "dependencies": { + "@loaders.gl/schema": "4.2.4", + "@loaders.gl/worker-utils": "4.2.4", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/zip/node_modules/@loaders.gl/schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.2.4.tgz", + "integrity": "sha512-43M18e/kaVqwFfvTLkFfJS3CdzLGwXJG+Va9BSMlGydWb7P7KCqNenZ1ZtLP3RElUpVZv3hNWdtpxk+fLQrZaA==", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, + "node_modules/@loaders.gl/zip/node_modules/@loaders.gl/worker-utils": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.2.4.tgz", + "integrity": "sha512-QDrGqRaOu/AGgQfp4nIMIZSp7PXd38M2b96OKIlhvh1GWXXspTINqY7hVlaaRaRqktSZOm6+4nKcpleLVP0MzA==", + "peerDependencies": { + "@loaders.gl/core": "^4.0.0" + } + }, "node_modules/@luma.gl/constants": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.16.tgz", - "integrity": "sha512-uVbtpTON0HYfX8MqgQ+wz+Hh9EvvTq0F1QXNtWjpizLsRFJIeWGO3a7uqz6Y6pzvzqCCYdN/GPGo/t+Vxt/D/w==" + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.27.tgz", + "integrity": "sha512-NBkMim3u0xt4UDe4e69L6E/pq5XNxfX60GrggJDzfilVRfIbx5XwKhBXTyNjjtNEk4oc6uYLHWd/05jGRHcfLg==" }, "node_modules/@luma.gl/core": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.16.tgz", - "integrity": "sha512-PutSJOJuVzZAlE1Jh4j0dr4+xyr9CQuoOPkK1XTwqQ+Yjo4Fyjz4Fx1Wnyh6KmAmCFrdnYxcztbIiBWONir49Q==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.27.tgz", + "integrity": "sha512-7OXM8ZknTuqt10nL8XHg3YzaHESzU2pSh+6BknLJbLM+UjNWOkDHArF6pRYu96Om0QsnOMK/RXKqXBr+Ni0gvw==", "dependencies": { "@math.gl/types": "^4.0.0", "@probe.gl/env": "^4.0.2", @@ -4023,11 +4525,11 @@ } }, "node_modules/@luma.gl/engine": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.16.tgz", - "integrity": "sha512-A/gIQts5DeJTeuJyim6kxTNTOETEFcpGRZN5Ht7u/iP8CrTMJKPCTz/aaXEcvn926tsvLqneeARY80jjy3kKiQ==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.27.tgz", + "integrity": "sha512-O4e7RbIjBJX5WLs8HJLjpccYEkcans4pz8+TI8Y7BO7gDq9ZbEASbVd5CT53jFLfTjnRuqAOpElfaXwQ/B7oWg==", "dependencies": { - "@luma.gl/shadertools": "9.0.16", + "@luma.gl/shadertools": "9.0.27", "@math.gl/core": "^4.0.0", "@probe.gl/log": "^4.0.2", "@probe.gl/stats": "^4.0.2" @@ -4037,12 +4539,12 @@ } }, "node_modules/@luma.gl/gltf": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.16.tgz", - "integrity": "sha512-n7mfJVl/WgQ0/9h995p17x96LlLQ5Vb+af7RzkCgqW/Se5fwRFXp9+lGilPHLAdbPeaKKrt9IiOlKtZ0ruQ0Pg==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.27.tgz", + "integrity": "sha512-AeYdX25G35KKGnGVzIkrKl8ni9SWVo0VP/9lfMyEom3syIBYlWtkPLwJ2Gm6SU4ZZfcpWK/17UgK2r2TSWFIJw==", "dependencies": { "@loaders.gl/textures": "^4.2.0", - "@luma.gl/shadertools": "9.0.16", + "@luma.gl/shadertools": "9.0.27", "@math.gl/core": "^4.0.0" }, "peerDependencies": { @@ -4052,9 +4554,9 @@ } }, "node_modules/@luma.gl/shadertools": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.16.tgz", - "integrity": "sha512-mWDrGxzI9dYTzTN8dEBifWmpFpTXq6sWF8JDj2KcB6Lza63jbxlFUZ/gkCydiZoFkgrh1QjDaJM8dayfYyV/wQ==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.27.tgz", + "integrity": "sha512-JcOuYH2Fh4uljinXKbR04en1dqEthlJNdqV5efQ0fE9NetJul7Pkq+N1v/Oo8/vmJn9ZqEC49dgZHwtbzY8UnQ==", "dependencies": { "@math.gl/core": "^4.0.0", "@math.gl/types": "^4.0.0", @@ -4065,11 +4567,11 @@ } }, "node_modules/@luma.gl/webgl": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.16.tgz", - "integrity": "sha512-dfddcdGH8PuVYzecL/PDXGnEX1pWfVZ0Q/ALo1/h5S0gfmikyiQodyBK2S98JJUDc+qbL5db5LoiGGeeNm0uUg==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.27.tgz", + "integrity": "sha512-GOzOiDfTFgT4If1XSeCqXswKrgXVwTyuf/1W21Vv7fs5inub5p3LISmZglrt/RcdaGyXQQ5zEqf/+x67dGTeYw==", "dependencies": { - "@luma.gl/constants": "9.0.16", + "@luma.gl/constants": "9.0.27", "@probe.gl/env": "^4.0.2" }, "peerDependencies": { @@ -4237,21 +4739,49 @@ } }, "node_modules/@math.gl/culling": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@math.gl/culling/-/culling-4.0.1.tgz", - "integrity": "sha512-lv83sMKp0n1HjORhuNtWgX9ylYyj+/zHEPF0xxRXZvcpurB85fhgFLhvR81KLjmSbhQmFgzl0fZe7Ei3WxEP5Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/culling/-/culling-4.1.0.tgz", + "integrity": "sha512-jFmjFEACnP9kVl8qhZxFNhCyd47qPfSVmSvvjR0/dIL6R9oD5zhR1ub2gN16eKDO/UM7JF9OHKU3EBIfeR7gtg==", "dependencies": { - "@math.gl/core": "4.0.1" + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" + } + }, + "node_modules/@math.gl/culling/node_modules/@math.gl/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-4.1.0.tgz", + "integrity": "sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==", + "dependencies": { + "@math.gl/types": "4.1.0" } }, + "node_modules/@math.gl/culling/node_modules/@math.gl/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-4.1.0.tgz", + "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==" + }, "node_modules/@math.gl/geospatial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@math.gl/geospatial/-/geospatial-4.0.1.tgz", - "integrity": "sha512-FfTUMk8uRlBa4W3dMSFwPjRgdEBnOeVjBr3mcGqb3lHA/PPMvKuE+o7OJfA61Wj6ItuZqCEZHbLbA3WRAENoqQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/geospatial/-/geospatial-4.1.0.tgz", + "integrity": "sha512-BzsUhpVvnmleyYF6qdqJIip6FtIzJmnWuPTGhlBuPzh7VBHLonCFSPtQpbkRuoyAlbSyaGXcVt6p6lm9eK2vtg==", "dependencies": { - "@math.gl/core": "4.0.1" + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" } }, + "node_modules/@math.gl/geospatial/node_modules/@math.gl/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-4.1.0.tgz", + "integrity": "sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==", + "dependencies": { + "@math.gl/types": "4.1.0" + } + }, + "node_modules/@math.gl/geospatial/node_modules/@math.gl/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-4.1.0.tgz", + "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==" + }, "node_modules/@math.gl/polygon": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-4.0.1.tgz", @@ -5132,9 +5662,9 @@ } }, "node_modules/@stencil/core": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.18.3.tgz", - "integrity": "sha512-8yoG5AFQYEPocVtuoc5kvRS0Hku0MoDWDUpADRaXPVHsOFLmxR16LJENj25ucCz5GEfeTGQ/tCE8JAypPmr/fQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.20.0.tgz", + "integrity": "sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg==", "peer": true, "bin": { "stencil": "bin/stencil" @@ -5632,18 +6162,18 @@ } }, "node_modules/@types/color-convert": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.3.tgz", - "integrity": "sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.4.tgz", + "integrity": "sha512-Ub1MmDdyZ7mX//g25uBAoH/mWGd9swVbt8BseymnaE18SU4po/PjmCrHxqIIRjBo3hV/vh1KGr0eMxUhp+t+dQ==", "peer": true, "dependencies": { - "@types/color-name": "*" + "@types/color-name": "^1.1.0" } }, "node_modules/@types/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.5.tgz", + "integrity": "sha512-j2K5UJqGTxeesj6oQuGpMgifpT5k9HprgQd8D1Y0lOFqKHl3PJu5GMeS4Y5EgjS55AE6OQxf8mPED9uaGbf4Cg==", "peer": true }, "node_modules/@types/crypto-js": { @@ -5719,9 +6249,9 @@ } }, "node_modules/@types/google.maps": { - "version": "3.55.11", - "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.55.11.tgz", - "integrity": "sha512-F3VuPtjKj4UGuyym75pqmgPBOHbT/i7I6/D+4DdtSzbeu2aWZG1ENwpbZOd46uO+PSAz9flJEhxxi+b4MVb4gQ==" + "version": "3.58.1", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", + "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", @@ -5909,6 +6439,12 @@ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@types/sortablejs": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.7.tgz", + "integrity": "sha512-PvgWCx1Lbgm88FdQ6S7OGvLIjWS66mudKPlfdrWil0TjsO5zmoZmzoKiiwRShs1dwPgrlkr0N4ewuy0/+QUXYQ==", + "peer": true + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -6177,38 +6713,38 @@ } }, "node_modules/@vaadin/a11y-base": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.18.tgz", - "integrity": "sha512-qa8oduy74CCPEe1ORF03ZSV91cCWePD/6dFuFkPn1t6oX2CZzsCm9vu0S0fGIbAIYfoJ4W0eVXnuEGwYdmIDQQ==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.22.tgz", + "integrity": "sha512-QrVsB7R+WGHlwEzVyvhwL6HvAGErF6CHTDBEyvKyt3jmjIqRDiCBGjvq6g/SHYUUNQNH1u892ANXGHLAQGGqLQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.18", + "@vaadin/component-base": "~24.3.22", "lit": "^3.0.0" } }, "node_modules/@vaadin/checkbox": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.18.tgz", - "integrity": "sha512-bRJT6/hYODuue5mfE9D2eHiciEO6C69nFjo7ZoUM70+A66mTQ1DXX/8BujvjLAlH8jzmeHeS/AejmudowiC7Lg==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.22.tgz", + "integrity": "sha512-x5oHFsvyptS3gmDv60ArHPeziFWUu7w/26NIhKb2UIwK/Xm83Ot2GufX7O15w5v+o4CewZPHV3+HtbCsYXih6Q==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.18", - "@vaadin/component-base": "~24.3.18", - "@vaadin/field-base": "~24.3.18", - "@vaadin/vaadin-lumo-styles": "~24.3.18", - "@vaadin/vaadin-material-styles": "~24.3.18", - "@vaadin/vaadin-themable-mixin": "~24.3.18", + "@vaadin/a11y-base": "~24.3.22", + "@vaadin/component-base": "~24.3.22", + "@vaadin/field-base": "~24.3.22", + "@vaadin/vaadin-lumo-styles": "~24.3.22", + "@vaadin/vaadin-material-styles": "~24.3.22", + "@vaadin/vaadin-themable-mixin": "~24.3.22", "lit": "^3.0.0" } }, "node_modules/@vaadin/component-base": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.18.tgz", - "integrity": "sha512-PINsCNytvoysWL/oBe7HBIEJL1lcc3ihFVTwDM0PB/uVMTRcM0JPMkP4/A1f/qZbTKjZnF2RIXIotexHxumZAg==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.22.tgz", + "integrity": "sha512-7BPgiDw1icpk9Ngw4uhsfIOqWRc6beeJnDpnyIOKoaLZUtoQOwNx1IQdH7mwwyEevbi86585JP/LS6p5k1dSLw==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", @@ -6219,88 +6755,88 @@ } }, "node_modules/@vaadin/field-base": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.18.tgz", - "integrity": "sha512-nVHXkaqT1LJVVjsAiWpg9bdEA3OAfERxA4fvKqkuFUK55aAVeQxCw3P8jWmVKRVd3m9UCmlLHnHuXmuD2R6ZwQ==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.22.tgz", + "integrity": "sha512-ZY799Clzqt6H7UUsdHuxz0jXhbVP1t5WbxzWest5s5cWBaUw089wBh0H8LBUobFM1LUu5/AYW6II7W3R2Dqi2w==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.18", - "@vaadin/component-base": "~24.3.18", + "@vaadin/a11y-base": "~24.3.22", + "@vaadin/component-base": "~24.3.22", "lit": "^3.0.0" } }, "node_modules/@vaadin/grid": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.18.tgz", - "integrity": "sha512-Cvg+D4mizhs5Wh4JdX+wkWfJzHD/Jp1CeahhjLxUD13BKrgtgwNj1IofFQD47lMMufK/5wi2ppeeD/MaINaE5A==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.22.tgz", + "integrity": "sha512-m+FtzBkD6Fd15XS/31vW5DkONQDV6T966HuhT+cKyZbmJ40/w+zfFk3F/OvTuT4MW6U2lBwpWQucAD1ucPHMdg==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.18", - "@vaadin/checkbox": "~24.3.18", - "@vaadin/component-base": "~24.3.18", - "@vaadin/lit-renderer": "~24.3.18", - "@vaadin/text-field": "~24.3.18", - "@vaadin/vaadin-lumo-styles": "~24.3.18", - "@vaadin/vaadin-material-styles": "~24.3.18", - "@vaadin/vaadin-themable-mixin": "~24.3.18" + "@vaadin/a11y-base": "~24.3.22", + "@vaadin/checkbox": "~24.3.22", + "@vaadin/component-base": "~24.3.22", + "@vaadin/lit-renderer": "~24.3.22", + "@vaadin/text-field": "~24.3.22", + "@vaadin/vaadin-lumo-styles": "~24.3.22", + "@vaadin/vaadin-material-styles": "~24.3.22", + "@vaadin/vaadin-themable-mixin": "~24.3.22" } }, "node_modules/@vaadin/icon": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.18.tgz", - "integrity": "sha512-S0Vh8SgtpBrdWSB+dGUGtvku9Avj8PZ4e3CY+U9A8L1ArdS+X20Jwag5cY4I5d9GY/NOcoSkYBcJqgAMTem2kQ==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.22.tgz", + "integrity": "sha512-zx6hzSBEtJthl4CS9AmOQIlvGeO+0913KebcmvJ/GV9SAF54nZNSo6KGVE5Njp7W32h1lSzPTw89O5Pre2Cjqg==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.18", - "@vaadin/vaadin-lumo-styles": "~24.3.18", - "@vaadin/vaadin-themable-mixin": "~24.3.18", + "@vaadin/component-base": "~24.3.22", + "@vaadin/vaadin-lumo-styles": "~24.3.22", + "@vaadin/vaadin-themable-mixin": "~24.3.22", "lit": "^3.0.0" } }, "node_modules/@vaadin/input-container": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.18.tgz", - "integrity": "sha512-UwTOLa72UXHh9sTNqNwrfbKvUwcXTDM6naEh+tO/l+tbXXVcC+Bo8FnTKBugYVnlQQOpzC4jLvxMma3XUlSAuA==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.22.tgz", + "integrity": "sha512-YUULDjZ96K89ChHsCfta9flWc0ZJTgcDX0HpulnQDkCsZ7EghArZ+fJtjy9jSsDdx69R5R9CnoRQOgMT/cPd7Q==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.18", - "@vaadin/vaadin-lumo-styles": "~24.3.18", - "@vaadin/vaadin-material-styles": "~24.3.18", - "@vaadin/vaadin-themable-mixin": "~24.3.18", + "@vaadin/component-base": "~24.3.22", + "@vaadin/vaadin-lumo-styles": "~24.3.22", + "@vaadin/vaadin-material-styles": "~24.3.22", + "@vaadin/vaadin-themable-mixin": "~24.3.22", "lit": "^3.0.0" } }, "node_modules/@vaadin/lit-renderer": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.18.tgz", - "integrity": "sha512-HlYrhVwagnYcbGuOJ3IP6YRxSaV6l7qbRfsZsTl+Xpt/ElaWRktwATzvGgYd0zvnvgAut555lja9/dl0T33yOg==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.22.tgz", + "integrity": "sha512-LmbjpL6dGwbCZBpnpIUIOgknNA6LftcdIwyBqiywOS3i8fuEMwzXNuK+oUYPfbe4DZnJn0/51AJZwB5fSzsCRA==", "peer": true, "dependencies": { "lit": "^3.0.0" } }, "node_modules/@vaadin/text-field": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.18.tgz", - "integrity": "sha512-k7u7CKeLOg4RUZ94TGfXJ7DpU1GJJLxfAqPbG2YP5tDYL4g3XyVfILpW4jDUQr5gJhPJyS7L9roNadc0Q3Mp4g==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.22.tgz", + "integrity": "sha512-opSjQW4fY4fCfklyPtSclpGuugw6u4HdlQEiFVcxrI9wBObNnMuYt+bKTiuqCDZSECox4dh3VEaM8hJusOcc+w==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.18", - "@vaadin/component-base": "~24.3.18", - "@vaadin/field-base": "~24.3.18", - "@vaadin/input-container": "~24.3.18", - "@vaadin/vaadin-lumo-styles": "~24.3.18", - "@vaadin/vaadin-material-styles": "~24.3.18", - "@vaadin/vaadin-themable-mixin": "~24.3.18", + "@vaadin/a11y-base": "~24.3.22", + "@vaadin/component-base": "~24.3.22", + "@vaadin/field-base": "~24.3.22", + "@vaadin/input-container": "~24.3.22", + "@vaadin/vaadin-lumo-styles": "~24.3.22", + "@vaadin/vaadin-material-styles": "~24.3.22", + "@vaadin/vaadin-themable-mixin": "~24.3.22", "lit": "^3.0.0" } }, @@ -6311,32 +6847,32 @@ "peer": true }, "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.18.tgz", - "integrity": "sha512-cgzVOnmBiqlGQIAoQs/k2iFSsgTfckUcmGScouCbTUx2AUWbTvVYPjGlac1dkO4CsSZELE3uf2WPdPVQPSw1dw==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.22.tgz", + "integrity": "sha512-uHEtzfk8u2k5iTknIaOhbIEHH6VcuiLZeFs7p4V9a01E5KkBcBFlOPY3hMgPua3yPVJKDNCmK1lzG8Qt/IrArg==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.18", - "@vaadin/icon": "~24.3.18", - "@vaadin/vaadin-themable-mixin": "~24.3.18" + "@vaadin/component-base": "~24.3.22", + "@vaadin/icon": "~24.3.22", + "@vaadin/vaadin-themable-mixin": "~24.3.22" } }, "node_modules/@vaadin/vaadin-material-styles": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.18.tgz", - "integrity": "sha512-vNJ1fjuVpneqodh6uOSAlUWbZ6V2S2mxdwr++VsdPgDtNhqxwpOhY4X700XQhObbk28q6hvrNpSyvSRkhyLkEg==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.22.tgz", + "integrity": "sha512-sCoZimM96Rj7i9DWCg3LsJq4EsLkJcj7U8NmbCo+XnRtGykElBb/xc3fJiAC8uuf39Yj6V8BbAahuq3ulwaRig==", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.18", - "@vaadin/vaadin-themable-mixin": "~24.3.18" + "@vaadin/component-base": "~24.3.22", + "@vaadin/vaadin-themable-mixin": "~24.3.22" } }, "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.3.18", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.18.tgz", - "integrity": "sha512-4P9tjpyfRIXW+FKlnrjK0zSgguhIv1mKVjqEb55GnT9XXMZeAfYMkSBp8asWf6tLcKAVqYEq0/9cuPa5UmZBpQ==", + "version": "24.3.22", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.22.tgz", + "integrity": "sha512-u+r0UXtCzMoZbR1UKQTPWUZEnkXlxwRuxjpNCAdyumqbFMMHd5yw1/LbXertouzj60CN3SUU1FXLtjCgFOeRXQ==", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", @@ -6344,9 +6880,9 @@ } }, "node_modules/@vaadin/vaadin-usage-statistics": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.2.tgz", - "integrity": "sha512-xKs1PvRfTXsG0eWWcImLXWjv7D+f1vfoIvovppv6pZ5QX8xgcxWUdNgERlOOdGt3CTuxQXukTBW3+Qfva+OXSg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.3.tgz", + "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==", "hasInstallScript": true, "peer": true, "dependencies": { @@ -6464,9 +7000,9 @@ "peer": true }, "node_modules/@zip.js/zip.js": { - "version": "2.7.47", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.47.tgz", - "integrity": "sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg==", + "version": "2.7.52", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.52.tgz", + "integrity": "sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==", "peer": true, "engines": { "bun": ">=0.7.0", @@ -7499,10 +8035,13 @@ "dev": true }, "node_modules/composed-offset-position": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.4.tgz", - "integrity": "sha512-vMlvu1RuNegVE0YsCDSV/X4X10j56mq7PCIyOKK74FxkXzGLwhOUmdkJLSdOBOMwWycobGUMgft2lp+YgTe8hw==", - "peer": true + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.6.tgz", + "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==", + "peer": true, + "peerDependencies": { + "@floating-ui/utils": "^0.2.5" + } }, "node_modules/computeds": { "version": "0.0.1", @@ -7876,9 +8415,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==", "peer": true }, "node_modules/de-indent": { @@ -7920,26 +8459,26 @@ "dev": true }, "node_modules/deck.gl": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.24.tgz", - "integrity": "sha512-e1cQ8TFAkMR9e73XdWbzRGQCdd8u9OmmzAZaPM8ViW/zEWn0gTNco2A3x0Uvu4oqq4SO9VBG0UozPNhO1WJN1w==", - "dependencies": { - "@deck.gl/aggregation-layers": "9.0.24", - "@deck.gl/arcgis": "9.0.24", - "@deck.gl/carto": "9.0.24", - "@deck.gl/core": "9.0.24", - "@deck.gl/extensions": "9.0.24", - "@deck.gl/geo-layers": "9.0.24", - "@deck.gl/google-maps": "9.0.24", - "@deck.gl/json": "9.0.24", - "@deck.gl/layers": "9.0.24", - "@deck.gl/mapbox": "9.0.24", - "@deck.gl/mesh-layers": "9.0.24", - "@deck.gl/react": "9.0.24", - "@deck.gl/widgets": "9.0.24", + "version": "9.0.31", + "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.31.tgz", + "integrity": "sha512-5SuW1YNs9L+utT5tIcAWJYKXYmsk3qetR2zIWi0rxD9Fw/+xi8tlwXB6wO/4TXgE4gxOhIzu0zgMvVpJ6Wznbw==", + "dependencies": { + "@deck.gl/aggregation-layers": "9.0.31", + "@deck.gl/arcgis": "9.0.31", + "@deck.gl/carto": "9.0.31", + "@deck.gl/core": "9.0.31", + "@deck.gl/extensions": "9.0.31", + "@deck.gl/geo-layers": "9.0.31", + "@deck.gl/google-maps": "9.0.31", + "@deck.gl/json": "9.0.31", + "@deck.gl/layers": "9.0.31", + "@deck.gl/mapbox": "9.0.31", + "@deck.gl/mesh-layers": "9.0.31", + "@deck.gl/react": "9.0.31", + "@deck.gl/widgets": "9.0.31", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.15", - "@luma.gl/engine": "^9.0.15" + "@luma.gl/core": "~9.0.27", + "@luma.gl/engine": "~9.0.27" }, "peerDependencies": { "@arcgis/core": "^4.0.0", @@ -9080,9 +9619,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", - "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", "funding": [ { "type": "github", @@ -9867,6 +10406,15 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/interactjs": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz", + "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==", + "peer": true, + "dependencies": { + "@interactjs/types": "1.10.27" + } + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -12339,31 +12887,31 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lit": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.4.tgz", - "integrity": "sha512-q6qKnKXHy2g1kjBaNfcoLlgbI3+aSOZ9Q4tiGa9bGYXq5RBXxkVTqTIVmP2VWMp29L4GyvCFm8ZQ2o56eUAMyA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.0.tgz", + "integrity": "sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==", "peer": true, "dependencies": { "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.0.4", - "lit-html": "^3.1.2" + "lit-element": "^4.1.0", + "lit-html": "^3.2.0" } }, "node_modules/lit-element": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.6.tgz", - "integrity": "sha512-U4sdJ3CSQip7sLGZ/uJskO5hGiqtlpxndsLr6mt3IQIjheg93UKYeGQjWMRql1s/cXNOaRrCzC2FQwjIwSUqkg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.0.tgz", + "integrity": "sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww==", "peer": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.1.2" + "lit-html": "^3.2.0" } }, "node_modules/lit-html": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.4.tgz", - "integrity": "sha512-yKKO2uVv7zYFHlWMfZmqc+4hkmSbFp8jgjdZY9vvR9jr4J8fH6FUMXhr+ljfELgmjpvlF7Z1SJ5n5/Jeqtc9YA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.0.tgz", + "integrity": "sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA==", "peer": true, "dependencies": { "@types/trusted-types": "^2.0.2" @@ -13360,9 +13908,9 @@ "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" }, "node_modules/preact": { - "version": "10.22.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", - "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==", + "version": "10.24.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.1.tgz", + "integrity": "sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -14354,9 +14902,9 @@ } }, "node_modules/sortablejs": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz", - "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.3.tgz", + "integrity": "sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg==", "peer": true }, "node_modules/source-map": { @@ -14831,12 +15379,12 @@ "deprecated": "This module is now under the @mapbox namespace: install @mapbox/tilebelt instead" }, "node_modules/timezone-groups": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/timezone-groups/-/timezone-groups-0.8.0.tgz", - "integrity": "sha512-t7E/9sPfCU0m0ZbS7Cqw52D6CB/UyeaiIBmyJCokI1SyOyOgA/ESiQ/fbreeFaUG9QSenGlZSSk/7rEbkipbOA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/timezone-groups/-/timezone-groups-0.9.1.tgz", + "integrity": "sha512-1+GERLQpmebtCpkroy+AAfN/PZu8drrp4VAX/KSFBWvoaAT+5ANZIMTSn8CDW2uwfrpo1SaxIJ6MqdlACYbq/g==", "peer": true, - "bin": { - "timezone-groups": "dist/cli.cjs" + "engines": { + "node": ">=18.12.0" } }, "node_modules/tiny-lru": { @@ -15661,9 +16209,9 @@ "integrity": "sha512-ANHlY4Rb5kHw40D0NJ6moaVfOCMrp9Gpd1R/AIQYg2ko4/jzcJ+TVXYYF6kXJqQwITvEZP4yEthjM7U6rYlljQ==" }, "node_modules/wgsl_reflect": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/wgsl_reflect/-/wgsl_reflect-1.0.8.tgz", - "integrity": "sha512-0kdpA5H3SF2CMeCBijYqQz+ZT+uW310nJORFX8QPFOvrkfSGNPHFDE7aGPCUnsuDi1kzpj+9SEFIhqjf9iHGSQ==" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/wgsl_reflect/-/wgsl_reflect-1.0.12.tgz", + "integrity": "sha512-hqORu1l+ed+tylMmcP/G78+rulEpq7TMKIxX/ktEgQzyYXcZL3FMkL8/c7xLMziy6+MXfjlOFWXqIal4KHilzg==" }, "node_modules/whatwg-encoding": { "version": "2.0.0", @@ -16028,29 +16576,29 @@ } }, "node_modules/zstd-codec": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.4.tgz", - "integrity": "sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.5.tgz", + "integrity": "sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==", "optional": true }, "packages/network-map-layers": { "name": "@powsybl/network-map-layers", - "version": "0.6", + "version": "0.6.1", "license": "MPL-2.0", - "dependencies": { - "@deck.gl/core": "^9.0.0", - "@deck.gl/extensions": "^9.0.0", - "@deck.gl/layers": "^9.0.0", - "@luma.gl/constants": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" - }, "devDependencies": { "typescript": "5.5.3", "vite": "^5.3.3", "vite-plugin-dts": "^3.9.1", "vite-plugin-externalize-deps": "^0.8.0", "vite-plugin-svgr": "^4.2.0" + }, + "peerDependencies": { + "@deck.gl/core": "^9.0.0", + "@deck.gl/extensions": "^9.0.0", + "@deck.gl/layers": "^9.0.0", + "@luma.gl/constants": "^9.0.0", + "@luma.gl/core": "^9.0.0", + "@luma.gl/engine": "^9.0.0" } }, "packages/network-map-layers/node_modules/@microsoft/api-extractor": { @@ -16462,8 +17010,8 @@ "dev": true }, "packages/single-line-diagram-viewer": { - "name": "@powsybl/single-line-diagram-viewer", - "version": "0.6", + "name": "@amarant/single-line-diagram-viewer", + "version": "0.6.0", "license": "MPL-2.0", "dependencies": { "@svgdotjs/svg.js": "^3.2.4", diff --git a/package.json b/package.json index 475a6c0b..70ac457b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@powsybl/diagram-viewer", - "version": "0.5.1", + "version": "0.6.0", "description": "Typescript library to integrate a powsybl svg diagram in a javascript project.", "author": "powsybl team", "homepage": "https://www.powsybl.org/", @@ -39,7 +39,7 @@ "@svgdotjs/svg.panzoom.js": "^2.1.2", "@turf/boolean-point-in-polygon": "^6.5.0", "cheap-ruler": "^3.0.2", - "deck.gl": "^9.0.24", + "deck.gl": "^9.0.31", "geolib": "^3.3.4", "mapbox-gl": "^3.4.0", "maplibre-gl": "^4.5.0", diff --git a/packages/network-map-layers/package.json b/packages/network-map-layers/package.json index 5f2609a0..14cd391c 100644 --- a/packages/network-map-layers/package.json +++ b/packages/network-map-layers/package.json @@ -1,6 +1,6 @@ { "name": "@powsybl/network-map-layers", - "version": "0.6", + "version": "0.6.0", "description": "Typescript library to integrate a powsybl svg diagram in a javascript project.", "author": "powsybl team", "homepage": "https://www.powsybl.org/", @@ -14,13 +14,14 @@ "module": "./dist/powsybl-network-map-layers.js", "exports": { ".": { - "import": "./dist/powsybl-network-map-layers.js" + "import": "./dist/powsybl-network-map-layers.js", + "types": "./dist/index.d.ts" } }, "scripts": { "build": "vite build" }, - "dependencies": { + "peerDependencies": { "@deck.gl/core": "^9.0.0", "@deck.gl/extensions": "^9.0.0", "@deck.gl/layers": "^9.0.0", diff --git a/packages/network-map-layers/src/index.ts b/packages/network-map-layers/src/index.ts index f8b77937..0a4c60aa 100644 --- a/packages/network-map-layers/src/index.ts +++ b/packages/network-map-layers/src/index.ts @@ -1,9 +1,5 @@ -export { GeoData } from './network/geo-data'; -export { - LineFlowColorMode, - LineFlowMode, - LineLayer, -} from './network/line-layer'; +export * from './network/geo-data'; +export * from './network/line-layer'; export { MapEquipments } from './network/map-equipments'; export { SubstationLayer } from './network/substation-layer'; export { getNominalVoltageColor } from './utils/colors'; diff --git a/packages/network-map-layers/src/network/geo-data.ts b/packages/network-map-layers/src/network/geo-data.ts index 4e1404c2..2907c0d8 100644 --- a/packages/network-map-layers/src/network/geo-data.ts +++ b/packages/network-map-layers/src/network/geo-data.ts @@ -291,12 +291,12 @@ export type Coordinate = { lat: number; }; -type SubstationPosition = { +export type SubstationPosition = { id: string; coordinate: Coordinate; }; -type LinePosition = { +export type LinePosition = { id: string; coordinates: Coordinate[]; }; diff --git a/packages/network-map-layers/src/network/line-layer.ts b/packages/network-map-layers/src/network/line-layer.ts index 9139235c..97391f53 100644 --- a/packages/network-map-layers/src/network/line-layer.ts +++ b/packages/network-map-layers/src/network/line-layer.ts @@ -12,7 +12,7 @@ import { } from '@/constants'; import BoltIcon from '@/images/bolt_black_24dp.svg?react'; import PadlockIcon from '@/images/lock_black_24dp.svg?react'; -import { INVALID_FLOW_OPACITY } from '@/utils/colors'; +import { getNominalVoltageColor, INVALID_FLOW_OPACITY } from '@/utils/colors'; import { Line, LonLat } from '@/utils/equipment-types'; import { Color, @@ -300,7 +300,7 @@ export type LineLayerProps = _LineLayerProps & CompositeLayerProps; const defaultProps = { network: null, geoData: null, - getNominalVoltageColor: { type: 'accessor', value: [255, 255, 255] }, + getNominalVoltageColor: { type: 'accessor', value: getNominalVoltageColor }, disconnectedLineColor: { type: 'color', value: [255, 255, 255] }, filteredNominalVoltages: null, lineFlowMode: LineFlowMode.FEEDERS, @@ -320,6 +320,7 @@ const defaultProps = { type: 'number', value: SUBSTATION_RADIUS_MIN_PIXEL, }, + labelColor: [255, 255, 255], }; export class LineLayer extends CompositeLayer> { diff --git a/packages/network-map-layers/src/network/substation-layer.ts b/packages/network-map-layers/src/network/substation-layer.ts index 269d1e6c..6943ea8b 100644 --- a/packages/network-map-layers/src/network/substation-layer.ts +++ b/packages/network-map-layers/src/network/substation-layer.ts @@ -20,6 +20,7 @@ import { SUBSTATION_RADIUS_MAX_PIXEL, SUBSTATION_RADIUS_MIN_PIXEL, } from '@/constants'; +import { getNominalVoltageColor } from '@/utils/colors'; import { Substation, VoltageLevel } from '@/utils/equipment-types'; import { GeoData } from './geo-data'; import { CompositeData } from './line-layer'; @@ -61,7 +62,7 @@ export type SubstationLayerProps = { }; const defaultProps: DefaultProps = { - getNominalVoltageColor: { type: 'function', value: () => [255, 255, 255] }, + getNominalVoltageColor: { type: 'function', value: getNominalVoltageColor }, filteredNominalVoltages: null, labelsVisible: false, labelColor: { type: 'color', value: [255, 255, 255] }, diff --git a/packages/network-map-layers/vite.config.ts b/packages/network-map-layers/vite.config.ts index 632dfedd..8924fbd2 100644 --- a/packages/network-map-layers/vite.config.ts +++ b/packages/network-map-layers/vite.config.ts @@ -27,7 +27,7 @@ export default defineConfig((_config) => ({ fileName: 'powsybl-network-map-layers', }, rollupOptions: { - external: [...Object.keys(pkg.dependencies), /^node:.*/], + external: [...Object.keys(pkg.peerDependencies), /^node:.*/], }, target: 'esnext', }, diff --git a/packages/single-line-diagram-viewer/package.json b/packages/single-line-diagram-viewer/package.json index 8a2c96a5..3c104e1b 100644 --- a/packages/single-line-diagram-viewer/package.json +++ b/packages/single-line-diagram-viewer/package.json @@ -1,6 +1,6 @@ { - "name": "@powsybl/single-line-diagram-viewer", - "version": "0.6", + "name": "@amarant/single-line-diagram-viewer", + "version": "0.6.0", "description": "Typescript library to integrate a powsybl svg diagram in a javascript project.", "author": "powsybl team", "homepage": "https://www.powsybl.org/", @@ -14,7 +14,8 @@ "module": "./dist/single-line-diagram-viewer.js", "exports": { ".": { - "import": "./dist/single-line-diagram-viewer.js" + "import": "./dist/single-line-diagram-viewer.js", + "types": "./dist/index.d.ts" } }, "scripts": {