From aea37e7bac88693f64ecc170176083f55d2701e4 Mon Sep 17 00:00:00 2001 From: Franz-Stefan Preiss Date: Wed, 9 Aug 2023 16:04:30 +0200 Subject: [PATCH] Add Motoko-variant of vetKD example dapp (#602) Adds a variant of the rust/vetkd example dapp where the backend is implemented in Motoko, rather than Rust. The code is almost entirely a 1:1 copy of the code in `rust/vetkd`, with the main difference that the `motoko/vetkd/src/app_backend` is no longer implemented in Rust but in Motoko. --- .github/workflows/motoko-vetkd-example.yml | 43 + .github/workflows/motoko-vetkd-skip.yml | 16 + motoko/vetkd/.gitignore | 24 + motoko/vetkd/Cargo.lock | 1302 +++++ motoko/vetkd/Cargo.toml | 4 + motoko/vetkd/Makefile | 28 + motoko/vetkd/README.md | 66 + motoko/vetkd/dfx.json | 38 + motoko/vetkd/ic-vetkd-utils-0.1.0.tgz | Bin 0 -> 105546 bytes motoko/vetkd/package-lock.json | 4833 +++++++++++++++++ motoko/vetkd/package.json | 49 + motoko/vetkd/src/app_backend/Main.mo | 51 + motoko/vetkd/src/app_backend/utils/Hex.mo | 105 + .../app_frontend_js/assets/.ic-assets.json5 | 56 + .../src/app_frontend_js/assets/favicon.ico | Bin 0 -> 15406 bytes .../src/app_frontend_js/assets/logo2.svg | 37 + .../vetkd/src/app_frontend_js/assets/main.css | 31 + .../app_frontend_js/assets/sample-asset.txt | 1 + .../src/app_frontend_js/src/.ic-assets.json5 | 56 + .../vetkd/src/app_frontend_js/src/index.html | 40 + motoko/vetkd/src/app_frontend_js/src/index.js | 129 + motoko/vetkd/src/system_api/Cargo.toml | 20 + motoko/vetkd/src/system_api/src/lib.rs | 148 + motoko/vetkd/src/system_api/src/types.rs | 42 + .../vetkd/src/system_api/vetkd_system_api.did | 20 + motoko/vetkd/webpack.config.js | 99 + rust/vetkd/Makefile | 1 + rust/vetkd/README.md | 7 +- 28 files changed, 7245 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/motoko-vetkd-example.yml create mode 100644 .github/workflows/motoko-vetkd-skip.yml create mode 100644 motoko/vetkd/.gitignore create mode 100644 motoko/vetkd/Cargo.lock create mode 100644 motoko/vetkd/Cargo.toml create mode 100644 motoko/vetkd/Makefile create mode 100644 motoko/vetkd/README.md create mode 100644 motoko/vetkd/dfx.json create mode 100644 motoko/vetkd/ic-vetkd-utils-0.1.0.tgz create mode 100644 motoko/vetkd/package-lock.json create mode 100644 motoko/vetkd/package.json create mode 100644 motoko/vetkd/src/app_backend/Main.mo create mode 100644 motoko/vetkd/src/app_backend/utils/Hex.mo create mode 100644 motoko/vetkd/src/app_frontend_js/assets/.ic-assets.json5 create mode 100644 motoko/vetkd/src/app_frontend_js/assets/favicon.ico create mode 100644 motoko/vetkd/src/app_frontend_js/assets/logo2.svg create mode 100644 motoko/vetkd/src/app_frontend_js/assets/main.css create mode 100644 motoko/vetkd/src/app_frontend_js/assets/sample-asset.txt create mode 100644 motoko/vetkd/src/app_frontend_js/src/.ic-assets.json5 create mode 100644 motoko/vetkd/src/app_frontend_js/src/index.html create mode 100644 motoko/vetkd/src/app_frontend_js/src/index.js create mode 100644 motoko/vetkd/src/system_api/Cargo.toml create mode 100644 motoko/vetkd/src/system_api/src/lib.rs create mode 100644 motoko/vetkd/src/system_api/src/types.rs create mode 100644 motoko/vetkd/src/system_api/vetkd_system_api.did create mode 100644 motoko/vetkd/webpack.config.js diff --git a/.github/workflows/motoko-vetkd-example.yml b/.github/workflows/motoko-vetkd-example.yml new file mode 100644 index 000000000..83c770fc2 --- /dev/null +++ b/.github/workflows/motoko-vetkd-example.yml @@ -0,0 +1,43 @@ +name: motoko-vetkd +on: + push: + branches: + - master + pull_request: + paths: + - motoko/vetkd/** + - .github/workflows/provision-darwin.sh + - .github/workflows/provision-linux.sh + - .github/workflows/motoko-vetkd-example.yml +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + motoko-vetkd-darwin: + runs-on: macos-12 + steps: + - uses: actions/checkout@v1 + - name: Provision Darwin + env: + DFX_VERSION: 0.14.2 + run: bash .github/workflows/provision-darwin.sh + - name: Motoko vetKD Darwin + run: | + dfx start --background + pushd motoko/vetkd + make test + popd + motoko-vetkd-linux: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v1 + - name: Provision Linux + env: + DFX_VERSION: 0.14.2 + run: bash .github/workflows/provision-linux.sh + - name: Motoko vetKD Linux + run: | + dfx start --background + pushd motoko/vetkd + make test + popd diff --git a/.github/workflows/motoko-vetkd-skip.yml b/.github/workflows/motoko-vetkd-skip.yml new file mode 100644 index 000000000..8a2a9ed44 --- /dev/null +++ b/.github/workflows/motoko-vetkd-skip.yml @@ -0,0 +1,16 @@ +name: motoko-vetkd +on: + pull_request: + paths-ignore: + - motoko/vetkd/** + - .github/workflows/provision-darwin.sh + - .github/workflows/provision-linux.sh + - .github/workflows/motoko-vetkd-example.yml +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: echo 'Not needed - relevant folder not touched' diff --git a/motoko/vetkd/.gitignore b/motoko/vetkd/.gitignore new file mode 100644 index 000000000..ee3272636 --- /dev/null +++ b/motoko/vetkd/.gitignore @@ -0,0 +1,24 @@ +# Various IDEs and Editors +.vscode/ +.idea/ +**/*~ + +# Mac OSX temporary files +.DS_Store +**/.DS_Store + +# dfx temporary files +.dfx/ + +# rust +target/ + +# generated files +src/declarations/ + +# frontend code +node_modules/ +dist/ + +# environment variables +.env \ No newline at end of file diff --git a/motoko/vetkd/Cargo.lock b/motoko/vetkd/Cargo.lock new file mode 100644 index 000000000..4f8148e1e --- /dev/null +++ b/motoko/vetkd/Cargo.lock @@ -0,0 +1,1302 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + +[[package]] +name = "binread" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" +dependencies = [ + "binread_derive", + "lazy_static", + "rustversion", +] + +[[package]] +name = "binread_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" +dependencies = [ + "either", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "candid" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244005a1917bb7614cd775ca8a5d59efeb5ac74397bb14ba29a19347ebd78591" +dependencies = [ + "anyhow", + "binread", + "byteorder", + "candid_derive", + "codespan-reporting", + "crc32fast", + "data-encoding", + "hex", + "lalrpop", + "lalrpop-util", + "leb128", + "logos", + "num-bigint", + "num-traits", + "num_enum", + "paste", + "pretty", + "serde", + "serde_bytes", + "sha2 0.10.7", + "thiserror", +] + +[[package]] +name = "candid_derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f1f4db7c7d04b87b70b3a35c5dc5c2c9dd73cef8bdf6760e2f18a0d45350dd" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "cpufeatures" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "ena" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +dependencies = [ + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "ic-cdk" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9beb0bf1dcd0639c313630e34aa547a2b19450ddf1969c176e13225ef3b29048" +dependencies = [ + "candid", + "ic-cdk-macros", + "ic0", + "serde", + "serde_bytes", +] + +[[package]] +name = "ic-cdk-macros" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebf50458685a0fc6b0e414cdba487610aeb199ac94db52d9fd76270565debee7" +dependencies = [ + "candid", + "proc-macro2", + "quote", + "serde", + "serde_tokenstream", + "syn 1.0.109", +] + +[[package]] +name = "ic-crypto-getrandom-for-wasm" +version = "0.1.0" +source = "git+https://github.com/dfinity/ic#c47ecfb931d20474c1bcd779ab0027c494561900" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ic-crypto-internal-bls12-381-type" +version = "0.1.0" +source = "git+https://github.com/dfinity/ic#c47ecfb931d20474c1bcd779ab0027c494561900" +dependencies = [ + "hex", + "ic-crypto-getrandom-for-wasm", + "ic_bls12_381", + "itertools", + "lazy_static", + "pairing", + "paste", + "rand", + "rand_chacha", + "sha2 0.9.9", + "subtle", + "zeroize", +] + +[[package]] +name = "ic-crypto-internal-bls12-381-vetkd" +version = "0.1.0" +source = "git+https://github.com/dfinity/ic#c47ecfb931d20474c1bcd779ab0027c494561900" +dependencies = [ + "ic-crypto-internal-bls12-381-type", + "rand", + "sha3", + "zeroize", +] + +[[package]] +name = "ic0" +version = "0.18.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187fa0cecf46628330b7a390a1a65fb0637ea00d3a1121aa847ecbebc0f3ff79" + +[[package]] +name = "ic_bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c682cb199cd8fcb582a6023325d571a6464edda26c8063fe04b6f6082a1a363c" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fddda5af7e54bf7da53067d6e802dbcc381d0a8eef629df528e3ebf68755cb" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +dependencies = [ + "ascii-canvas", + "bit-set", + "diff", + "ena", + "is-terminal", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.6.29", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" +dependencies = [ + "regex", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "linux-raw-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "logos" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 1.0.109", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap 1.9.3", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "pretty" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9940b913ee56ddd94aec2d3cd179dd47068236f42a1a6415ccf9d880ce2a61" +dependencies = [ + "arrayvec", + "typed-arena", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "rustix" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabcb0461ebd01d6b79945797c27f8529082226cb630a9865a71870ff63532a4" +dependencies = [ + "bitflags 2.3.3", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.23", +] + +[[package]] +name = "serde_tokenstream" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "797ba1d80299b264f3aac68ab5d12e5825a561749db4df7cd7c8083900c5d4e9" +dependencies = [ + "proc-macro2", + "serde", + "syn 1.0.109", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.23", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vetkd_app_backend" +version = "0.1.0" +dependencies = [ + "candid", + "hex", + "ic-cdk", + "serde", +] + +[[package]] +name = "vetkd_system_api" +version = "0.1.0" +dependencies = [ + "candid", + "hex", + "ic-cdk", + "ic-crypto-internal-bls12-381-type", + "ic-crypto-internal-bls12-381-vetkd", + "lazy_static", + "rand", + "rand_chacha", + "serde", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +dependencies = [ + "memchr", +] + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.23", +] diff --git a/motoko/vetkd/Cargo.toml b/motoko/vetkd/Cargo.toml new file mode 100644 index 000000000..048d46bd8 --- /dev/null +++ b/motoko/vetkd/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "src/system_api", +] diff --git a/motoko/vetkd/Makefile b/motoko/vetkd/Makefile new file mode 100644 index 000000000..363bb8d03 --- /dev/null +++ b/motoko/vetkd/Makefile @@ -0,0 +1,28 @@ +.PHONY: all +all: deploy + +.PHONY: node_modules +.SILENT: node_modules +node_modules: + npm install + +.PHONY: deploy +.SILENT: deploy +deploy: node_modules + dfx canister create system_api --specified-id s55qq-oqaaa-aaaaa-aaakq-cai + dfx deploy + +.PHONY: test +.SILENT: test +test: deploy + dfx canister call app_backend symmetric_key_verification_key && echo 'MINIMAL SANITY CHECK PASSED' + +.PHONY: clean +.SILENT: clean +clean: + rm -rf .dfx + rm -rf dist + rm -rf node_modules + rm -rf src/declarations + rm -f .env + cargo clean diff --git a/motoko/vetkd/README.md b/motoko/vetkd/README.md new file mode 100644 index 000000000..a325cb247 --- /dev/null +++ b/motoko/vetkd/README.md @@ -0,0 +1,66 @@ +# vetKD System API Preview + +This repository provides a canister (`src/system_api`) that offers the vetKD system API proposed in https://github.com/dfinity/interface-spec/pull/158, implemented in an **unsafe** manner **for demonstration purposes**. + +Additionally, the repository provides: +* An example app backend canister (`src/app_backend`) implemented in **Motoko** that makes use of this system API in order to provide caller-specific symmetric keys that can be used for AES encryption and decryption. + +* An example frontend (`src/app_frontend_js`) that uses the backend from Javascript in the browser. + + The frontend uses the [ic-vetkd-utils](https://github.com/dfinity/ic/tree/master/packages/ic-vetkd-utils) to create a transport key pair that is used to obtain a verifiably-encrypted key from the system API, to decrypt this key, and to derive a symmetric key to be used for AES encryption/decryption. + + Because the `ic-vetkd-utils` are not yet published as NPM package at [npmjs.com](npmjs.com), a respective package file (`ic-vetkd-utils-0.1.0.tgz`) is included in this repository. + +## Disclaimer + +The implementation of [the proposed vetKD system API](https://github.com/dfinity/interface-spec/pull/158) used in this example is **unsafe**, e.g., we hard-code a master secret key, rather than using a master secret key that is distributed among sufficiently many Internet Computer nodes by means of distributed key generation. **Do not use this in production or for sensitive data**! This example is solely provided **for demonstration purposes** to collect feedback on the mentioned vetKD system API. See also the respective disclaimer [in the system API canister implementation](https://github.com/dfinity/examples/blob/master/rust/vetkd/src/system_api/src/lib.rs#L19-L26). + +## Prerequisites +- [ ] Install the [IC SDK](https://internetcomputer.org/docs/current/developer-docs/setup/install/). +- [ ] Install [Node.js](https://nodejs.org/en/download/). +- [ ] Install [Rust](https://www.rust-lang.org/tools/install), and add Wasm as a target (`rustup target add wasm32-unknown-unknown`). Note that Rust is only needed for compiling the (insecure) canister offering the vetKD system API, which later would be directly integrated into the Internet Computer. + +## Running Locally + +1. Start a local internet computer. + + ```sh + dfx start + ``` + +1. Open a new terminal window. + +1. Ensure the Canister SDK (dfx) uses the canister IDs that are hard-coded in the Rust source code: + + ```sh + dfx canister create system_api --specified-id s55qq-oqaaa-aaaaa-aaakq-cai + ``` + + Without this, the Canister SDK (dfx) may use different canister IDs for the `system_api` and `app_backend` canisters in your local environment. + +1. Ensure that the required node modules are available in your project directory, if needed, by running the following command: + + ```sh + npm install + ``` + +1. Register, build and deploy the project: + + ```sh + dfx deploy + ``` + + This command should finish successfully with output similar to the following one: + + ```sh + Deployed canisters. + URLs: + Frontend canister via browser + app_frontend_js: http://127.0.0.1:4943/?canisterId=by6od-j4aaa-aaaaa-qaadq-cai + Backend canister via Candid interface: + app_backend: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=tcvdh-niaaa-aaaaa-aaaoa-cai + app_frontend: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=b77ix-eeaaa-aaaaa-qaada-cai + system_api: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=s55qq-oqaaa-aaaaa-aaakq-cai + ``` + +1. Open the printed URL for the `app_frontend_js` in your browser. diff --git a/motoko/vetkd/dfx.json b/motoko/vetkd/dfx.json new file mode 100644 index 000000000..771a4d27d --- /dev/null +++ b/motoko/vetkd/dfx.json @@ -0,0 +1,38 @@ +{ + "canisters": { + "system_api": { + "candid": "src/system_api/vetkd_system_api.did", + "package": "vetkd_system_api", + "type": "rust" + }, + "app_backend": { + "dependencies": [ + "system_api" + ], + "main": "src/app_backend/Main.mo", + "type": "motoko" + }, + "app_frontend_js": { + "dependencies": [ + "app_backend", + "system_api" + ], + "frontend": { + "entrypoint": "src/app_frontend_js/src/index.html" + }, + "source": [ + "src/app_frontend_js/assets", + "dist/app_frontend_js/" + ], + "type": "assets" + } + }, + "defaults": { + "build": { + "args": "", + "packtool": "" + } + }, + "output_env_file": ".env", + "version": 1 +} \ No newline at end of file diff --git a/motoko/vetkd/ic-vetkd-utils-0.1.0.tgz b/motoko/vetkd/ic-vetkd-utils-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..27763e626d377258e9689b877ff2cc39760c07df GIT binary patch literal 105546 zcmV)zK#{*6iwFP!00002|Lna9m|e$p9{BFPZ{K@gu+_T&$p#1ljjaI!#L^(aMHEF! zf*{$l41z$DL}Tx6kfPNPS^_|VlteZuE)X|^)CNhW1xa3LXJTP&M}ur**m1sL#`YMQ zWMX8-ao|ysf$b!m^Pf{yx9)qd8%>H%>(q8|$Id-F9vE7>d*}9t zhQ{{n+J1O!_ukR%_dT#=cr@`I{p;`VA6U6kH7oD$U$$aJKmE31)jv_707yhj)zbTbCdD^uYroW9t6H`*)7*KCoYH z-~RA@4{RSD8rzQF`ySe{ccJ=BUeP~1tM!UX*5!}n^ZA_z_K%LKy<3MqJ$B2`&I7xK zM(EeEM-C1hxL?Hz*RNOC9p1ld=>FaNhjv}3Hmbh<#cJPyU5ED$Eg2a)ba?m3(89j! zAc5B{T;kST>$bBlp9j`EckFy{XjdHQ{-K9sc%ZTSZ&-8PV)Yrd`+@xjMus-ueb-tw zHgb4qvATc9*p9vOppGo0RvTJevWq|a7REq+Z1?`LHFpi|J23J{KVTl-OLWLvx;-#7 z=DyKqsJ8ol)z_?n_0ohIA8*qBlKUPR8~WhT{s+b$Y0IySO<{{y#<9N719YO=rY;MmAw zwRdR0K`7Qz6B;&ml8MX-3gF`zG>P|_2mMveiaLN6<_wMbp zf&}j1y(I?^k3JX`FJ`hXw#?o;I%N2Wx3}*n9I0upxtA&Ia&gD5UANOOci%TWv~#TQ zzHEGkJTsXtxpk7<~M$(-w2s?F3G8w zDTbbXeDI@pZQr)#=B;;sWcvrVe2CuecYAek$LJ{2an05P!p0pV50DD(*t_?@PSZm{ z5&T%Mf5BU(D~oJbns9VzOd3SxrS`=}q@wm>J)vs0Cn899>>pdPd|F*|-)N$1@dg@n z&HZ@>x>k=4i6s}kb6s;=YS1+;b;MXg!PJXHLb4xindaUX0!J(a?3KMoiV{*gvA(bWi2pyJC^&MkFeT@w+IXH4)>;N36rW5{A)g_{ftR1#o z)4>{pBl6Ss?Yo9X$3_l3vYn`NVEf39hx;1Qk@m(O+&#L48#TY05^Xl>K-pI{sQX8T zhNf@488Q(xRu_pfEd58B7Q}?@+&YNqsu1{x&qeBHCgP~t;qY!W;_Lk+KlIy*6f8hOLWam2X~C@*rz@dImsjZyZpQ~lIoGeJI4-;^x-$Rmt!N3I8QMhkgnT)?cTrZ zfua4|$(3xU-jkT@+_U}Q0Rl^b$qmZ}98$!n2g}lEsDZ}fhPJikZq^dXJX)$VzVSD? zxu(QFux~pc_DQc;m-<-``|E%`v|~gu$_=*olbRw+)k;#q{!cZjx9sZmmNl!l{Oa|V z*VThX99h1wj&&mSBL^OK&D+Sbx;`F>J!y4lqQBY%jJPy9q9__6F4YUojHDzcBuAPm z!bcdJQ8r_vLnFI)?A`qfL%Y<$!}skaqXb7}+#t>+gVMKBVC_xG`uC$<>lkLVl>PSzjFzvF(!@PP|no ze-HKl^n{FJ`H@Esj;S5{)zE(aO2R}eSWG3m)Pp-lA5^=?)Yt(sxucKl+c!jGg`JUX z=|;AagdR9NcJMIUCPY~~slEG#C>p$PH*uN-39Ugm4-W0zegAHPao-~>*gL6jLn95X z-D`nC9=1neMjt$Im_Byz-?{hjt|9uo|G>z;9TMf=M+oT#0f!y% z&I5ZHk)68_K1id=u?KgIiOxWo9;TrOa6UXr*il2%c@;}4#tx2XbegwmthDRbhQ?zCFo2o#V(PS?L@@wkd3}3gjhUfe;3EQwYXUi z7Eh1p-vM{sw9D_Y_qHf3Yl_0u1b%0DESoVN%csU8V&^*pzI?{OS2PcsrjwI*ip+|4 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 z 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 literal 0 HcmV?d00001 diff --git a/motoko/vetkd/package-lock.json b/motoko/vetkd/package-lock.json new file mode 100644 index 000000000..3ca4988f1 --- /dev/null +++ b/motoko/vetkd/package-lock.json @@ -0,0 +1,4833 @@ +{ + "name": "app_frontend_js", + "version": "0.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "app_frontend_js", + "version": "0.2.0", + "dependencies": { + "@dfinity/agent": "^0.15.6", + "@dfinity/candid": "^0.15.6", + "@dfinity/principal": "^0.15.6", + "ic-vetkd-utils": "file:ic-vetkd-utils-0.1.0.tgz" + }, + "devDependencies": { + "assert": "2.0.0", + "buffer": "6.0.3", + "copy-webpack-plugin": "^11.0.0", + "dotenv": "^16.0.3", + "events": "3.3.0", + "html-webpack-plugin": "5.5.0", + "process": "0.11.10", + "stream-browserify": "3.0.0", + "terser-webpack-plugin": "^5.3.3", + "util": "0.12.4", + "webpack": "^5.73.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.8.1" + }, + "engines": { + "node": "^12 || ^14 || ^16 || ^18 || ^19" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dfinity/agent": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.15.6.tgz", + "integrity": "sha512-Ch+tXAszPap0zwRgr/oFEgJLDld4RDwBdFDqR1JUg38xhHWTFMrTkjMT6uQFvqf6d2wDXnh3zwhqbg5P7OCv7A==", + "dependencies": { + "base64-arraybuffer": "^0.2.0", + "bignumber.js": "^9.0.0", + "borc": "^2.1.1", + "js-sha256": "0.9.0", + "simple-cbor": "^0.4.1", + "ts-node": "^10.8.2" + }, + "peerDependencies": { + "@dfinity/candid": "^0.15.6", + "@dfinity/principal": "^0.15.6" + } + }, + "node_modules/@dfinity/candid": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.15.6.tgz", + "integrity": "sha512-Q9PGvhTE/1dTLfSo0pu0+ifzA7NA4X1rgSy9TE6O1Glk6Kl8Nf+Pg2sCHS2hWt0RAiKfR2glEVlbUAm6S8vRxA==", + "dependencies": { + "ts-node": "^10.8.2" + } + }, + "node_modules/@dfinity/principal": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.15.6.tgz", + "integrity": "sha512-eMsS5YofRk5Hm6LlhzyBvw1RzDxM5FWPtepQuYeZbZyD/ztq4TrUiScqoKBFw/LLODd0znt8rGnNgqtt+7JnQA==", + "dependencies": { + "js-sha256": "^0.9.0", + "ts-node": "^10.8.2" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "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==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.40.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.1.tgz", + "integrity": "sha512-vRb792M4mF1FBT+eoLecmkpLXwxsBHvWWRGJjzbYANBM6DtiJc6yETyv4rqDA6QNjF1pkj1U7LMA6dGb3VYlHw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz", + "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "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.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" + } + }, + "node_modules/ajv-formats/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "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" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/bonjour-service/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "dependencies": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/borc/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/borc/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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" + } + }, + "node_modules/browserslist": { + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001502", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001502.tgz", + "integrity": "sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "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==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "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==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "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/dotenv": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.427.tgz", + "integrity": "sha512-HK3r9l+Jm8dYAm1ctXEWIC+hV60zfcjS9UA5BDlYvnI5S7PU/yytjpvSrTNrSSRRkuu3tDyZhdkwIczh+0DWaw==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/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==", + "dev": true, + "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/hpack.js/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==", + "dev": true + }, + "node_modules/hpack.js/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.5.tgz", + "integrity": "sha512-72TJlcMkYsEJASa/3HnX7VT59htM7iSHbH59NSZbtc+22Ap0Txnlx91sfeB+/A7wNZg7UxtZdhAW4y+/jimrdg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/ic-vetkd-utils": { + "version": "0.1.0", + "resolved": "file:ic-vetkd-utils-0.1.0.tgz", + "integrity": "sha512-U9zXdOO+0o5iVOcscMwomG30duh3WmwYvkCgnPq1wrrwppRmfszrnpLSxcfndLCOw8zKmIRhJG/WdoZ3ReYX2A==" + }, + "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==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "engines": { + "node": ">=10" + } + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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-worker/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" + } + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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/json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", + "dependencies": { + "delimit-stream": "0.1.0" + } + }, + "node_modules/json-text-sequence/node_modules/delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "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/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "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-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.1.0.tgz", + "integrity": "sha512-Jw+GZVbP5IggB2WAn6UHI02LBwGmsIeYN/lNbSMZyDziQ7jmtAUrqKqDja+W89YHVs+KL/3IkIMltAklqB1vAw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/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" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel/node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-cbor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", + "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==" + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "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" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "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" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/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 + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "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" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/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 + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "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/node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/webpack-dev-server/node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/motoko/vetkd/package.json b/motoko/vetkd/package.json new file mode 100644 index 000000000..2a7c7116f --- /dev/null +++ b/motoko/vetkd/package.json @@ -0,0 +1,49 @@ +{ + "name": "app_frontend_js", + "version": "0.2.0", + "description": "Internet Computer starter application", + "keywords": [ + "Internet Computer", + "Motoko", + "JavaScript", + "Canister" + ], + "scripts": { + "build": "webpack", + "prebuild": "dfx generate", + "start": "webpack serve --mode development --env development", + "deploy:local": "dfx deploy --network=local", + "deploy:ic": "dfx deploy --network=ic", + "generate": "dfx generate app_backend" + }, + "dependencies": { + "@dfinity/agent": "^0.15.6", + "@dfinity/candid": "^0.15.6", + "@dfinity/principal": "^0.15.6", + "ic-vetkd-utils": "file:ic-vetkd-utils-0.1.0.tgz" + }, + "devDependencies": { + "assert": "2.0.0", + "buffer": "6.0.3", + "copy-webpack-plugin": "^11.0.0", + "dotenv": "^16.0.3", + "events": "3.3.0", + "html-webpack-plugin": "5.5.0", + "process": "0.11.10", + "stream-browserify": "3.0.0", + "terser-webpack-plugin": "^5.3.3", + "util": "0.12.4", + "webpack": "^5.73.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.8.1" + }, + "engines": { + "node": "^12 || ^14 || ^16 || ^18 || ^19" + }, + "browserslist": [ + "last 2 chrome version", + "last 2 firefox version", + "last 2 safari version", + "last 2 edge version" + ] +} \ No newline at end of file diff --git a/motoko/vetkd/src/app_backend/Main.mo b/motoko/vetkd/src/app_backend/Main.mo new file mode 100644 index 000000000..d99076b9e --- /dev/null +++ b/motoko/vetkd/src/app_backend/Main.mo @@ -0,0 +1,51 @@ +import Principal "mo:base/Principal"; +import Text "mo:base/Text"; +import Blob "mo:base/Blob"; +import Array "mo:base/Array"; +import Hex "./utils/Hex"; + +actor { + type VETKD_SYSTEM_API = actor { + vetkd_public_key : ({ + canister_id : ?Principal; + derivation_path : [Blob]; + key_id : { curve : { #bls12_381 }; name : Text }; + }) -> async ({ public_key : Blob }); + vetkd_encrypted_key : ({ + public_key_derivation_path : [Blob]; + derivation_id : Blob; + key_id : { curve : { #bls12_381 }; name : Text }; + encryption_public_key : Blob; + }) -> async ({ encrypted_key : Blob }); + }; + + let vetkd_system_api : VETKD_SYSTEM_API = actor ("s55qq-oqaaa-aaaaa-aaakq-cai"); + + public shared ({ caller }) func app_vetkd_public_key(derivation_path : [Blob]) : async Text { + let { public_key } = await vetkd_system_api.vetkd_public_key({ + canister_id = null; + derivation_path; + key_id = { curve = #bls12_381; name = "test_key_1" }; + }); + Hex.encode(Blob.toArray(public_key)); + }; + + public shared ({ caller }) func symmetric_key_verification_key() : async Text { + let { public_key } = await vetkd_system_api.vetkd_public_key({ + canister_id = null; + derivation_path = Array.make(Text.encodeUtf8("symmetric_key")); + key_id = { curve = #bls12_381; name = "test_key_1" }; + }); + Hex.encode(Blob.toArray(public_key)); + }; + + public shared ({ caller }) func encrypted_symmetric_key_for_caller(encryption_public_key : Blob) : async Text { + let { encrypted_key } = await vetkd_system_api.vetkd_encrypted_key({ + derivation_id = Principal.toBlob(caller); + public_key_derivation_path = Array.make(Text.encodeUtf8("symmetric_key")); + key_id = { curve = #bls12_381; name = "test_key_1" }; + encryption_public_key; + }); + Hex.encode(Blob.toArray(encrypted_key)); + }; +}; diff --git a/motoko/vetkd/src/app_backend/utils/Hex.mo b/motoko/vetkd/src/app_backend/utils/Hex.mo new file mode 100644 index 000000000..310b72d6d --- /dev/null +++ b/motoko/vetkd/src/app_backend/utils/Hex.mo @@ -0,0 +1,105 @@ +/** + * Module : Hex.mo + * Description : Hexadecimal encoding and decoding routines. + * Copyright : 2022 Dfinity + * License : Apache 2.0> + */ + +import Array "mo:base/Array"; +import Iter "mo:base/Iter"; +import Option "mo:base/Option"; +import Nat8 "mo:base/Nat8"; +import Char "mo:base/Char"; +import Result "mo:base/Result"; +import Text "mo:base/Text"; +import Prim "mo:⛔"; + +module { + + private type Result = Result.Result; + + private let base : Nat8 = 0x10; + + private let symbols = [ + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', + ]; + + /** + * Define a type to indicate that the decoder has failed. + */ + public type DecodeError = { + #msg : Text; + }; + + /** + * Encode an array of unsigned 8-bit integers in hexadecimal format. + */ + public func encode(array : [Nat8]) : Text { + let encoded = Array.foldLeft(array, "", func (accum, w8) { + accum # encodeW8(w8); + }); + // encode as lowercase + return Text.map(encoded, Prim.charToLower); + }; + + /** + * Encode an unsigned 8-bit integer in hexadecimal format. + */ + private func encodeW8(w8 : Nat8) : Text { + let c1 = symbols[Nat8.toNat(w8 / base)]; + let c2 = symbols[Nat8.toNat(w8 % base)]; + Char.toText(c1) # Char.toText(c2); + }; + + /** + * Decode an array of unsigned 8-bit integers in hexadecimal format. + */ + public func decode(text : Text) : Result<[Nat8], DecodeError> { + // Transform to uppercase for uniform decoding + let upper = Text.map(text, Prim.charToUpper); + let next = upper.chars().next; + func parse() : Result { + Option.get>( + do ? { + let c1 = next()!; + let c2 = next()!; + Result.chain(decodeW4(c1), func (x1) { + Result.chain(decodeW4(c2), func (x2) { + #ok (x1 * base + x2); + }) + }) + }, + #err (#msg "Not enough input!"), + ); + }; + var i = 0; + let n = upper.size() / 2 + upper.size() % 2; + let array = Array.init(n, 0); + while (i != n) { + switch (parse()) { + case (#ok w8) { + array[i] := w8; + i += 1; + }; + case (#err err) { + return #err err; + }; + }; + }; + #ok (Array.freeze(array)); + }; + + /** + * Decode an unsigned 4-bit integer in hexadecimal format. + */ + private func decodeW4(char : Char) : Result { + for (i in Iter.range(0, 15)) { + if (symbols[i] == char) { + return #ok (Nat8.fromNat(i)); + }; + }; + let str = "Unexpected character: " # Char.toText(char); + #err (#msg str); + }; +}; diff --git a/motoko/vetkd/src/app_frontend_js/assets/.ic-assets.json5 b/motoko/vetkd/src/app_frontend_js/assets/.ic-assets.json5 new file mode 100644 index 000000000..8dc76d1ee --- /dev/null +++ b/motoko/vetkd/src/app_frontend_js/assets/.ic-assets.json5 @@ -0,0 +1,56 @@ +[ + { + "match": "**/*", + "headers": { + // Security: The Content Security Policy (CSP) given below aims at working with many apps rather than providing maximal security. + // We recommend tightening the CSP for your specific application. Some recommendations are as follows: + // - Use the CSP Evaluator (https://csp-evaluator.withgoogle.com/) to validate the CSP you define. + // - Follow the “Strict CSP” recommendations (https://csp.withgoogle.com/docs/strict-csp.html). However, note that in the context of the IC, + // nonces cannot be used because the response bodies must be static to work well with HTTP asset certification. + // Thus, we recommend to include script hashes (in combination with strict-dynamic) in the CSP as described + // in https://csp.withgoogle.com/docs/faq.html in section “What if my site is static and I can't add nonces to scripts?”. + // See for example the II CSP (https://github.com/dfinity/internet-identity/blob/main/src/internet_identity/src/http.rs). + // - It is recommended to tighten the connect-src directive. With the current CSP configuration the browser can + // make requests to https://*.icp0.io, hence being able to call any canister via https://icp0.io/api/v2/canister/{canister-ID}. + // This could potentially be used in combination with another vulnerability (e.g. XSS) to exfiltrate private data. + // The developer can configure this policy to only allow requests to their specific canisters, + // e.g: connect-src 'self' https://icp-api.io/api/v2/canister/{my-canister-ID}, where {my-canister-ID} has the following format: aaaaa-aaaaa-aaaaa-aaaaa-aaa + // - It is recommended to configure style-src, style-src-elem and font-src directives with the resources your canister is going to use + // instead of using the wild card (*) option. Normally this will include 'self' but also other third party styles or fonts resources (e.g: https://fonts.googleapis.com or other CDNs) + + // Notes about the CSP below: + // - script-src 'unsafe-eval' is currently required because agent-js uses a WebAssembly module for the validation of bls signatures. + // There is currently no other way to allow execution of WebAssembly modules with CSP. + // See: https://github.com/WebAssembly/content-security-policy/blob/main/proposals/CSP.md. + // - We added img-src data: because data: images are used often. + // - frame-ancestors: none mitigates clickjacking attacks. See https://owasp.org/www-community/attacks/Clickjacking. + "Content-Security-Policy": "default-src 'self';script-src 'self' 'unsafe-eval';connect-src 'self' https://icp0.io https://*.icp0.io;img-src 'self' data:;style-src * 'unsafe-inline';style-src-elem * 'unsafe-inline';font-src *;object-src 'none';base-uri 'self';frame-ancestors 'none';form-action 'self';upgrade-insecure-requests;", + + // Security: The permissions policy disables all features for security reasons. If your site needs such permissions, activate them. + // To configure permissions go here https://www.permissionspolicy.com/ + "Permissions-Policy": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(), clipboard-write=(), gamepad=(), speaker-selection=(), conversion-measurement=(), focus-without-user-activation=(), hid=(), idle-detection=(), interest-cohort=(), serial=(), sync-script=(), trust-token-redemption=(), window-placement=(), vertical-scroll=()", + + // Security: Mitigates clickjacking attacks. + // See: https://owasp.org/www-community/attacks/Clickjacking. + "X-Frame-Options": "DENY", + + // Security: Avoids forwarding referrer information to other origins. + // See: https://owasp.org/www-project-secure-headers/#referrer-policy. + "Referrer-Policy": "same-origin", + + // Security: Tells the user’s browser that it must always use HTTPS with your site. + // See: https://owasp.org/www-project-secure-headers/#http-strict-transport-security + "Strict-Transport-Security": "max-age=31536000; includeSubDomains", + + // Security: Prevents the browser from interpreting files as a different MIME type to what is specified in the Content-Type header. + // See: https://owasp.org/www-project-secure-headers/#x-content-type-options + "X-Content-Type-Options": "nosniff", + + // Security: Enables browser features to mitigate some of the XSS attacks. Note that it has to be in mode=block. + // See: https://owasp.org/www-community/attacks/xss/ + "X-XSS-Protection": "1; mode=block" + }, + // redirect all requests from .raw.icp0.io to .icp0.io (this redirection is the default) + "allow_raw_access": false + }, +] diff --git a/motoko/vetkd/src/app_frontend_js/assets/favicon.ico b/motoko/vetkd/src/app_frontend_js/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..338fbf34cd80a1fd7d0c259aae42b566a56f7168 GIT binary patch literal 15406 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 A0{{R3 literal 0 HcmV?d00001 diff --git a/motoko/vetkd/src/app_frontend_js/assets/logo2.svg b/motoko/vetkd/src/app_frontend_js/assets/logo2.svg new file mode 100644 index 000000000..74bc67e39 --- /dev/null +++ b/motoko/vetkd/src/app_frontend_js/assets/logo2.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/motoko/vetkd/src/app_frontend_js/assets/main.css b/motoko/vetkd/src/app_frontend_js/assets/main.css new file mode 100644 index 000000000..c988f6010 --- /dev/null +++ b/motoko/vetkd/src/app_frontend_js/assets/main.css @@ -0,0 +1,31 @@ +body { + font-family: sans-serif; + font-size: 1.2rem; +} + +form { + display: flex; + justify-content: center; + gap: 0.5em; + flex-flow: row wrap; + max-width: 40vw; + margin: auto; + align-items: baseline; +} + +button[type="submit"] { + padding: 5px 20px; + margin: 10px auto; + float: right; +} + +#builtonchainlogo { + display: block; + margin-left: auto; + margin-right: auto; + width: 15% +} + +#vetkddemo { + text-align: center; +} \ No newline at end of file diff --git a/motoko/vetkd/src/app_frontend_js/assets/sample-asset.txt b/motoko/vetkd/src/app_frontend_js/assets/sample-asset.txt new file mode 100644 index 000000000..7c011d0f9 --- /dev/null +++ b/motoko/vetkd/src/app_frontend_js/assets/sample-asset.txt @@ -0,0 +1 @@ +This is a sample asset! diff --git a/motoko/vetkd/src/app_frontend_js/src/.ic-assets.json5 b/motoko/vetkd/src/app_frontend_js/src/.ic-assets.json5 new file mode 100644 index 000000000..8dc76d1ee --- /dev/null +++ b/motoko/vetkd/src/app_frontend_js/src/.ic-assets.json5 @@ -0,0 +1,56 @@ +[ + { + "match": "**/*", + "headers": { + // Security: The Content Security Policy (CSP) given below aims at working with many apps rather than providing maximal security. + // We recommend tightening the CSP for your specific application. Some recommendations are as follows: + // - Use the CSP Evaluator (https://csp-evaluator.withgoogle.com/) to validate the CSP you define. + // - Follow the “Strict CSP” recommendations (https://csp.withgoogle.com/docs/strict-csp.html). However, note that in the context of the IC, + // nonces cannot be used because the response bodies must be static to work well with HTTP asset certification. + // Thus, we recommend to include script hashes (in combination with strict-dynamic) in the CSP as described + // in https://csp.withgoogle.com/docs/faq.html in section “What if my site is static and I can't add nonces to scripts?”. + // See for example the II CSP (https://github.com/dfinity/internet-identity/blob/main/src/internet_identity/src/http.rs). + // - It is recommended to tighten the connect-src directive. With the current CSP configuration the browser can + // make requests to https://*.icp0.io, hence being able to call any canister via https://icp0.io/api/v2/canister/{canister-ID}. + // This could potentially be used in combination with another vulnerability (e.g. XSS) to exfiltrate private data. + // The developer can configure this policy to only allow requests to their specific canisters, + // e.g: connect-src 'self' https://icp-api.io/api/v2/canister/{my-canister-ID}, where {my-canister-ID} has the following format: aaaaa-aaaaa-aaaaa-aaaaa-aaa + // - It is recommended to configure style-src, style-src-elem and font-src directives with the resources your canister is going to use + // instead of using the wild card (*) option. Normally this will include 'self' but also other third party styles or fonts resources (e.g: https://fonts.googleapis.com or other CDNs) + + // Notes about the CSP below: + // - script-src 'unsafe-eval' is currently required because agent-js uses a WebAssembly module for the validation of bls signatures. + // There is currently no other way to allow execution of WebAssembly modules with CSP. + // See: https://github.com/WebAssembly/content-security-policy/blob/main/proposals/CSP.md. + // - We added img-src data: because data: images are used often. + // - frame-ancestors: none mitigates clickjacking attacks. See https://owasp.org/www-community/attacks/Clickjacking. + "Content-Security-Policy": "default-src 'self';script-src 'self' 'unsafe-eval';connect-src 'self' https://icp0.io https://*.icp0.io;img-src 'self' data:;style-src * 'unsafe-inline';style-src-elem * 'unsafe-inline';font-src *;object-src 'none';base-uri 'self';frame-ancestors 'none';form-action 'self';upgrade-insecure-requests;", + + // Security: The permissions policy disables all features for security reasons. If your site needs such permissions, activate them. + // To configure permissions go here https://www.permissionspolicy.com/ + "Permissions-Policy": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(), clipboard-write=(), gamepad=(), speaker-selection=(), conversion-measurement=(), focus-without-user-activation=(), hid=(), idle-detection=(), interest-cohort=(), serial=(), sync-script=(), trust-token-redemption=(), window-placement=(), vertical-scroll=()", + + // Security: Mitigates clickjacking attacks. + // See: https://owasp.org/www-community/attacks/Clickjacking. + "X-Frame-Options": "DENY", + + // Security: Avoids forwarding referrer information to other origins. + // See: https://owasp.org/www-project-secure-headers/#referrer-policy. + "Referrer-Policy": "same-origin", + + // Security: Tells the user’s browser that it must always use HTTPS with your site. + // See: https://owasp.org/www-project-secure-headers/#http-strict-transport-security + "Strict-Transport-Security": "max-age=31536000; includeSubDomains", + + // Security: Prevents the browser from interpreting files as a different MIME type to what is specified in the Content-Type header. + // See: https://owasp.org/www-project-secure-headers/#x-content-type-options + "X-Content-Type-Options": "nosniff", + + // Security: Enables browser features to mitigate some of the XSS attacks. Note that it has to be in mode=block. + // See: https://owasp.org/www-community/attacks/xss/ + "X-XSS-Protection": "1; mode=block" + }, + // redirect all requests from .raw.icp0.io to .icp0.io (this redirection is the default) + "allow_raw_access": false + }, +] diff --git a/motoko/vetkd/src/app_frontend_js/src/index.html b/motoko/vetkd/src/app_frontend_js/src/index.html new file mode 100644 index 000000000..edbf6644d --- /dev/null +++ b/motoko/vetkd/src/app_frontend_js/src/index.html @@ -0,0 +1,40 @@ + + + + + + + dfxtest + + + + + + +
+

vetKD Demo

+
+
+ +
+
+
+
+ +

+ +
+
+
+
+ +

+ +
+
+
+ +
+ + + diff --git a/motoko/vetkd/src/app_frontend_js/src/index.js b/motoko/vetkd/src/app_frontend_js/src/index.js new file mode 100644 index 000000000..2df5bdaf5 --- /dev/null +++ b/motoko/vetkd/src/app_frontend_js/src/index.js @@ -0,0 +1,129 @@ +import { app_backend } from "../../declarations/app_backend"; +import * as vetkd from "ic-vetkd-utils"; +import * as agent from "@dfinity/agent"; + +let fetched_symmetric_key = null; + +document.getElementById("get_symmetric_key_form").addEventListener("submit", async (e) => { + e.preventDefault(); + const button = e.target.querySelector("button"); + button.setAttribute("disabled", true); + const result = document.getElementById("get_symmetric_key_result"); + + result.innerText = "Fetching symmetric key..."; + const aes_256_key = await get_aes_256_gcm_key(); + result.innerText = "aes_256_key: " + hex_encode(aes_256_key); + + button.removeAttribute("disabled"); + + fetched_symmetric_key = aes_256_key; + update_plaintext_button_state(); + update_ciphertext_button_state(); + + return false; +}); + +document.getElementById("encrypt_form").addEventListener("submit", async (e) => { + e.preventDefault(); + const button = e.target.querySelector("button"); + button.setAttribute("disabled", true); + const result = document.getElementById("encrypt_result"); + + result.innerText = "Encrypting..."; + const ciphertext = await aes_gcm_encrypt(document.getElementById("plaintext").value, fetched_symmetric_key); + + result.innerText = "ciphertext: " + ciphertext; + + button.removeAttribute("disabled"); + return false; +}); + +document.getElementById("decrypt_form").addEventListener("submit", async (e) => { + e.preventDefault(); + const button = e.target.querySelector("button"); + button.setAttribute("disabled", true); + const result = document.getElementById("decrypt_result"); + + result.innerText = "Decrypting..."; + const plaintext = await aes_gcm_decrypt(document.getElementById("ciphertext").value, fetched_symmetric_key); + + result.innerText = "plaintext: " + plaintext; + + button.removeAttribute("disabled"); + return false; +}); + +document.getElementById("plaintext").addEventListener("keyup", async (e) => { + update_plaintext_button_state(); +}); + +document.getElementById("ciphertext").addEventListener("keyup", async (e) => { + update_ciphertext_button_state(); +}); + +function update_plaintext_button_state() { + const submit_plaintext_button = document.getElementById("submit_plaintext"); + if (document.getElementById("plaintext").value === "" || fetched_symmetric_key === null) { + submit_plaintext_button.setAttribute("disabled", true); + } else { + submit_plaintext_button.removeAttribute("disabled"); + } +} + +function update_ciphertext_button_state() { + const submit_ciphertext_button = document.getElementById("submit_ciphertext"); + if (document.getElementById("ciphertext").value === "" || fetched_symmetric_key === null) { + submit_ciphertext_button.setAttribute("disabled", true); + } else { + submit_ciphertext_button.removeAttribute("disabled"); + } +} + +async function get_aes_256_gcm_key() { + const seed = window.crypto.getRandomValues(new Uint8Array(32)); + const tsk = new vetkd.TransportSecretKey(seed); + const ek_bytes_hex = await app_backend.encrypted_symmetric_key_for_caller(tsk.public_key()); + const pk_bytes_hex = await app_backend.symmetric_key_verification_key(); + const app_backend_principal = await agent.Actor.agentOf(app_backend).getPrincipal(); // default is the anonymous principal! + return tsk.decrypt_and_hash( + hex_decode(ek_bytes_hex), + hex_decode(pk_bytes_hex), + app_backend_principal.toUint8Array(), + 32, + new TextEncoder().encode("aes-256-gcm") + ); +} + +async function aes_gcm_encrypt(message, rawKey) { + const iv = window.crypto.getRandomValues(new Uint8Array(12)); // 96-bits; unique per message + const aes_key = await window.crypto.subtle.importKey("raw", rawKey, "AES-GCM", false, ["encrypt"]); + const message_encoded = new TextEncoder().encode(message); + const ciphertext_buffer = await window.crypto.subtle.encrypt( + { name: "AES-GCM", iv: iv }, + aes_key, + message_encoded + ); + const ciphertext = new Uint8Array(ciphertext_buffer); + var iv_and_ciphertext = new Uint8Array(iv.length + ciphertext.length); + iv_and_ciphertext.set(iv, 0); + iv_and_ciphertext.set(ciphertext, iv.length); + return hex_encode(iv_and_ciphertext); +} + +async function aes_gcm_decrypt(ciphertext_hex, rawKey) { + const iv_and_ciphertext = hex_decode(ciphertext_hex); + const iv = iv_and_ciphertext.subarray(0, 12); // 96-bits; unique per message + const ciphertext = iv_and_ciphertext.subarray(12); + const aes_key = await window.crypto.subtle.importKey("raw", rawKey, "AES-GCM", false, ["decrypt"]); + let decrypted = await window.crypto.subtle.decrypt( + { name: "AES-GCM", iv: iv }, + aes_key, + ciphertext + ); + return new TextDecoder().decode(decrypted); +} + +const hex_decode = (hexString) => + Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); +const hex_encode = (bytes) => + bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), ''); \ No newline at end of file diff --git a/motoko/vetkd/src/system_api/Cargo.toml b/motoko/vetkd/src/system_api/Cargo.toml new file mode 100644 index 000000000..0ba2650bd --- /dev/null +++ b/motoko/vetkd/src/system_api/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "vetkd_system_api" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib"] + +[dependencies] +candid = "0.8.4" +ic-cdk = "0.7.1" +serde = "1" +ic-crypto-internal-bls12-381-vetkd = { git = "https://github.com/dfinity/ic" } +ic-crypto-internal-bls12-381-type = { git = "https://github.com/dfinity/ic" } +rand = "0.8" +rand_chacha = "0.3" +lazy_static = "1.4" +hex = "0.4" \ No newline at end of file diff --git a/motoko/vetkd/src/system_api/src/lib.rs b/motoko/vetkd/src/system_api/src/lib.rs new file mode 100644 index 000000000..37a265eaa --- /dev/null +++ b/motoko/vetkd/src/system_api/src/lib.rs @@ -0,0 +1,148 @@ +use ic_cdk::update; +use ic_crypto_internal_bls12_381_type::{G2Affine, Scalar}; +use ic_crypto_internal_bls12_381_vetkd::{ + DerivationPath, DerivedPublicKey, EncryptedKey, EncryptedKeyShare, TransportPublicKey, + TransportPublicKeyDeserializationError, +}; +use rand::SeedableRng; +use rand_chacha::ChaCha20Rng; +use std::cell::RefCell; +use types::{ + VetKDCurve, VetKDEncryptedKeyReply, VetKDEncryptedKeyRequest, VetKDKeyId, VetKDPublicKeyReply, + VetKDPublicKeyRequest, +}; + +mod types; + +const ENCRYPTED_KEY_CYCLE_COSTS: u64 = 0; + +/// DISCLAIMER: This canister here provides an *unsafe* example implementation +/// of a [proposed](https://github.com/dfinity/interface-spec/pull/158) vetKD +/// system API for demonstration purposes. Because of this, in the following +/// we hard-code a randomly generated master secret key. In case vetKD will be +/// integrated into the Internet Computer protocol, then such a key would be +/// created in a secure manner with distributed key generation so that the key +/// never exists in combined form anywyere and nodes can use it only collectively. +const MASTER_SK_HEX: &str = "718c36cd1dcf3501fd04bbe24c3bb9eedfd066d2420e794dd9342cf71d04176f"; + +lazy_static::lazy_static! { + static ref MASTER_SK: Scalar = Scalar::deserialize( + &hex::decode(MASTER_SK_HEX).expect("failed to hex-decode") + ).expect("failed to deserialize Scalar"); + static ref MASTER_PK: G2Affine = G2Affine::from(G2Affine::generator() * &*MASTER_SK); +} + +thread_local! { + static RNG: RefCell> = RefCell::new(None); +} + +#[update] +async fn vetkd_public_key(request: VetKDPublicKeyRequest) -> VetKDPublicKeyReply { + ensure_bls12_381_test_key_1(request.key_id); + ensure_derivation_path_is_valid(&request.derivation_path); + let derivation_path = { + let canister_id = request.canister_id.unwrap_or_else(ic_cdk::caller); + DerivationPath::new(canister_id.as_slice(), &request.derivation_path) + }; + let derived_public_key = DerivedPublicKey::compute_derived_key(&MASTER_PK, &derivation_path); + VetKDPublicKeyReply { + public_key: derived_public_key.serialize().to_vec(), + } +} + +#[update] +async fn vetkd_encrypted_key(request: VetKDEncryptedKeyRequest) -> VetKDEncryptedKeyReply { + ensure_call_is_paid(ENCRYPTED_KEY_CYCLE_COSTS); + ensure_bls12_381_test_key_1(request.key_id); + ensure_derivation_path_is_valid(&request.public_key_derivation_path); + let derivation_path = DerivationPath::new( + ic_cdk::caller().as_slice(), + &request.public_key_derivation_path, + ); + let tpk = + TransportPublicKey::deserialize(&request.encryption_public_key).unwrap_or_else( + |e| match e { + TransportPublicKeyDeserializationError::InvalidPublicKey => { + ic_cdk::trap("invalid encryption public key") + } + }, + ); + let eks = with_rng(|rng| { + EncryptedKeyShare::create( + rng, + &MASTER_PK, + &MASTER_SK, + &tpk, + &derivation_path, + &request.derivation_id, + ) + }) + .await; + let ek = EncryptedKey::combine( + &vec![(0, MASTER_PK.clone(), eks)], + 1, + &MASTER_PK, + &tpk, + &derivation_path, + &request.derivation_id, + ) + .unwrap_or_else(|_e| ic_cdk::trap("bad key share")); + + VetKDEncryptedKeyReply { + encrypted_key: ek.serialize().to_vec(), + } +} + +fn ensure_bls12_381_test_key_1(key_id: VetKDKeyId) { + if key_id.curve != VetKDCurve::Bls12_381 { + ic_cdk::trap("unsupported key ID curve"); + } + if key_id.name.as_str() != "test_key_1" { + ic_cdk::trap("unsupported key ID name"); + } +} + +fn ensure_derivation_path_is_valid(derivation_path: &Vec>) { + if derivation_path.len() > 255 { + ic_cdk::trap("derivation path too long") + } +} + +fn ensure_call_is_paid(cycles: u64) { + if ic_cdk::api::call::msg_cycles_accept(cycles) < cycles { + ic_cdk::trap("insufficient cycles"); + } +} + +/// Uses an RNG from the canister's state that is seeded _once_ from a system call to `raw_rand`. +/// IMPORTANT: this technique cannot generally be considered secure/safe because malicious nodes +/// could then predict randomness. However, in this particular case here it is OK to use the +/// cached RNG because the entire canister is anyway _unsafe_ and only for demonstration purposes. +async fn with_rng(fn_with_rng: impl FnOnce(&mut ChaCha20Rng) -> T) -> T { + let rng_initialized = RNG.with(|option_rng| match &*option_rng.borrow() { + Some(_rng) => true, + None => false, + }); + if !rng_initialized { + let (raw_rand,): (Vec,) = ic_cdk::api::management_canister::main::raw_rand() + .await + .unwrap_or_else(|_e| ic_cdk::trap("call to raw_rand failed")); + let raw_rand_32_bytes: [u8; 32] = raw_rand + .try_into() + .unwrap_or_else(|_e| panic!("raw_rand not 32 bytes")); + let rng = ChaCha20Rng::from_seed(raw_rand_32_bytes); + RNG.with(|option_rng| { + // Initialize the RNG only if it wasn't initialized before. + // Note that this is necessary because the RNG state is accessed + // both before (read) and after (write) the async inter-canister + // call to raw_rand, which leads to the code being executed in + // different messages. See + // https://internetcomputer.org/docs/current/developer-docs/security/ + // for more details regarding _canister development security best + // practices_. + option_rng.borrow_mut().get_or_insert(rng); + }); + ic_cdk::println!("RNG initialized"); + } + RNG.with(|option_rng| fn_with_rng(option_rng.borrow_mut().as_mut().expect("missing RNG"))) +} diff --git a/motoko/vetkd/src/system_api/src/types.rs b/motoko/vetkd/src/system_api/src/types.rs new file mode 100644 index 000000000..11c063c50 --- /dev/null +++ b/motoko/vetkd/src/system_api/src/types.rs @@ -0,0 +1,42 @@ +use ic_cdk::export::candid::CandidType; +use ic_cdk::export::serde::Deserialize; +use ic_cdk::export::Principal; + +pub type CanisterId = Principal; + +#[derive(CandidType, Deserialize, Eq, PartialEq)] +pub enum VetKDCurve { + #[serde(rename = "bls12_381")] + Bls12_381, +} + +#[derive(CandidType, Deserialize, Eq, PartialEq)] +pub struct VetKDKeyId { + pub curve: VetKDCurve, + pub name: String, +} + +#[derive(CandidType, Deserialize)] +pub struct VetKDPublicKeyRequest { + pub canister_id: Option, + pub derivation_path: Vec>, + pub key_id: VetKDKeyId, +} + +#[derive(CandidType)] +pub struct VetKDPublicKeyReply { + pub public_key: Vec, +} + +#[derive(CandidType, Deserialize)] +pub struct VetKDEncryptedKeyRequest { + pub public_key_derivation_path: Vec>, + pub derivation_id: Vec, + pub key_id: VetKDKeyId, + pub encryption_public_key: Vec, +} + +#[derive(CandidType)] +pub struct VetKDEncryptedKeyReply { + pub encrypted_key: Vec, +} diff --git a/motoko/vetkd/src/system_api/vetkd_system_api.did b/motoko/vetkd/src/system_api/vetkd_system_api.did new file mode 100644 index 000000000..ac265c2b7 --- /dev/null +++ b/motoko/vetkd/src/system_api/vetkd_system_api.did @@ -0,0 +1,20 @@ +type canister_id = principal; +type vetkd_curve = variant { bls12_381 }; + +service : { + vetkd_public_key : ( + record { + canister_id : opt canister_id; + derivation_path : vec blob; + key_id : record { curve : vetkd_curve; name : text }; + } + ) -> (record { public_key : blob }); + vetkd_encrypted_key : ( + record { + public_key_derivation_path : vec blob; + derivation_id : blob; + key_id : record { curve : vetkd_curve; name : text }; + encryption_public_key : blob; + } + ) -> (record { encrypted_key : blob }); +}; diff --git a/motoko/vetkd/webpack.config.js b/motoko/vetkd/webpack.config.js new file mode 100644 index 000000000..e3978911a --- /dev/null +++ b/motoko/vetkd/webpack.config.js @@ -0,0 +1,99 @@ +require("dotenv").config(); +const path = require("path"); +const webpack = require("webpack"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const TerserPlugin = require("terser-webpack-plugin"); +const CopyPlugin = require("copy-webpack-plugin"); + +const isDevelopment = process.env.NODE_ENV !== "production"; + +const frontendDirectory = "app_frontend_js"; + +const frontend_entry = path.join("src", frontendDirectory, "src", "index.html"); + +module.exports = { + target: "web", + mode: isDevelopment ? "development" : "production", + entry: { + // The frontend.entrypoint points to the HTML file for this build, so we need + // to replace the extension to `.js`. + index: path.join(__dirname, frontend_entry).replace(/\.html$/, ".js"), + }, + devtool: isDevelopment ? "source-map" : false, + optimization: { + minimize: !isDevelopment, + minimizer: [new TerserPlugin()], + }, + resolve: { + extensions: [".js", ".ts", ".jsx", ".tsx"], + fallback: { + assert: require.resolve("assert/"), + buffer: require.resolve("buffer/"), + events: require.resolve("events/"), + stream: require.resolve("stream-browserify/"), + util: require.resolve("util/"), + }, + }, + output: { + filename: "index.js", + path: path.join(__dirname, "dist", frontendDirectory), + }, + + // Depending in the language or framework you are using for + // front-end development, add module loaders to the default + // webpack configuration. For example, if you are using React + // modules and CSS as described in the "Adding a stylesheet" + // tutorial, uncomment the following lines: + // module: { + // rules: [ + // { test: /\.(ts|tsx|jsx)$/, loader: "ts-loader" }, + // { test: /\.css$/, use: ['style-loader','css-loader'] } + // ] + // }, + plugins: [ + new HtmlWebpackPlugin({ + template: path.join(__dirname, frontend_entry), + cache: false, + }), + new webpack.EnvironmentPlugin([ + ...Object.keys(process.env).filter((key) => { + if (key.includes("CANISTER")) return true; + if (key.includes("DFX")) return true; + return false; + }), + ]), + new webpack.ProvidePlugin({ + Buffer: [require.resolve("buffer/"), "Buffer"], + process: require.resolve("process/browser"), + }), + new CopyPlugin({ + patterns: [ + { + from: `src/${frontendDirectory}/src/.ic-assets.json*`, + to: ".ic-assets.json5", + noErrorOnMissing: true, + }, + ], + }), + ], + experiments: { + asyncWebAssembly: true, + }, + // proxy /api to port 4943 during development. + // if you edit dfx.json to define a project-specific local network, change the port to match. + devServer: { + proxy: { + "/api": { + target: "http://127.0.0.1:4943", + changeOrigin: true, + pathRewrite: { + "^/api": "/api", + }, + }, + }, + static: path.resolve(__dirname, "src", frontendDirectory, "assets"), + hot: true, + watchFiles: [path.resolve(__dirname, "src", frontendDirectory)], + liveReload: true, + }, +}; diff --git a/rust/vetkd/Makefile b/rust/vetkd/Makefile index 21761fd71..363bb8d03 100644 --- a/rust/vetkd/Makefile +++ b/rust/vetkd/Makefile @@ -23,5 +23,6 @@ clean: rm -rf .dfx rm -rf dist rm -rf node_modules + rm -rf src/declarations rm -f .env cargo clean diff --git a/rust/vetkd/README.md b/rust/vetkd/README.md index 460faa033..08d6087db 100644 --- a/rust/vetkd/README.md +++ b/rust/vetkd/README.md @@ -3,7 +3,7 @@ This repository provides a canister (`src/system_api`) that offers the vetKD system API proposed in https://github.com/dfinity/interface-spec/pull/158, implemented in an **unsafe** manner **for demonstration purposes**. Additionally, the repository provides: -* An example app backend canister (`src/app_backend`) that makes use of this system API in order to provide caller-specific symmetric keys that can be used for AES encryption and decryption. +* An example app backend canister (`src/app_backend`) implemented in **Rust** that makes use of this system API in order to provide caller-specific symmetric keys that can be used for AES encryption and decryption. * An example frontend (`src/app_frontend_js`) that uses the backend from Javascript in the browser. @@ -15,6 +15,11 @@ Additionally, the repository provides: The implementation of [the proposed vetKD system API](https://github.com/dfinity/interface-spec/pull/158) used in this example is **unsafe**, e.g., we hard-code a master secret key, rather than using a master secret key that is distributed among sufficiently many Internet Computer nodes by means of distributed key generation. **Do not use this in production or for sensitive data**! This example is solely provided **for demonstration purposes** to collect feedback on the mentioned vetKD system API. See also the respective disclaimer [in the system API canister implementation](https://github.com/dfinity/examples/blob/master/rust/vetkd/src/system_api/src/lib.rs#L19-L26). +## Prerequisites +- [ ] Install the [IC SDK](https://internetcomputer.org/docs/current/developer-docs/setup/install/). +- [ ] Install [Node.js](https://nodejs.org/en/download/). +- [ ] Install [Rust](https://www.rust-lang.org/tools/install), and add Wasm as a target (`rustup target add wasm32-unknown-unknown`). + ## Running Locally 1. Start a local internet computer.