diff --git a/.gitignore b/.gitignore index 484a76c98..d0c37afe0 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,8 @@ hyperdrive/src/bootstrapped_processes.rs hyperdrive/packages/**/wasi_snapshot_preview1.wasm hyperdrive/packages/app-store/pkg/ui/* +hyperdrive/packages/file-explorer/api +hyperdrive/packages/file-explorer/pkg/ui/* hyperdrive/packages/homepage/pkg/ui/* hyperdrive/packages/settings/pkg/ui/* hyperdrive/src/register-ui/build/ diff --git a/Cargo.lock b/Cargo.lock index abefcb67c..365ca3d07 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,7 +82,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -817,7 +817,7 @@ dependencies = [ "sha3", "url", "urlencoding 2.1.3", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -1025,6 +1025,18 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auditable-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5" +dependencies = [ + "semver 1.0.26", + "serde", + "serde_json", + "topological-sort", +] + [[package]] name = "auto_impl" version = "1.3.0" @@ -1217,6 +1229,7 @@ dependencies = [ "clap", "fs-err", "kit", + "serde", "serde_json", "tokio", "walkdir", @@ -1288,6 +1301,22 @@ dependencies = [ "serde", ] +[[package]] +name = "caller-utils" +version = "0.1.0" +dependencies = [ + "anyhow", + "futures", + "futures-util", + "hyperware_app_common", + "once_cell", + "process_macros", + "serde", + "serde_json", + "uuid 1.17.0", + "wit-bindgen 0.41.0", +] + [[package]] name = "camino" version = "1.1.10" @@ -1406,7 +1435,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -1476,7 +1505,7 @@ dependencies = [ "sha3", "url", "urlencoding 2.1.3", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -1686,7 +1715,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2293,7 +2322,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2310,7 +2339,7 @@ dependencies = [ "sha3", "url", "urlencoding 2.1.3", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -2339,7 +2368,7 @@ name = "echo" version = "0.1.0" dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2444,6 +2473,23 @@ dependencies = [ "uuid 0.8.2", ] +[[package]] +name = "explorer" +version = "0.1.0" +dependencies = [ + "anyhow", + "caller-utils", + "hyperprocess_macro", + "hyperware_app_common", + "md5", + "process_macros", + "serde", + "serde_json", + "serde_urlencoded", + "tracing", + "wit-bindgen 0.42.1", +] + [[package]] name = "eyre" version = "0.6.12" @@ -2612,7 +2658,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -2757,7 +2803,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2953,7 +2999,7 @@ name = "help" version = "0.1.0" dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2980,7 +3026,7 @@ dependencies = [ "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2990,7 +3036,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3028,7 +3074,7 @@ dependencies = [ "serde", "serde_json", "thiserror 1.0.69", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3040,7 +3086,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3305,7 +3351,50 @@ dependencies = [ "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", +] + +[[package]] +name = "hyperprocess_macro" +version = "0.1.0" +source = "git+https://github.com/hyperware-ai/hyperprocess-macro?rev=9836e2a#9836e2abe1da7bd2ccfef837244810438af26a07" +dependencies = [ + "anyhow", + "futures-util", + "hyperware_app_common", + "hyperware_process_lib 2.0.1", + "once_cell", + "paste", + "proc-macro2", + "process_macros", + "quote", + "rmp-serde", + "serde", + "serde_derive", + "serde_json", + "syn 2.0.104", + "uuid 1.17.0", + "wit-bindgen 0.36.0", +] + +[[package]] +name = "hyperware_app_common" +version = "0.1.0" +source = "git+https://github.com/hyperware-ai/hyperprocess-macro?rev=9836e2a#9836e2abe1da7bd2ccfef837244810438af26a07" +dependencies = [ + "anyhow", + "futures-util", + "hyperware_process_lib 2.0.1", + "once_cell", + "paste", + "process_macros", + "rmp-serde", + "serde", + "serde_derive", + "serde_json", + "thiserror 2.0.12", + "uuid 1.17.0", + "wit-bindgen 0.36.0", ] [[package]] @@ -3334,7 +3423,7 @@ dependencies = [ "tracing-error", "tracing-subscriber", "url", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3362,7 +3451,35 @@ dependencies = [ "tracing-error", "tracing-subscriber", "url", - "wit-bindgen", + "wit-bindgen 0.42.1", +] + +[[package]] +name = "hyperware_process_lib" +version = "2.0.1" +source = "git+https://github.com/hyperware-ai/process_lib?rev=cfd6843#cfd6843139bc40ffeefb1304372878c07d3132b7" +dependencies = [ + "alloy", + "alloy-primitives", + "alloy-sol-macro", + "alloy-sol-types", + "anyhow", + "base64 0.22.1", + "bincode", + "color-eyre", + "http 1.3.1", + "mime_guess", + "rand 0.8.5", + "regex", + "rmp-serde", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", + "tracing-error", + "tracing-subscriber", + "url", + "wit-bindgen 0.42.1", ] [[package]] @@ -3597,7 +3714,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3794,13 +3911,13 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "kit" -version = "2.0.0" -source = "git+https://github.com/hyperware-ai/kit?rev=81ca2ef#81ca2ef071aeb8cb926e67ed23f0e0f2d5fb953f" +version = "2.1.0" +source = "git+https://github.com/hyperware-ai/kit?rev=531f660#531f660352376393a32952793a17c4605fb721ad" dependencies = [ "alloy", "alloy-sol-macro", @@ -3835,7 +3952,7 @@ dependencies = [ "tracing-error", "tracing-subscriber", "walkdir", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 0.6.6", ] @@ -4079,7 +4196,7 @@ dependencies = [ "regex", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -4123,6 +4240,12 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + [[package]] name = "memchr" version = "2.7.5" @@ -4243,7 +4366,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rmp-serde", "serde", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -4287,7 +4410,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -4613,7 +4736,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rmp-serde", "serde", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -4623,7 +4746,7 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rmp-serde", "serde", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5170,7 +5293,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5181,7 +5304,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5193,7 +5316,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5675,7 +5798,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5689,7 +5812,7 @@ dependencies = [ "serde", "serde_json", "url", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5759,7 +5882,7 @@ dependencies = [ "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5859,6 +5982,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spdx" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58b69356da67e2fc1f542c71ea7e654a361a79c938e4424392ecf4fa065d2193" +dependencies = [ + "smallvec", +] + [[package]] name = "spin" version = "0.9.8" @@ -5895,7 +6027,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5906,7 +6038,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5940,7 +6072,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6119,7 +6251,7 @@ dependencies = [ "regex", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6133,7 +6265,7 @@ dependencies = [ "serde", "serde_json", "thiserror 1.0.69", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6412,9 +6544,15 @@ dependencies = [ "hyperware_process_lib 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] +[[package]] +name = "topological-sort" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" + [[package]] name = "tower" version = "0.5.2" @@ -6775,7 +6913,7 @@ dependencies = [ "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6851,6 +6989,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ + "getrandom 0.3.3", "js-sys", "wasm-bindgen", ] @@ -7016,6 +7155,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1" +dependencies = [ + "leb128", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasm-encoder" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" +dependencies = [ + "leb128fmt", + "wasmparser 0.227.1", +] + [[package]] name = "wasm-encoder" version = "0.229.0" @@ -7046,6 +7205,41 @@ dependencies = [ "wasmparser 0.235.0", ] +[[package]] +name = "wasm-metadata" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.220.1", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasm-metadata" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" +dependencies = [ + "anyhow", + "auditable-serde", + "flate2", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "url", + "wasm-encoder 0.227.1", + "wasmparser 0.227.1", +] + [[package]] name = "wasm-metadata" version = "0.230.0" @@ -7058,6 +7252,31 @@ dependencies = [ "wasmparser 0.230.0", ] +[[package]] +name = "wasmparser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25" +dependencies = [ + "ahash", + "bitflags 2.9.1", + "hashbrown 0.14.5", + "indexmap", + "semver 1.0.26", +] + +[[package]] +name = "wasmparser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" +dependencies = [ + "bitflags 2.9.1", + "hashbrown 0.15.4", + "indexmap", + "semver 1.0.26", +] + [[package]] name = "wasmparser" version = "0.229.0" @@ -7877,6 +8096,26 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wit-bindgen" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3" +dependencies = [ + "wit-bindgen-rt 0.36.0", + "wit-bindgen-rust-macro 0.36.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" +dependencies = [ + "wit-bindgen-rt 0.41.0", + "wit-bindgen-rust-macro 0.41.0", +] + [[package]] name = "wit-bindgen" version = "0.42.1" @@ -7884,7 +8123,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8" dependencies = [ "wit-bindgen-rt 0.42.1", - "wit-bindgen-rust-macro", + "wit-bindgen-rust-macro 0.42.1", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.227.1", ] [[package]] @@ -7898,6 +8159,15 @@ dependencies = [ "wit-parser 0.230.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" @@ -7907,6 +8177,17 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" +dependencies = [ + "bitflags 2.9.1", + "futures", + "once_cell", +] + [[package]] name = "wit-bindgen-rt" version = "0.42.1" @@ -7918,6 +8199,38 @@ dependencies = [ "once_cell", ] +[[package]] +name = "wit-bindgen-rust" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.104", + "wasm-metadata 0.220.1", + "wit-bindgen-core 0.36.0", + "wit-component 0.220.1", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.104", + "wasm-metadata 0.227.1", + "wit-bindgen-core 0.41.0", + "wit-component 0.227.1", +] + [[package]] name = "wit-bindgen-rust" version = "0.42.1" @@ -7929,9 +8242,39 @@ dependencies = [ "indexmap", "prettyplease", "syn 2.0.104", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", + "wasm-metadata 0.230.0", + "wit-bindgen-core 0.42.1", + "wit-component 0.230.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.104", + "wit-bindgen-core 0.36.0", + "wit-bindgen-rust 0.36.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.104", + "wit-bindgen-core 0.41.0", + "wit-bindgen-rust 0.41.0", ] [[package]] @@ -7945,8 +8288,46 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.104", - "wit-bindgen-core", - "wit-bindgen-rust", + "wit-bindgen-core 0.42.1", + "wit-bindgen-rust 0.42.1", +] + +[[package]] +name = "wit-component" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627" +dependencies = [ + "anyhow", + "bitflags 2.9.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.220.1", + "wasm-metadata 0.220.1", + "wasmparser 0.220.1", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-component" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" +dependencies = [ + "anyhow", + "bitflags 2.9.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.227.1", + "wasm-metadata 0.227.1", + "wasmparser 0.227.1", + "wit-parser 0.227.1", ] [[package]] @@ -7963,11 +8344,47 @@ dependencies = [ "serde_derive", "serde_json", "wasm-encoder 0.230.0", - "wasm-metadata", + "wasm-metadata 0.230.0", "wasmparser 0.230.0", "wit-parser 0.230.0", ] +[[package]] +name = "wit-parser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.26", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.220.1", +] + +[[package]] +name = "wit-parser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.26", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.227.1", +] + [[package]] name = "wit-parser" version = "0.229.0" diff --git a/Cargo.toml b/Cargo.toml index c34ac3303..ca390a4cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ members = [ "hyperdrive/packages/app-store/downloads", "hyperdrive/packages/app-store/chain", "hyperdrive/packages/app-store/download", "hyperdrive/packages/app-store/install", "hyperdrive/packages/app-store/uninstall", "hyperdrive/packages/app-store/reset-store", "hyperdrive/packages/contacts/contacts", + "hyperdrive/packages/file-explorer/explorer", "hyperdrive/packages/homepage/homepage", "hyperdrive/packages/hns-indexer/hns-indexer", "hyperdrive/packages/hns-indexer/get-block", "hyperdrive/packages/settings/settings", "hyperdrive/packages/hns-indexer/reset", "hyperdrive/packages/hns-indexer/node-info", "hyperdrive/packages/hns-indexer/state", diff --git a/hyperdrive/packages-build-parameters.json b/hyperdrive/packages-build-parameters.json new file mode 100644 index 000000000..ca605d406 --- /dev/null +++ b/hyperdrive/packages-build-parameters.json @@ -0,0 +1,10 @@ +{ + "hypermap-cacher": { + "local_dependencies": [ + "sign" + ] + }, + "file-explorer": { + "is_hyperapp": true + } +} diff --git a/hyperdrive/packages-local-dependencies.json b/hyperdrive/packages-local-dependencies.json deleted file mode 100644 index 0bdd104b6..000000000 --- a/hyperdrive/packages-local-dependencies.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "hypermap-cacher": [ - "sign" - ] -} diff --git a/hyperdrive/packages/app-store/app-store/src/lib.rs b/hyperdrive/packages/app-store/app-store/src/lib.rs index 2116ac202..15909d3ef 100644 --- a/hyperdrive/packages/app-store/app-store/src/lib.rs +++ b/hyperdrive/packages/app-store/app-store/src/lib.rs @@ -43,7 +43,7 @@ use serde::{Deserialize, Serialize}; use state::{State, UpdateInfo, Updates}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/app-store/chain/src/lib.rs b/hyperdrive/packages/app-store/chain/src/lib.rs index 23999e579..0de1de78f 100644 --- a/hyperdrive/packages/app-store/chain/src/lib.rs +++ b/hyperdrive/packages/app-store/chain/src/lib.rs @@ -42,7 +42,7 @@ use std::collections::HashMap; use std::str::FromStr; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/app-store/download/src/lib.rs b/hyperdrive/packages/app-store/download/src/lib.rs index c5745aeba..011658491 100644 --- a/hyperdrive/packages/app-store/download/src/lib.rs +++ b/hyperdrive/packages/app-store/download/src/lib.rs @@ -18,7 +18,7 @@ use hyperware_process_lib::{ }; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [PartialEq, serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/app-store/downloads/src/lib.rs b/hyperdrive/packages/app-store/downloads/src/lib.rs index a4e332d73..c15b95610 100644 --- a/hyperdrive/packages/app-store/downloads/src/lib.rs +++ b/hyperdrive/packages/app-store/downloads/src/lib.rs @@ -63,7 +63,7 @@ use std::{ }; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/app-store/ft-worker/src/lib.rs b/hyperdrive/packages/app-store/ft-worker/src/lib.rs index b5ca56436..a049d0bbd 100644 --- a/hyperdrive/packages/app-store/ft-worker/src/lib.rs +++ b/hyperdrive/packages/app-store/ft-worker/src/lib.rs @@ -55,7 +55,7 @@ use std::str::FromStr; pub mod ft_worker_lib; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/app-store/install/src/lib.rs b/hyperdrive/packages/app-store/install/src/lib.rs index 3fdc2de4e..3ea18f723 100644 --- a/hyperdrive/packages/app-store/install/src/lib.rs +++ b/hyperdrive/packages/app-store/install/src/lib.rs @@ -16,7 +16,7 @@ use hyperware_process_lib::{ }; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [PartialEq, serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/app-store/reset-store/src/lib.rs b/hyperdrive/packages/app-store/reset-store/src/lib.rs index fe663a10f..9889c18ea 100644 --- a/hyperdrive/packages/app-store/reset-store/src/lib.rs +++ b/hyperdrive/packages/app-store/reset-store/src/lib.rs @@ -11,7 +11,7 @@ use crate::hyperware::process::chain::{ChainRequest, ChainResponse}; use hyperware_process_lib::{call_init, println, Address, Message, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [PartialEq, serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/app-store/uninstall/src/lib.rs b/hyperdrive/packages/app-store/uninstall/src/lib.rs index e7848a0db..3d75a85a0 100644 --- a/hyperdrive/packages/app-store/uninstall/src/lib.rs +++ b/hyperdrive/packages/app-store/uninstall/src/lib.rs @@ -13,7 +13,7 @@ use hyperware_process_lib::{ }; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", generate_unused_types: true, world: "app-store-sys-v1", additional_derives: [PartialEq, serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/contacts/contacts/src/lib.rs b/hyperdrive/packages/contacts/contacts/src/lib.rs index 641b4f686..de2676e94 100644 --- a/hyperdrive/packages/contacts/contacts/src/lib.rs +++ b/hyperdrive/packages/contacts/contacts/src/lib.rs @@ -8,7 +8,7 @@ use std::collections::HashMap; use std::str::FromStr; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "contacts-sys-v0", generate_unused_types: true, additional_derives: [PartialEq, serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/contacts/get-names/src/lib.rs b/hyperdrive/packages/contacts/get-names/src/lib.rs index 9a9703bea..1248346a5 100644 --- a/hyperdrive/packages/contacts/get-names/src/lib.rs +++ b/hyperdrive/packages/contacts/get-names/src/lib.rs @@ -2,7 +2,7 @@ use crate::hyperware::process::contacts; use hyperware_process_lib::{call_init, println, Address, Capability, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "contacts-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/file-explorer/Cargo.lock b/hyperdrive/packages/file-explorer/Cargo.lock new file mode 100644 index 000000000..c93b257c9 --- /dev/null +++ b/hyperdrive/packages/file-explorer/Cargo.lock @@ -0,0 +1,4517 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-json-rpc", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-transport", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.2", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.8.5", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.100", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.100", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "auditable-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5" +dependencies = [ + "semver 1.0.26", + "serde", + "serde_json", + "topological-sort", +] + +[[package]] +name = "auto_impl" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.4", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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 = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "caller-utils" +version = "0.1.0" +dependencies = [ + "anyhow", + "futures", + "futures-util", + "hyperware_app_common", + "once_cell", + "process_macros", + "serde", + "serde_json", + "uuid", + "wit-bindgen 0.41.0", +] + +[[package]] +name = "cc" +version = "1.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "color-eyre" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "const-hex" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[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 = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "unicode-xid", +] + +[[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", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "explorer" +version = "0.1.0" +dependencies = [ + "anyhow", + "caller-utils", + "hyperprocess_macro", + "hyperware_app_common", + "md5", + "process_macros", + "serde", + "serde_json", + "serde_urlencoded", + "tracing", + "wit-bindgen 0.42.1", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "hyperprocess_macro" +version = "0.1.0" +source = "git+https://github.com/hyperware-ai/hyperprocess-macro?rev=9836e2a#9836e2abe1da7bd2ccfef837244810438af26a07" +dependencies = [ + "anyhow", + "futures-util", + "hyperware_app_common", + "hyperware_process_lib", + "once_cell", + "paste", + "proc-macro2", + "process_macros", + "quote", + "rmp-serde", + "serde", + "serde_derive", + "serde_json", + "syn 2.0.100", + "uuid", + "wit-bindgen 0.36.0", +] + +[[package]] +name = "hyperware_app_common" +version = "0.1.0" +source = "git+https://github.com/hyperware-ai/hyperprocess-macro?rev=9836e2a#9836e2abe1da7bd2ccfef837244810438af26a07" +dependencies = [ + "anyhow", + "futures-util", + "hyperware_process_lib", + "once_cell", + "paste", + "process_macros", + "rmp-serde", + "serde", + "serde_derive", + "serde_json", + "thiserror 2.0.12", + "uuid", + "wit-bindgen 0.36.0", +] + +[[package]] +name = "hyperware_process_lib" +version = "2.0.1" +source = "git+https://github.com/hyperware-ai/process_lib?rev=cfd6843#cfd6843139bc40ffeefb1304372878c07d3132b7" +dependencies = [ + "alloy", + "alloy-primitives", + "alloy-sol-macro", + "alloy-sol-types", + "anyhow", + "base64", + "bincode", + "color-eyre", + "http", + "mime_guess", + "rand 0.8.5", + "regex", + "rmp-serde", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", + "tracing-error", + "tracing-subscriber", + "url", + "wit-bindgen 0.42.1", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.24", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn 2.0.100", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "process_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecfcd7b51a1b9249fb47359a9f8d57a9e9dbc71857c5cfd08f98764f7106a3d" +dependencies = [ + "quote", + "syn 2.0.100", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.24", +] + +[[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 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[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.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "ruint" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.0", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spdx" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58b69356da67e2fc1f542c71ea7e654a361a79c938e4424392ecf4fa065d2193" +dependencies = [ + "smallvec", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.100", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[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.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "topological-sort" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt 0.39.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1" +dependencies = [ + "leb128", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasm-encoder" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" +dependencies = [ + "leb128fmt", + "wasmparser 0.227.1", +] + +[[package]] +name = "wasm-encoder" +version = "0.230.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660" +dependencies = [ + "leb128fmt", + "wasmparser 0.230.0", +] + +[[package]] +name = "wasm-metadata" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.220.1", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasm-metadata" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" +dependencies = [ + "anyhow", + "auditable-serde", + "flate2", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "url", + "wasm-encoder 0.227.1", + "wasmparser 0.227.1", +] + +[[package]] +name = "wasm-metadata" +version = "0.230.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder 0.230.0", + "wasmparser 0.230.0", +] + +[[package]] +name = "wasmparser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25" +dependencies = [ + "ahash", + "bitflags", + "hashbrown 0.14.5", + "indexmap", + "semver 1.0.26", +] + +[[package]] +name = "wasmparser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" +dependencies = [ + "bitflags", + "hashbrown 0.15.2", + "indexmap", + "semver 1.0.26", +] + +[[package]] +name = "wasmparser" +version = "0.230.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed" +dependencies = [ + "bitflags", + "hashbrown 0.15.2", + "indexmap", + "semver 1.0.26", +] + +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3" +dependencies = [ + "wit-bindgen-rt 0.36.0", + "wit-bindgen-rust-macro 0.36.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" +dependencies = [ + "wit-bindgen-rt 0.41.0", + "wit-bindgen-rust-macro 0.41.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8" +dependencies = [ + "wit-bindgen-rt 0.42.1", + "wit-bindgen-rust-macro 0.42.1", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.227.1", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.230.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" +dependencies = [ + "bitflags", + "futures", + "once_cell", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a" +dependencies = [ + "bitflags", + "futures", + "once_cell", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.100", + "wasm-metadata 0.220.1", + "wit-bindgen-core 0.36.0", + "wit-component 0.220.1", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.100", + "wasm-metadata 0.227.1", + "wit-bindgen-core 0.41.0", + "wit-component 0.227.1", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.100", + "wasm-metadata 0.230.0", + "wit-bindgen-core 0.42.1", + "wit-component 0.230.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.100", + "wit-bindgen-core 0.36.0", + "wit-bindgen-rust 0.36.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.100", + "wit-bindgen-core 0.41.0", + "wit-bindgen-rust 0.41.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.100", + "wit-bindgen-core 0.42.1", + "wit-bindgen-rust 0.42.1", +] + +[[package]] +name = "wit-component" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.220.1", + "wasm-metadata 0.220.1", + "wasmparser 0.220.1", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-component" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.227.1", + "wasm-metadata 0.227.1", + "wasmparser 0.227.1", + "wit-parser 0.227.1", +] + +[[package]] +name = "wit-component" +version = "0.230.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.230.0", + "wasm-metadata 0.230.0", + "wasmparser 0.230.0", + "wit-parser 0.230.0", +] + +[[package]] +name = "wit-parser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.26", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.220.1", +] + +[[package]] +name = "wit-parser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.26", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.227.1", +] + +[[package]] +name = "wit-parser" +version = "0.230.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.26", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.230.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.100", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] diff --git a/hyperdrive/packages/file-explorer/Cargo.toml b/hyperdrive/packages/file-explorer/Cargo.toml new file mode 100644 index 000000000..299a6ba1d --- /dev/null +++ b/hyperdrive/packages/file-explorer/Cargo.toml @@ -0,0 +1,10 @@ +[profile.release] +lto = true +opt-level = "s" +panic = "abort" + +[workspace] +members = [ + "explorer", +] +resolver = "2" diff --git a/hyperdrive/packages/file-explorer/explorer/Cargo.toml b/hyperdrive/packages/file-explorer/explorer/Cargo.toml new file mode 100644 index 000000000..3b36f1446 --- /dev/null +++ b/hyperdrive/packages/file-explorer/explorer/Cargo.toml @@ -0,0 +1,33 @@ +[dependencies] +anyhow = "1.0" +md5 = "0.7" +process_macros = "0.1" +serde_json = "1.0" +serde_urlencoded = "0.7" +tracing = "0.1.37" +wit-bindgen = "0.42.1" + +[dependencies.hyperprocess_macro] +git = "https://github.com/hyperware-ai/hyperprocess-macro" +rev = "9836e2a" + +[dependencies.hyperware_app_common] +git = "https://github.com/hyperware-ai/hyperprocess-macro" +rev = "9836e2a" + +[dependencies.serde] +features = ["derive"] +version = "1.0" + +[lib] +crate-type = ["cdylib"] +name = "explorer" +path = "src/lib.rs" + +[package] +edition = "2021" +name = "explorer" +version = "0.1.0" + +[package.metadata.component] +package = "hyperware:process" diff --git a/hyperdrive/packages/file-explorer/explorer/src/icon b/hyperdrive/packages/file-explorer/explorer/src/icon new file mode 100644 index 000000000..d0d597fdf --- /dev/null +++ b/hyperdrive/packages/file-explorer/explorer/src/icon @@ -0,0 +1 @@ +data:image/png;base64,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 \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/explorer/src/lib.rs b/hyperdrive/packages/file-explorer/explorer/src/lib.rs new file mode 100644 index 000000000..db07d1061 --- /dev/null +++ b/hyperdrive/packages/file-explorer/explorer/src/lib.rs @@ -0,0 +1,498 @@ +use hyperprocess_macro::hyperprocess; +use hyperware_app_common::hyperware_process_lib::logging::{ + debug, error, info, init_logging, Level, +}; +use hyperware_app_common::hyperware_process_lib::our; +use hyperware_app_common::hyperware_process_lib::vfs::{ + self, create_drive, vfs_request, FileType, VfsAction, VfsResponse, +}; +use hyperware_app_common::{send, SaveOptions}; +use std::collections::HashMap; + +const ICON: &str = include_str!("./icon"); +const PROCESS_ID_LINK: &str = "explorer:file-explorer:sys"; + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FileInfo { + pub name: String, + pub path: String, + pub size: u64, + pub created: u64, + pub modified: u64, + pub is_directory: bool, + pub permissions: String, +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum AuthScheme { + Public, + Private, +} + +#[derive(Default, Debug, serde::Serialize, serde::Deserialize)] +struct FileExplorerState { + // HashMap to track shared files and their auth schemes + shared_files: HashMap, + // Current working directory for the user + cwd: String, +} + +#[hyperprocess( + name = "file-explorer", + ui = Some(HttpBindingConfig::default().secure_subdomain(true)), + endpoints = vec![ + Binding::Http { + path: "/api", + config: HttpBindingConfig::default().secure_subdomain(true), + }, + Binding::Ws { + path: "/ws", + config: WsBindingConfig::default().secure_subdomain(true), + }, + Binding::Http { + path: "/shared/*", + config: HttpBindingConfig::default().authenticated(false), + } + ], + save_config = SaveOptions::Never, + wit_world = "file-explorer-sys-v0", +)] +impl FileExplorerState { + #[init] + async fn init(&mut self) { + init_logging(Level::DEBUG, Level::INFO, None, None, None).unwrap(); + + // Create home drive for the user + let package_id = our().package_id(); + match create_drive(package_id.clone(), "home", Some(5)) { + Ok(home_path) => { + info!("Created home drive at: {}", home_path); + self.cwd = home_path; + } + Err(e) => { + error!( + "Failed to create home drive: {:?}. Using root as default.", + e + ); + self.cwd = "/".to_string(); + } + } + + hyperware_process_lib::homepage::add_to_homepage( + "File Explorer", + Some(ICON), + Some(""), + None, + ); + } + + #[http] + async fn list_directory(&mut self, path: String) -> Result, String> { + info!("list_directory called with path: {}", path); + + // For root path, read from VFS root to get all drives + let vfs_path = if path == "/" || path.is_empty() { + "/".to_string() + } else { + path.clone() + }; + + // Just list the current directory - no recursion + list_directory_contents(&vfs_path).await + } + + #[http] + async fn create_file(&mut self, path: String, content: Vec) -> Result { + info!("create_file called with path: {}", path); + + let vfs_path = path.clone(); + debug!("VFS path: {}", vfs_path); + + // Create file and write content + let file = vfs::create_file(&vfs_path, Some(5)) + .map_err(|e| format!("Failed to create file: {}", e))?; + + file.write(&content) + .map_err(|e| format!("Failed to write file: {}", e))?; + + // Get metadata for response + let meta = file + .metadata() + .map_err(|e| format!("Failed to get metadata: {}", e))?; + + Ok(FileInfo { + name: path.split('/').last().unwrap_or("").to_string(), + path, + size: meta.len, + created: 0, + modified: 0, + is_directory: false, + permissions: "rw".to_string(), + }) + } + + #[http] + async fn read_file(&mut self, path: String) -> Result, String> { + info!("read_file called with path: {}", path); + + let vfs_path = path.clone(); + + let file = vfs::open_file(&vfs_path, false, Some(5)) + .map_err(|e| format!("Failed to open file: {}", e))?; + + file.read() + .map_err(|e| format!("Failed to read file: {}", e)) + } + + #[http] + async fn update_file(&mut self, path: String, content: Vec) -> Result { + info!("update_file called with path: {}", path); + + let vfs_path = path.clone(); + + let file = vfs::open_file(&vfs_path, false, Some(5)) + .map_err(|e| format!("Failed to open file: {}", e))?; + + file.write(&content) + .map_err(|e| format!("Failed to write file: {}", e))?; + + let meta = file + .metadata() + .map_err(|e| format!("Failed to get metadata: {}", e))?; + + Ok(FileInfo { + name: path.split('/').last().unwrap_or("").to_string(), + path, + size: meta.len, + created: 0, + modified: 0, + is_directory: false, + permissions: "rw".to_string(), + }) + } + + #[http] + async fn delete_file(&mut self, path: String) -> Result { + info!("delete_file called with path: {}", path); + + let vfs_path = path.clone(); + + vfs::remove_file(&vfs_path, Some(5)) + .map_err(|e| format!("Failed to delete file: {}", e))?; + + Ok(true) + } + + #[http] + async fn create_directory(&mut self, path: String) -> Result { + info!("create_directory called with path: {}", path); + + let vfs_path = path.clone(); + + let _dir = vfs::open_dir(&vfs_path, true, Some(5)) + .map_err(|e| format!("Failed to create directory: {}", e))?; + + Ok(FileInfo { + name: path.split('/').last().unwrap_or("").to_string(), + path, + size: 0, + created: 0, + modified: 0, + is_directory: true, + permissions: "rw".to_string(), + }) + } + + #[http] + async fn delete_directory(&mut self, path: String) -> Result { + info!("delete_directory called with path: {}", path); + + let vfs_path = path.clone(); + let timeout = 5; + + // Create a VFS request with RemoveDirAll action to handle non-empty directories + let request = vfs_request(&vfs_path, VfsAction::RemoveDirAll).expects_response(timeout); + + // Send the request and await response + let response: Result = send(request).await; + + match response { + Ok(VfsResponse::Ok) => Ok(true), + Ok(VfsResponse::Err(e)) => Err(format!("Failed to delete directory: {:?}", e)), + Ok(_) => Err("Unexpected response from VFS".to_string()), + Err(e) => Err(format!("Failed to send VFS request: {}", e)), + } + } + + #[http] + async fn upload_file( + &mut self, + path: String, + filename: String, + content: Vec, + ) -> Result { + let full_path = format!("{}/{}", path, filename); + self.create_file(full_path, content).await + } + + #[http] + async fn share_file(&mut self, path: String, auth: AuthScheme) -> Result { + // Generate share ID from path hash + let share_id = format!("{:x}", md5::compute(&path)); + + // Add to shared_files HashMap + self.shared_files.insert(path.clone(), auth); + + // Return share link with full path + Ok(format!("/{PROCESS_ID_LINK}/shared/{share_id}")) + } + + #[http] + async fn unshare_file(&mut self, path: String) -> Result { + Ok(self.shared_files.remove(&path).is_some()) + } + + #[http] + async fn get_share_link(&mut self, path: String) -> Result, String> { + // Check if file is shared + if self.shared_files.contains_key(&path) { + let share_id = format!("{:x}", md5::compute(&path)); + Ok(Some(format!("/{PROCESS_ID_LINK}/shared/{share_id}"))) + } else { + Ok(None) + } + } + + #[http] + async fn serve_shared_file(&mut self) -> Result, String> { + // Use get_path() to handle routing + let request_path = hyperware_app_common::get_path(); + + // Extract the file path from the request + if let Some(request_path_str) = request_path { + if let Some(share_id) = request_path_str.strip_prefix("/shared/") { + // Find the original path from share_id + for (path, auth_scheme) in &self.shared_files { + if format!("{:x}", md5::compute(path)) == share_id { + match auth_scheme { + AuthScheme::Public => { + // Extract filename from path + let filename = path.split('/').last().unwrap_or("download"); + + // Set Content-Disposition header to preserve original filename + hyperware_app_common::add_response_header( + "Content-Disposition".to_string(), + format!("attachment; filename=\"{}\"", filename), + ); + + // Set appropriate Content-Type based on file extension + let content_type = match filename.split('.').last() { + Some("txt") => "text/plain", + Some("html") | Some("htm") => "text/html", + Some("css") => "text/css", + Some("js") => "application/javascript", + Some("json") => "application/json", + Some("png") => "image/png", + Some("jpg") | Some("jpeg") => "image/jpeg", + Some("gif") => "image/gif", + Some("pdf") => "application/pdf", + Some("zip") => "application/zip", + _ => "application/octet-stream", + }; + hyperware_app_common::add_response_header( + "Content-Type".to_string(), + content_type.to_string(), + ); + + // Read and return file content + return self.read_file(path.clone()).await; + } + AuthScheme::Private => { + return Err("Access denied: Private file".to_string()); + } + } + } + } + Err("File not found or not shared".to_string()) + } else { + Err("Invalid shared file path".to_string()) + } + } else { + Err("No request path provided".to_string()) + } + } + + #[http] + async fn get_current_directory(&mut self) -> Result { + info!("get_current_directory called, returning: {}", self.cwd); + Ok(self.cwd.clone()) + } + + #[http] + async fn set_current_directory(&mut self, path: String) -> Result { + self.cwd = path.clone(); + Ok(path) + } + + #[http] + async fn move_file(&mut self, source: String, destination: String) -> Result { + // Read file content + let content = self.read_file(source.clone()).await?; + + // Create file at destination + let file_info = self.create_file(destination, content).await?; + + // Delete source file + self.delete_file(source).await?; + + Ok(file_info) + } + + #[http] + async fn copy_file(&mut self, source: String, destination: String) -> Result { + // Read file content + let content = self.read_file(source).await?; + + // Create file at destination + self.create_file(destination, content).await + } +} + +// Helper function to list directory contents with 2 levels of depth +async fn list_directory_contents(path: &str) -> Result, String> { + debug!("list_directory_contents: path='{}'", path); + + // Open directory + let dir = vfs::Directory { + path: path.to_string(), + timeout: 5, + }; + + // Read directory entries + let entries = dir + .read() + .map_err(|e| format!("Failed to read directory '{}': {}", path, e))?; + + debug!("VFS returned {} entries for path '{}'", entries.len(), path); + + let mut all_files = Vec::new(); + + // Convert to FileInfo - Level 1 + for (i, entry) in entries.iter().enumerate() { + debug!( + "Entry[{}]: path='{}', file_type={:?}", + i, entry.path, entry.file_type + ); + + // VFS already provides absolute paths in entry.path + let full_path = entry.path.clone(); + + // Extract filename from the path + let filename = entry.path.split('/').last().unwrap_or("").to_string(); + + debug!( + "Constructed: filename='{}', full_path='{}'", + filename, full_path + ); + + if entry.file_type == FileType::Directory { + // Get directory size + let sub_dir = vfs::Directory { + path: full_path.clone(), + timeout: 5, + }; + + let dir_size = match sub_dir.read() { + Ok(contents) => { + let count = contents.len() as u64; + debug!("Directory '{}' has {} items", full_path, count); + count + } + Err(e) => { + error!("Failed to read subdirectory '{}': {}", full_path, e); + 0 + } + }; + + let file_info = FileInfo { + name: filename, + path: full_path.clone(), + size: dir_size, + created: 0, + modified: 0, + is_directory: true, + permissions: "rw".to_string(), + }; + + all_files.push(file_info); + + // Load one level deep into directories + let sub_dir2 = vfs::Directory { + path: full_path.clone(), + timeout: 5, + }; + + if let Ok(sub_entries) = sub_dir2.read() { + debug!( + "Loading {} sub-entries from '{}'", + sub_entries.len(), + full_path + ); + + for sub_entry in sub_entries { + // VFS already provides absolute paths in sub_entry.path + let sub_full_path = sub_entry.path.clone(); + let sub_filename = sub_entry.path.split('/').last().unwrap_or("").to_string(); + + debug!( + "Sub-entry: path='{}', filename='{}', file_type={:?}", + sub_full_path, sub_filename, sub_entry.file_type + ); + + if sub_entry.file_type == FileType::Directory { + all_files.push(FileInfo { + name: sub_filename, + path: sub_full_path, + size: 0, // Don't load deeper + created: 0, + modified: 0, + is_directory: true, + permissions: "rw".to_string(), + }); + } else { + // For files, try to get metadata + if let Ok(meta) = vfs::metadata(&sub_full_path, Some(5)) { + all_files.push(FileInfo { + name: sub_filename, + path: sub_full_path, + size: meta.len, + created: 0, + modified: 0, + is_directory: false, + permissions: "rw".to_string(), + }); + } + } + } + } + } else { + // For files, get metadata + let meta = vfs::metadata(&full_path, Some(5)) + .map_err(|e| format!("Failed to get metadata for '{}': {}", entry.path, e))?; + + all_files.push(FileInfo { + name: filename, + path: full_path, + size: meta.len, + created: 0, + modified: 0, + is_directory: false, + permissions: "rw".to_string(), + }); + } + } + + debug!("Returning {} files total", all_files.len()); + Ok(all_files) +} diff --git a/hyperdrive/packages/file-explorer/metadata.json b/hyperdrive/packages/file-explorer/metadata.json new file mode 100644 index 000000000..df958b85d --- /dev/null +++ b/hyperdrive/packages/file-explorer/metadata.json @@ -0,0 +1,18 @@ +{ + "name": "file-explorer", + "description": "File Explorer & Sharing", + "image": "https://raw.githubusercontent.com/hyperware-ai/hyperdrive/refs/heads/main/ui/public/assets/file-explorer-256.png", + "properties": { + "package_name": "file-explorer", + "current_version": "0.1.0", + "publisher": "sys", + "mirrors": [], + "code_hashes": { + "0.1.0": "" + }, + "wit_version": 1, + "dependencies": [] + }, + "external_url": "https://hyperware.ai", + "animation_url": "" +} diff --git a/hyperdrive/packages/file-explorer/pkg/manifest.json b/hyperdrive/packages/file-explorer/pkg/manifest.json new file mode 100644 index 000000000..4eb54b2aa --- /dev/null +++ b/hyperdrive/packages/file-explorer/pkg/manifest.json @@ -0,0 +1,25 @@ +[ + { + "process_name": "explorer", + "process_wasm_path": "/explorer.wasm", + "on_exit": "Restart", + "request_networking": false, + "request_capabilities": [ + "homepage:homepage:sys", + "http-server:distro:sys", + "vfs:distro:sys", + { + "process": "vfs:distro:sys", + "params": { + "root": true + } + } + ], + "grant_capabilities": [ + "homepage:homepage:sys", + "http-server:distro:sys", + "vfs:distro:sys" + ], + "public": false + } +] diff --git a/hyperdrive/packages/file-explorer/ui/.eslintrc.cjs b/hyperdrive/packages/file-explorer/ui/.eslintrc.cjs new file mode 100644 index 000000000..d6c953795 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/hyperdrive/packages/file-explorer/ui/.gitignore b/hyperdrive/packages/file-explorer/ui/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/hyperdrive/packages/file-explorer/ui/README.md b/hyperdrive/packages/file-explorer/ui/README.md new file mode 100644 index 000000000..b0e896f40 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/README.md @@ -0,0 +1,56 @@ +# Hyperware UI Template + +Based on the Vite React Typescript template. + +## Setup + +When using `kit new`, the `BASE_URL` on line 9 of `vite.config.ts` will be set automatically. +The `BASE_URL` will be the first process in `manifest.json`, the `package` from `metadata.json`, and `publisher` from `metadata.json`. +If you have multiple processes in `manifest.json`, make sure the first process will be the one serving the UI. + +## Development + +Run `npm i` and then `npm run dev` to start working on the UI. + +You may see an error: + +``` +[vite] Pre-transform error: Failed to load url /our.js (resolved id: /our.js). Does the file exist? +``` + +You can safely ignore this error. The file will be served by the node via the proxy. + +## public vs assets + +The `public/assets` folder contains files that are referenced in `index.html`, `src/assets` is for asset files that are only referenced in `src` code. + +## About Vite + React + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/hyperdrive/packages/file-explorer/ui/index.html b/hyperdrive/packages/file-explorer/ui/index.html new file mode 100644 index 000000000..6a4ab68e3 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + Simple Id + + +
+ + + diff --git a/hyperdrive/packages/file-explorer/ui/package-lock.json b/hyperdrive/packages/file-explorer/ui/package-lock.json new file mode 100644 index 000000000..4655f3eed --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/package-lock.json @@ -0,0 +1,3641 @@ +{ + "name": "ui-template", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ui-template", + "version": "0.0.0", + "dependencies": { + "@hyperware-ai/client-api": "^0.1.0", + "qrcode": "^1.5.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zustand": "^4.5.7" + }, + "devDependencies": { + "@types/node": "^20.10.4", + "@types/qrcode": "^1.5.5", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "http-proxy-middleware": "^2.0.6", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz", + "integrity": "sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.10.tgz", + "integrity": "sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz", + "integrity": "sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.10.tgz", + "integrity": "sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz", + "integrity": "sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz", + "integrity": "sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz", + "integrity": "sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz", + "integrity": "sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz", + "integrity": "sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz", + "integrity": "sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz", + "integrity": "sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz", + "integrity": "sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz", + "integrity": "sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz", + "integrity": "sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz", + "integrity": "sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz", + "integrity": "sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz", + "integrity": "sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz", + "integrity": "sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz", + "integrity": "sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz", + "integrity": "sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz", + "integrity": "sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz", + "integrity": "sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz", + "integrity": "sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@hyperware-ai/client-api": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@hyperware-ai/client-api/-/client-api-0.1.0.tgz", + "integrity": "sha512-qDj7xew+Z1qSQtiq8oc2ntZuiVdM1rtwIAQnyLxpL0j+f3cCfUnaDE6/604wJIrYmh8xjrtxUpWqu+ZmZoy6yg==", + "dependencies": { + "buffer": "^6.0.3", + "node-forge": "^1.3.1", + "typescript": "^4.9.5" + } + }, + "node_modules/@hyperware-ai/client-api/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "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/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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/@rollup/rollup-android-arm-eabi": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz", + "integrity": "sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz", + "integrity": "sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz", + "integrity": "sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz", + "integrity": "sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz", + "integrity": "sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz", + "integrity": "sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz", + "integrity": "sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz", + "integrity": "sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz", + "integrity": "sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz", + "integrity": "sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz", + "integrity": "sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz", + "integrity": "sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz", + "integrity": "sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "devOptional": true + }, + "node_modules/@types/qrcode": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.5.tgz", + "integrity": "sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/react": { + "version": "18.2.45", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", + "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.18", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", + "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "devOptional": true + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", + "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/type-utils": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", + "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", + "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz", + "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", + "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", + "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz", + "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", + "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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-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/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/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/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "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.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "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==", + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001571", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", + "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", + "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/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "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/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true + }, + "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/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" + }, + "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/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.616", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", + "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/esbuild": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.10.tgz", + "integrity": "sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.10", + "@esbuild/android-arm": "0.19.10", + "@esbuild/android-arm64": "0.19.10", + "@esbuild/android-x64": "0.19.10", + "@esbuild/darwin-arm64": "0.19.10", + "@esbuild/darwin-x64": "0.19.10", + "@esbuild/freebsd-arm64": "0.19.10", + "@esbuild/freebsd-x64": "0.19.10", + "@esbuild/linux-arm": "0.19.10", + "@esbuild/linux-arm64": "0.19.10", + "@esbuild/linux-ia32": "0.19.10", + "@esbuild/linux-loong64": "0.19.10", + "@esbuild/linux-mips64el": "0.19.10", + "@esbuild/linux-ppc64": "0.19.10", + "@esbuild/linux-riscv64": "0.19.10", + "@esbuild/linux-s390x": "0.19.10", + "@esbuild/linux-x64": "0.19.10", + "@esbuild/netbsd-x64": "0.19.10", + "@esbuild/openbsd-x64": "0.19.10", + "@esbuild/sunos-x64": "0.19.10", + "@esbuild/win32-arm64": "0.19.10", + "@esbuild/win32-ia32": "0.19.10", + "@esbuild/win32-x64": "0.19.10" + } + }, + "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-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", + "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.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/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": 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.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/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.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "dev": true + }, + "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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "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-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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "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/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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/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/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.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "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/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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-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/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "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/rollup": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.1.tgz", + "integrity": "sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.1", + "@rollup/rollup-android-arm64": "4.9.1", + "@rollup/rollup-darwin-arm64": "4.9.1", + "@rollup/rollup-darwin-x64": "4.9.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.1", + "@rollup/rollup-linux-arm64-gnu": "4.9.1", + "@rollup/rollup-linux-arm64-musl": "4.9.1", + "@rollup/rollup-linux-riscv64-gnu": "4.9.1", + "@rollup/rollup-linux-x64-gnu": "4.9.1", + "@rollup/rollup-linux-x64-musl": "4.9.1", + "@rollup/rollup-win32-arm64-msvc": "4.9.1", + "@rollup/rollup-win32-ia32-msvc": "4.9.1", + "@rollup/rollup-win32-x64-msvc": "4.9.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "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/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "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/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vite": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/hyperdrive/packages/file-explorer/ui/package.json b/hyperdrive/packages/file-explorer/ui/package.json new file mode 100644 index 000000000..0d0bda752 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/package.json @@ -0,0 +1,37 @@ +{ + "name": "ui-template", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port 3000", + "start": "vite --port 3000", + "build": "tsc && vite build", + "copy": "mkdir -p ../pkg/ui && rm -rf ../pkg/ui/* && cp -r dist/* ../pkg/ui/", + "build:copy": "npm run build && npm run copy", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@hyperware-ai/client-api": "^0.1.0", + "qrcode": "^1.5.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zustand": "^4.5.7" + }, + "devDependencies": { + "@types/node": "^20.10.4", + "@types/qrcode": "^1.5.5", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "http-proxy-middleware": "^2.0.6", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } +} diff --git a/hyperdrive/packages/file-explorer/ui/public/assets/file-explorer-256.png b/hyperdrive/packages/file-explorer/ui/public/assets/file-explorer-256.png new file mode 100644 index 000000000..9f96d719e Binary files /dev/null and b/hyperdrive/packages/file-explorer/ui/public/assets/file-explorer-256.png differ diff --git a/hyperdrive/packages/file-explorer/ui/src/App.css b/hyperdrive/packages/file-explorer/ui/src/App.css new file mode 100644 index 000000000..ea483108b --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/App.css @@ -0,0 +1,167 @@ +/* Root styles moved to index.css */ + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 1em; +} + +.read-the-docs { + color: #888; +} + +.message-list { + display: flex; + flex-direction: column; + margin-bottom: 0.5em; + text-align: left; +} + +.message-list li { + margin-bottom: 1em; + padding: 1em; + border-radius: 0.5em; + background-color: #f5f5f5; + border: 1px solid #e0e0e0; + overflow-wrap: break-word; + width: 90%; +} + +.signed-message { + display: flex; + flex-direction: column; + gap: 0.5em; +} + +.message-content { + display: flex; + flex-direction: column; + gap: 0.5em; +} + +.message-text { + font-weight: 500; +} + +.message-signature { + font-family: monospace; + font-size: 0.85em; + color: #666; + background-color: #efefef; + padding: 0.5em; + border-radius: 0.3em; + border: 1px solid #ddd; + overflow-x: auto; +} + +.verification { + display: flex; + align-items: center; + gap: 1em; + margin-top: 0.5em; +} + +.verify-button { + background-color: #4b9ad8; + border: none; + color: white; + padding: 0.5em 1em; + border-radius: 0.3em; + cursor: pointer; + font-size: 0.9em; +} + +.verify-button:hover { + background-color: #357abd; +} + +.verification-result { + font-size: 1.2em; + font-weight: bold; + padding: 0.2em 0.5em; + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.verification-result.verified { + color: white; + background-color: #4caf50; +} + +.verification-result.failed { + color: white; + background-color: #f44336; +} + +.node-not-connected { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: rgba(255, 255, 255, 0.9); + z-index: 1000; +} + +.input-row { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 100%; +} + +.input-row > button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding: 0.5em 1.2em; + background-color: #4b9ad8; + color: white; + font-weight: 600; +} + +.input-row > button:hover { + background-color: #357abd; +} + +.input-row > input { + border: 1px solid #ccc; + padding: 0.5em 0.8em; + font-size: 1em; + border-radius: 0.25em; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + width: 100%; +} diff --git a/hyperdrive/packages/file-explorer/ui/src/App.tsx b/hyperdrive/packages/file-explorer/ui/src/App.tsx new file mode 100644 index 000000000..773fe64cc --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/App.tsx @@ -0,0 +1,66 @@ +import { useState, useEffect } from "react"; +import HyperwareClientApi from "@hyperware-ai/client-api"; +import "./App.css"; +import FileExplorer from "./components/FileExplorer/FileExplorer"; +import { ThemeProvider } from "./contexts/ThemeContext"; + +const BASE_URL = import.meta.env.BASE_URL; +if (window.our) window.our.process = BASE_URL?.replace("/", ""); + +const PROXY_TARGET = `${(import.meta.env.VITE_NODE_URL || "http://localhost:8080")}${BASE_URL}`; + +const WEBSOCKET_URL = import.meta.env.DEV + ? `${PROXY_TARGET.replace('http', 'ws')}` + : undefined; + +function App() { + const [nodeConnected, setNodeConnected] = useState(true); + const [api, setApi] = useState(); + + useEffect(() => { + // Connect to the Hyperdrive via websocket + console.log('WEBSOCKET URL', WEBSOCKET_URL) + if (window.our?.node && window.our?.process) { + const api = new HyperwareClientApi({ + uri: WEBSOCKET_URL, + nodeId: window.our.node, + processId: window.our.process, + onOpen: (_event, _api) => { + console.log("Connected to Hyperware"); + }, + onMessage: (json, _api) => { + console.log('WEBSOCKET MESSAGE', json) + try { + const data = JSON.parse(json); + console.log("WebSocket received message", data); + } catch (error) { + console.error("Error parsing WebSocket message", error); + } + }, + }); + + setApi(api); + } else { + setNodeConnected(false); + } + }, []); + + return ( + +
+ {!nodeConnected && ( +
+

Node not connected

+

+ You need to start a node at {PROXY_TARGET} before you can use this UI + in development. +

+
+ )} + {nodeConnected && } +
+
+ ); +} + +export default App; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/assets/react.svg b/hyperdrive/packages/file-explorer/ui/src/assets/react.svg new file mode 100644 index 000000000..6c87de9bb --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/assets/vite.svg b/hyperdrive/packages/file-explorer/ui/src/assets/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/assets/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/ContextMenu/ContextMenu.css b/hyperdrive/packages/file-explorer/ui/src/components/ContextMenu/ContextMenu.css new file mode 100644 index 000000000..3840b1501 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/ContextMenu/ContextMenu.css @@ -0,0 +1,37 @@ +.context-menu { + position: fixed; + background-color: var(--bg-primary); + border: 1px solid var(--border-color); + border-radius: 4px; + box-shadow: 0 2px 8px var(--shadow-color); + padding: 4px 0; + min-width: 160px; + z-index: 1000; + /* Ensure context menu appears above iOS touch callouts */ + -webkit-touch-callout: none; + -webkit-user-select: none; + user-select: none; +} + +.context-menu button { + display: block; + width: 100%; + padding: 8px 16px; + border: none; + background: none; + text-align: left; + cursor: pointer; + font-size: 14px; + color: var(--text-primary); + transition: background-color 0.2s; +} + +.context-menu button:hover { + background-color: var(--bg-hover); +} + +.context-menu hr { + margin: 4px 0; + border: none; + border-top: 1px solid var(--border-color); +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/ContextMenu/ContextMenu.tsx b/hyperdrive/packages/file-explorer/ui/src/components/ContextMenu/ContextMenu.tsx new file mode 100644 index 000000000..f612b203f --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/ContextMenu/ContextMenu.tsx @@ -0,0 +1,130 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { FileInfo, unshareFile, deleteFile, deleteDirectory } from '../../lib/api'; +import useFileExplorerStore from '../../store/fileExplorer'; +import './ContextMenu.css'; + +interface ContextMenuProps { + position: { x: number; y: number }; + file: FileInfo; + onClose: () => void; + onShare: () => void; + onDelete: () => void; + openedByTouch?: boolean; +} + +const ContextMenu: React.FC = ({ position, file, onClose, onShare, onDelete, openedByTouch }) => { + const menuRef = useRef(null); + const { isFileShared, removeSharedLink } = useFileExplorerStore(); + const isShared = !file.isDirectory && isFileShared(file.path); + + // Track if a new touch has started after menu opened + const touchStartedRef = useRef(false); + + useEffect(() => { + // For touch-opened menus, delay adding the outside click handlers + // This prevents the menu from immediately closing on iOS + let timeoutId: number | undefined; + + const handleClickOutside = (e: MouseEvent) => { + if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + onClose(); + } + }; + + const handleTouchOutside = (e: TouchEvent) => { + // If the touch is inside the menu, don't close + if (menuRef.current && menuRef.current.contains(e.target as Node)) { + return; + } + + // For touch-opened menus, only close on deliberate outside tap + if (openedByTouch) { + // Check if this is a new touch interaction (not the same one that opened the menu) + const touch = e.touches[0]; + if (touch) { + // Store this touch interaction + touchStartedRef.current = true; + } + } else { + // For non-touch opened menus, close immediately + onClose(); + } + }; + + const handleTouchEndOutside = (e: TouchEvent) => { + // Only close if menu was opened by touch and user tapped outside + if (openedByTouch && touchStartedRef.current) { + if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + onClose(); + } + } + touchStartedRef.current = false; + }; + + if (openedByTouch) { + // Delay adding touch handlers for touch-opened menus + timeoutId = window.setTimeout(() => { + document.addEventListener('touchstart', handleTouchOutside, { passive: false }); + document.addEventListener('touchend', handleTouchEndOutside, { passive: false }); + }, 100); // Small delay to let the opening touch complete + } else { + // Add handlers immediately for mouse-opened menus + document.addEventListener('mousedown', handleClickOutside); + } + + return () => { + if (timeoutId) { + clearTimeout(timeoutId); + } + document.removeEventListener('mousedown', handleClickOutside); + document.removeEventListener('touchstart', handleTouchOutside); + document.removeEventListener('touchend', handleTouchEndOutside); + }; + }, [onClose, openedByTouch]); + + const handleUnshare = async () => { + try { + await unshareFile(file.path); + removeSharedLink(file.path); + onClose(); + } catch (err) { + console.error('Failed to unshare file:', err); + } + }; + + + return ( +
+ + + + {!file.isDirectory && ( + isShared ? ( + + ) : ( + + ) + )} +
+ +
+ ); +}; + +export default ContextMenu; diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Breadcrumb.css b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Breadcrumb.css new file mode 100644 index 000000000..283eb2fe3 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Breadcrumb.css @@ -0,0 +1,70 @@ +.breadcrumb-container { + position: relative; + background-color: var(--bg-secondary); + border-bottom: 1px solid var(--border-color); + flex-shrink: 0; +} + +.breadcrumb { + display: flex; + align-items: center; + padding: 8px 16px; + overflow-x: auto; + scroll-behavior: smooth; + -webkit-overflow-scrolling: touch; + scrollbar-width: thin; + scrollbar-color: var(--text-secondary) transparent; +} + +/* Custom scrollbar styling */ +.breadcrumb::-webkit-scrollbar { + height: 4px; +} + +.breadcrumb::-webkit-scrollbar-track { + background: transparent; +} + +.breadcrumb::-webkit-scrollbar-thumb { + background-color: var(--text-secondary); + border-radius: 2px; +} + +.breadcrumb-item { + padding: 4px 8px; + background: none; + border: none; + cursor: pointer; + color: var(--link-color); + font-size: 14px; + transition: color 0.2s; + white-space: nowrap; + flex-shrink: 0; +} + +.breadcrumb-item:hover { + text-decoration: underline; + color: var(--link-hover); +} + +.breadcrumb-separator { + margin: 0 4px; + color: var(--text-secondary); + flex-shrink: 0; +} + +/* Mobile adjustments */ +@media (max-width: 480px) { + .breadcrumb { + padding: 6px 12px; + } + + .breadcrumb-item { + font-size: 13px; + padding: 4px 6px; + } + + .breadcrumb-separator { + margin: 0 2px; + } +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Breadcrumb.tsx b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Breadcrumb.tsx new file mode 100644 index 000000000..6eea6d8e3 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Breadcrumb.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import './Breadcrumb.css'; + +interface BreadcrumbProps { + currentPath: string; + onNavigate: (path: string) => void; +} + +const Breadcrumb: React.FC = ({ currentPath, onNavigate }) => { + const pathParts = currentPath.split('/').filter(Boolean); + const scrollRef = React.useRef(null); + + // Scroll to the end when path changes + React.useEffect(() => { + if (scrollRef.current) { + scrollRef.current.scrollLeft = scrollRef.current.scrollWidth; + } + }, [currentPath]); + + return ( +
+
+ + + {pathParts.map((part, index) => { + const path = '/' + pathParts.slice(0, index + 1).join('/'); + return ( + + / + + + ); + })} +
+
+ ); +}; + +export default Breadcrumb; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileExplorer.css b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileExplorer.css new file mode 100644 index 000000000..a78bbcca0 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileExplorer.css @@ -0,0 +1,18 @@ +.file-explorer { + display: flex; + flex-direction: column; + height: 100%; + background-color: var(--bg-primary); + color: var(--text-primary); + overflow: hidden; +} + +.error-message { + background-color: var(--bg-secondary); + color: var(--error-color); + padding: 12px; + margin: 8px; + border-radius: 4px; + border: 1px solid var(--error-color); + opacity: 0.9; +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileExplorer.tsx b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileExplorer.tsx new file mode 100644 index 000000000..40d2d3fa8 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileExplorer.tsx @@ -0,0 +1,311 @@ +import React, { useEffect, useState } from 'react'; +import useFileExplorerStore from '../../store/fileExplorer'; +import { listDirectory, createDirectory, createFile, deleteFile, deleteDirectory, FileInfo, getCurrentDirectory } from '../../lib/api'; +import FileList from './FileList'; +import Breadcrumb from './Breadcrumb'; +import Toolbar from './Toolbar'; +import UploadZone from '../Upload/UploadZone'; +import './FileExplorer.css'; + +const FileExplorer: React.FC = () => { + const { + currentPath, + files, + selectedFiles, + loading, + error, + setCurrentPath, + setFiles, + setLoading, + setError, + clearSelection + } = useFileExplorerStore(); + + const [viewMode, setViewMode] = useState<'list' | 'grid'>('list'); + const [showNewMenu, setShowNewMenu] = useState(false); + const newMenuRef = React.useRef(null); + + // Close new menu when clicking outside + React.useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { + if (newMenuRef.current && !newMenuRef.current.contains(e.target as Node)) { + setShowNewMenu(false); + } + }; + + if (showNewMenu) { + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + } + }, [showNewMenu]); + + const loadDirectory = async (path: string) => { + try { + setLoading(true); + setError(null); + const fileList = await listDirectory(path); + + // Backend returns files for the requested directory with 2 levels of depth + // We need to include all files so the tree structure works, but we'll filter + // what's shown at the top level in FileList + const filteredFiles = fileList.filter(file => { + if (file.path === path) return false; // Exclude the directory itself + + // For the tree to work properly, we need to include all files + // The FileList component will handle showing only direct children at top level + return true; + }); + + setFiles(filteredFiles); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to load directory'); + } finally { + setLoading(false); + } + }; + + const loadSubdirectory = async (path: string): Promise => { + try { + const fileList = await listDirectory(path); + + // Filter out the directory itself and return only its contents + const filteredFiles = fileList.filter(file => { + if (file.path === path) return false; // Exclude the directory itself + return true; + }); + + return filteredFiles; + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to load subdirectory'); + return []; + } + }; + + // Initialize with home directory on first load + useEffect(() => { + const initializeDirectory = async () => { + try { + const cwd = await getCurrentDirectory(); + setCurrentPath(cwd); + } catch (err) { + // If getting cwd fails, fall back to root + console.error('Failed to get current directory:', err); + setCurrentPath('/'); + } + }; + + initializeDirectory(); + }, []); + + // Load directory whenever path changes + useEffect(() => { + if (currentPath) { + loadDirectory(currentPath); + } + }, [currentPath]); + + const handleNavigate = (path: string) => { + clearSelection(); + setCurrentPath(path); + }; + + const handleCreateFolder = async () => { + setShowNewMenu(false); + const folderName = prompt('Enter folder name:'); + if (!folderName) return; + + const newPath = currentPath === '/' + ? `/${folderName}` + : `${currentPath}/${folderName}`; + + try { + await createDirectory(newPath); + await loadDirectory(currentPath); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to create folder'); + } + }; + + const handleCreateFile = async () => { + setShowNewMenu(false); + const fileName = prompt('Enter file name:'); + if (!fileName) return; + + const newPath = currentPath === '/' + ? `/${fileName}` + : `${currentPath}/${fileName}`; + + try { + // Create an empty file + await createFile(newPath, []); + await loadDirectory(currentPath); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to create file'); + } + }; + + const handleDelete = async () => { + if (selectedFiles.length === 0) return; + + if (!confirm(`Delete ${selectedFiles.length} item(s)?`)) return; + + try { + for (const path of selectedFiles) { + const file = files.find(f => f.path === path); + if (file?.isDirectory) { + await deleteDirectory(path); + } else { + await deleteFile(path); + } + } + clearSelection(); + await loadDirectory(currentPath); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to delete items'); + } + }; + + const handleRefresh = () => { + loadDirectory(currentPath); + }; + + const handleNewMenu = () => { + setShowNewMenu(!showNewMenu); + }; + + const handleFileUpload = () => { + const fileInput = document.createElement('input'); + fileInput.type = 'file'; + fileInput.multiple = true; + + fileInput.onchange = async (e) => { + const target = e.target as HTMLInputElement; + const files = target.files; + if (!files || files.length === 0) return; + + // Trigger the upload process for each file + const event = new CustomEvent('upload-files', { + detail: { files: Array.from(files) } + }); + window.dispatchEvent(event); + }; + + fileInput.click(); + }; + + const handleFolderUpload = () => { + const fileInput = document.createElement('input'); + fileInput.type = 'file'; + fileInput.multiple = true; + // Enable folder selection + fileInput.webkitdirectory = true; + (fileInput as any).directory = true; + + fileInput.onchange = async (e) => { + const target = e.target as HTMLInputElement; + const files = target.files; + if (!files || files.length === 0) return; + + // Trigger the upload process for each file + const event = new CustomEvent('upload-files', { + detail: { files: Array.from(files) } + }); + window.dispatchEvent(event); + }; + + fileInput.click(); + }; + + return ( +
+ + + {showNewMenu && ( +
+ + +
+ )} + + + + {error && ( +
+ {error} +
+ )} + + loadDirectory(currentPath)} + > + loadDirectory(currentPath)} + /> + +
+ ); +}; + +export default FileExplorer; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileItem.css b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileItem.css new file mode 100644 index 000000000..9e13843a3 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileItem.css @@ -0,0 +1,115 @@ +.file-item { + display: flex; + align-items: center; + padding: 8px 12px; + cursor: pointer; + user-select: none; + border-radius: 4px; + transition: background-color 0.2s; + color: var(--text-primary); + position: relative; + /* Prevent iOS default touch behaviors */ + -webkit-touch-callout: none; + -webkit-tap-highlight-color: transparent; +} + +.file-item:hover { + background-color: var(--bg-hover); +} + +.file-item.selected { + background-color: var(--bg-selected); +} + +.file-item-list { + gap: 16px; +} + +.file-item-grid { + flex-direction: column; + text-align: left; + padding: 16px 8px; + align-items: flex-start; +} + +.file-icon { + font-size: 20px; + margin-right: 8px; + display: inline-flex; + align-items: center; +} + +.file-item-grid .file-icon { + font-size: 48px; + margin-bottom: 8px; + margin-right: 0; +} + +.file-icon.clickable-folder { + cursor: pointer; + transition: transform 0.2s; +} + +.file-icon.clickable-folder:hover { + transform: scale(1.1); +} + +.file-name { + flex: 1 1 auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; + min-width: 0; /* Allow flex item to shrink below content size */ + margin-right: 16px; +} + +.file-size, +.file-modified { + color: var(--text-secondary); + font-size: 14px; + flex: 0 0 auto; + text-align: right; +} + +.file-size { + min-width: 80px; + margin-right: 16px; +} + +.file-modified { + min-width: 100px; +} + +/* On small screens, hide other columns to prioritize file name */ +@media (max-width: 768px) { + .file-modified { + display: none; + } +} + +@media (max-width: 480px) { + .file-size { + display: none; + } + + .file-name { + margin-right: 8px; + } +} + +.file-children { + /* Nested files container */ +} + +.shared-indicator { + font-size: 16px; + margin-left: 8px; + opacity: 0.7; + transition: opacity 0.2s; + cursor: help; +} + +.file-item:hover .shared-indicator { + opacity: 1; +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileItem.tsx b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileItem.tsx new file mode 100644 index 000000000..f63901535 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileItem.tsx @@ -0,0 +1,311 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { FileInfo, deleteFile, deleteDirectory } from '../../lib/api'; +import useFileExplorerStore from '../../store/fileExplorer'; +import ContextMenu from '../ContextMenu/ContextMenu'; +import ShareDialog from '../ShareDialog/ShareDialog'; +import './FileItem.css'; + +interface FileItemProps { + file: FileInfo & { children?: FileInfo[] }; + viewMode: 'list' | 'grid'; + onNavigate: (path: string) => void; + depth?: number; + onLoadSubdirectory?: (path: string) => Promise; + onDelete?: () => void; +} + +const FileItem: React.FC = ({ file, viewMode, onNavigate, depth = 0, onLoadSubdirectory, onDelete }) => { + const { selectedFiles, toggleFileSelection, isFileShared } = useFileExplorerStore(); + const [contextMenuOpen, setContextMenuOpen] = useState(false); + const [contextMenuPosition, setContextMenuPosition] = useState({ x: 0, y: 0 }); + const [shareDialogOpen, setShareDialogOpen] = useState(false); + const [menuOpenedByTouch, setMenuOpenedByTouch] = useState(false); + + const isSelected = selectedFiles.includes(file.path); + const isShared = !file.isDirectory && isFileShared(file.path); + + const [isExpanded, setIsExpanded] = useState(false); + const [childrenLoaded, setChildrenLoaded] = useState(false); + const [loadedChildren, setLoadedChildren] = useState<(FileInfo & { children?: FileInfo[] })[]>([]); + + // Touch handling for iOS long-press + const touchTimerRef = useRef(null); + const touchStartPos = useRef<{ x: number; y: number } | null>(null); + const longPressTriggered = useRef(false); + + const handleClick = (e: React.MouseEvent) => { + if (e.ctrlKey || e.metaKey) { + toggleFileSelection(file.path); + } else if (file.isDirectory) { + // Single click navigates into directories + onNavigate(file.path); + } + // Remove file selection on single click - no action for files + }; + + const buildTreeFromFlatList = (flatList: FileInfo[], parentPath: string): (FileInfo & { children?: FileInfo[] })[] => { + const fileMap = new Map(); + const topLevelFiles: (FileInfo & { children?: FileInfo[] })[] = []; + + // First pass: create map of all files + flatList.forEach(file => { + fileMap.set(file.path, { ...file, children: [] }); + }); + + // Second pass: build parent-child relationships + flatList.forEach(file => { + const fileWithChildren = fileMap.get(file.path)!; + const fileParentPath = file.path.substring(0, file.path.lastIndexOf('/')); + + if (fileMap.has(fileParentPath)) { + // This file has a parent in our list + const parent = fileMap.get(fileParentPath)!; + if (!parent.children) parent.children = []; + parent.children.push(fileWithChildren); + } else if (fileParentPath === parentPath) { + // This is a direct child of the parent directory + topLevelFiles.push(fileWithChildren); + } + }); + + // Sort files: directories first, then by name + const sortFiles = (files: (FileInfo & { children?: FileInfo[] })[]) => { + return [...files].sort((a, b) => { + if (a.isDirectory && !b.isDirectory) return -1; + if (!a.isDirectory && b.isDirectory) return 1; + return a.name.localeCompare(b.name); + }); + }; + + // Recursively sort all children + const sortRecursive = (files: (FileInfo & { children?: FileInfo[] })[]) => { + const sorted = sortFiles(files); + sorted.forEach(file => { + if (file.children && file.children.length > 0) { + file.children = sortRecursive(file.children); + } + }); + return sorted; + }; + + return sortRecursive(topLevelFiles); + }; + + const handleExpandToggle = async (e: React.MouseEvent) => { + e.stopPropagation(); + + // If expanding and we haven't loaded children yet, load them + if (!isExpanded && file.isDirectory && !childrenLoaded && onLoadSubdirectory) { + const flatChildren = await onLoadSubdirectory(file.path); + const treeChildren = buildTreeFromFlatList(flatChildren, file.path); + setLoadedChildren(treeChildren); + setChildrenLoaded(true); + } + + setIsExpanded(!isExpanded); + }; + + const handleContextMenu = (e: React.MouseEvent) => { + e.preventDefault(); + setContextMenuPosition({ x: e.clientX, y: e.clientY }); + setMenuOpenedByTouch(false); + setContextMenuOpen(true); + }; + + // Touch event handlers for iOS compatibility + const handleTouchStart = (e: React.TouchEvent) => { + const touch = e.touches[0]; + touchStartPos.current = { x: touch.clientX, y: touch.clientY }; + longPressTriggered.current = false; + + // Start long press timer (500ms) + touchTimerRef.current = window.setTimeout(() => { + if (touchStartPos.current) { + longPressTriggered.current = true; + // Trigger context menu + setContextMenuPosition({ x: touchStartPos.current.x, y: touchStartPos.current.y }); + setMenuOpenedByTouch(true); + setContextMenuOpen(true); + // Prevent default touch behavior + e.preventDefault(); + } + }, 500); + }; + + const handleTouchMove = (e: React.TouchEvent) => { + // If the touch moves more than 10px, cancel the long press + if (touchStartPos.current && touchTimerRef.current) { + const touch = e.touches[0]; + const deltaX = Math.abs(touch.clientX - touchStartPos.current.x); + const deltaY = Math.abs(touch.clientY - touchStartPos.current.y); + + if (deltaX > 10 || deltaY > 10) { + if (touchTimerRef.current) { + clearTimeout(touchTimerRef.current); + touchTimerRef.current = null; + } + } + } + }; + + const handleTouchEnd = (e: React.TouchEvent) => { + // Clear the timer + if (touchTimerRef.current) { + clearTimeout(touchTimerRef.current); + touchTimerRef.current = null; + } + + // If long press was triggered, prevent default click behavior + if (longPressTriggered.current) { + e.preventDefault(); + e.stopPropagation(); // Stop propagation to prevent menu from closing + longPressTriggered.current = false; + } else if (!e.defaultPrevented) { + // Normal tap - handle as click + if (file.isDirectory) { + onNavigate(file.path); + } + } + + touchStartPos.current = null; + }; + + // Clean up timer on unmount + useEffect(() => { + return () => { + if (touchTimerRef.current) { + clearTimeout(touchTimerRef.current); + } + }; + }, []); + + const handleDelete = async () => { + if (!confirm(`Delete ${file.name}?`)) return; + + try { + if (file.isDirectory) { + await deleteDirectory(file.path); + } else { + await deleteFile(file.path); + } + // Call the parent's onDelete callback to refresh the list + if (onDelete) { + onDelete(); + } + } catch (err) { + console.error('Failed to delete:', err); + alert(`Failed to delete ${file.name}: ${err instanceof Error ? err.message : 'Unknown error'}`); + } + }; + + const getFileIcon = () => { + if (file.isDirectory) { + return isExpanded ? '📂' : '📁'; + } + const ext = file.name.split('.').pop()?.toLowerCase(); + switch (ext) { + case 'txt': return '📄'; + case 'pdf': return '📕'; + case 'jpg': + case 'jpeg': + case 'png': + case 'gif': return '🖼️'; + case 'mp3': + case 'wav': return '🎵'; + case 'mp4': + case 'avi': return '🎬'; + case 'zip': + case 'rar': return '📦'; + default: return '📄'; + } + }; + + const formatFileSize = (bytes: number) => { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + }; + + // Determine which children to use - loaded children take precedence + const childrenToRender = childrenLoaded ? loadedChildren : (file.children || []); + const hasChildren = file.isDirectory && (childrenToRender.length > 0 || !childrenLoaded); + + return ( + <> +
+ + {getFileIcon()} + + {file.name} + {isShared && ( + + 🔗 + + )} + {viewMode === 'list' && ( + <> + + {file.isDirectory ? `${file.size} items` : formatFileSize(file.size)} + + + {file.modified ? new Date(file.modified * 1000).toLocaleDateString() : '-'} + + + )} +
+ + {/* Render children when expanded */} + {isExpanded && viewMode === 'list' && childrenToRender.length > 0 && ( +
+ {childrenToRender.map((child) => ( + + ))} +
+ )} + + {contextMenuOpen && ( + setContextMenuOpen(false)} + onShare={() => { + setShareDialogOpen(true); + setContextMenuOpen(false); + }} + onDelete={handleDelete} + openedByTouch={menuOpenedByTouch} + /> + )} + + {shareDialogOpen && ( + setShareDialogOpen(false)} + /> + )} + + ); +}; + +export default FileItem; diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileList.css b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileList.css new file mode 100644 index 000000000..b544f1389 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileList.css @@ -0,0 +1,30 @@ +.file-list { + flex: 1; + overflow-y: auto; + overflow-x: hidden; + padding: 16px; + background-color: var(--bg-primary); + min-height: 0; /* Important for flex children with overflow */ +} + +.file-list-loading, +.file-list-empty { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + color: var(--text-secondary); + font-size: 16px; +} + +.file-list-list { + display: flex; + flex-direction: column; + gap: 2px; +} + +.file-list-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); + gap: 16px; +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileList.tsx b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileList.tsx new file mode 100644 index 000000000..9e52288cf --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/FileList.tsx @@ -0,0 +1,104 @@ +import React from 'react'; +import { FileInfo } from '../../lib/api'; +import FileItem from './FileItem'; +import './FileList.css'; + +interface FileListProps { + files: FileInfo[]; + viewMode: 'list' | 'grid'; + loading: boolean; + onNavigate: (path: string) => void; + currentPath: string; + onLoadSubdirectory?: (path: string) => Promise; + onDelete?: () => void; +} + +const FileList: React.FC = ({ files, viewMode, loading, onNavigate, currentPath, onLoadSubdirectory, onDelete }) => { + if (loading) { + return
Loading...
; + } + + if (files.length === 0) { + return
No files in this directory
; + } + + // Build tree structure from flat list + const fileMap = new Map(); + const topLevelFiles: (FileInfo & { children?: FileInfo[] })[] = []; + + // First pass: create map of all files + files.forEach(file => { + fileMap.set(file.path, { ...file, children: [] }); + }); + + // Second pass: build ALL parent-child relationships first + files.forEach(file => { + const fileWithChildren = fileMap.get(file.path)!; + const parentPath = file.path.substring(0, file.path.lastIndexOf('/')); + + + if (fileMap.has(parentPath)) { + // This file has a parent in our list + const parent = fileMap.get(parentPath)!; + if (!parent.children) parent.children = []; + parent.children.push(fileWithChildren); + } + }); + + // Third pass: determine what goes at the top level + // Handle potential leading slash mismatch between breadcrumb and double-click navigation + const normalizedCurrentPath = currentPath.startsWith('/') && currentPath !== '/' + ? currentPath.substring(1) + : currentPath; + const expectedParent = normalizedCurrentPath === '/' ? '' : normalizedCurrentPath; + + files.forEach(file => { + const fileWithChildren = fileMap.get(file.path)!; + const parentPath = file.path.substring(0, file.path.lastIndexOf('/')); + + // Only add to top level if it's a direct child of current directory and has no parent in the list + if (!fileMap.has(parentPath) && parentPath === expectedParent) { + topLevelFiles.push(fileWithChildren); + } + }); + + // Sort files: directories first, then by name + const sortFiles = (files: (FileInfo & { children?: FileInfo[] })[]) => { + return [...files].sort((a, b) => { + if (a.isDirectory && !b.isDirectory) return -1; + if (!a.isDirectory && b.isDirectory) return 1; + return a.name.localeCompare(b.name); + }); + }; + + // Recursively sort all children + const sortRecursive = (files: (FileInfo & { children?: FileInfo[] })[]) => { + const sorted = sortFiles(files); + sorted.forEach(file => { + if (file.children && file.children.length > 0) { + file.children = sortRecursive(file.children); + } + }); + return sorted; + }; + + const sortedFiles = sortRecursive(topLevelFiles); + + return ( +
+ {sortedFiles.map((file) => ( + + ))} +
+ ); +}; + +export default FileList; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Toolbar.css b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Toolbar.css new file mode 100644 index 000000000..2e563128b --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Toolbar.css @@ -0,0 +1,47 @@ +.toolbar { + display: flex; + justify-content: space-between; + padding: 8px 16px; + background-color: var(--bg-secondary); + border-bottom: 1px solid var(--border-color); + flex-shrink: 0; +} + +.toolbar-group { + display: flex; + gap: 8px; +} + +.toolbar button { + padding: 6px 12px; + border: 1px solid var(--border-color); + background-color: var(--bg-primary); + color: var(--text-primary); + cursor: pointer; + border-radius: 4px; + transition: background-color 0.2s, border-color 0.2s; +} + +.toolbar button.icon-button { + padding: 6px 10px; + font-size: 18px; + min-width: 36px; + display: flex; + align-items: center; + justify-content: center; +} + +.toolbar button:hover:not(:disabled) { + background-color: var(--bg-hover); + border-color: var(--text-secondary); +} + +.toolbar button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.toolbar button.active { + background-color: var(--bg-selected); + border-color: var(--link-color); +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Toolbar.tsx b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Toolbar.tsx new file mode 100644 index 000000000..0d669aed0 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/FileExplorer/Toolbar.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import './Toolbar.css'; + +interface ToolbarProps { + viewMode: 'list' | 'grid'; + onViewModeChange: (mode: 'list' | 'grid') => void; + onNewMenu: () => void; + onUploadFiles: () => void; + onUploadFolder: () => void; + onRefresh: () => void; +} + +const Toolbar: React.FC = ({ + viewMode, + onViewModeChange, + onNewMenu, + onUploadFiles, + onUploadFolder, + onRefresh +}) => { + const toggleViewMode = () => { + onViewModeChange(viewMode === 'list' ? 'grid' : 'list'); + }; + + return ( +
+
+ + + + +
+ +
+ +
+
+ ); +}; + +export default Toolbar; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/ShareDialog/ShareDialog.css b/hyperdrive/packages/file-explorer/ui/src/components/ShareDialog/ShareDialog.css new file mode 100644 index 000000000..79f422510 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/ShareDialog/ShareDialog.css @@ -0,0 +1,193 @@ +.share-dialog-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +.share-dialog { + background-color: var(--bg-primary); + color: var(--text-primary); + border-radius: 8px; + padding: 24px; + width: 90%; + max-width: 500px; + max-height: 90vh; + overflow-y: auto; + box-shadow: 0 4px 16px var(--shadow-color); + border: 1px solid var(--border-color); +} + +.share-dialog h3 { + margin-top: 0; + margin-bottom: 16px; + word-break: break-word; + font-size: 1.2rem; +} + +.share-options { + display: flex; + flex-direction: column; + gap: 12px; + margin-bottom: 20px; +} + +.share-options label { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + color: var(--text-primary); +} + +.share-button { + width: 100%; + padding: 10px; + background-color: var(--link-color); + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + transition: background-color 0.2s; +} + +.share-button:hover:not(:disabled) { + background-color: var(--link-hover); +} + +.share-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.share-link-container { + display: flex; + gap: 8px; + margin-top: 16px; + flex-wrap: wrap; +} + +.share-link-input { + flex: 1; + min-width: 0; + padding: 8px; + border: 1px solid var(--border-color); + background-color: var(--bg-secondary); + color: var(--text-primary); + border-radius: 4px; + font-family: monospace; + font-size: 12px; + word-break: break-all; +} + +.share-link-container button { + flex-shrink: 0; + padding: 8px 16px; + background-color: var(--bg-secondary); + color: var(--text-primary); + border: 1px solid var(--border-color); + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s; +} + +.share-link-container button:hover { + background-color: var(--bg-hover); +} + +.dialog-actions { + display: flex; + justify-content: flex-end; + margin-top: 20px; + gap: 8px; +} + +.dialog-actions button { + padding: 8px 16px; + border: 1px solid var(--border-color); + background-color: var(--bg-secondary); + color: var(--text-primary); + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s; +} + +.dialog-actions button:hover { + background-color: var(--bg-hover); +} + +.loading-container { + text-align: center; + padding: 20px 0; +} + +.share-success-message { + background-color: #d4edda; + color: #155724; + padding: 12px; + border-radius: 4px; + margin-bottom: 16px; + text-align: center; +} + +.qr-container { + margin-top: 20px; + text-align: center; + padding: 16px; + background-color: var(--bg-secondary); + border-radius: 8px; + border: 1px solid var(--border-color); +} + +.qr-code canvas, +.qr-code img { + border: 1px solid var(--border-color); + border-radius: 4px; + max-width: 200px; + width: 100%; + height: auto; + display: block; + margin: 0 auto; +} + +/* Mobile responsiveness */ +@media (max-width: 480px) { + .share-dialog { + padding: 16px; + width: 95%; + } + + .share-dialog h3 { + font-size: 1rem; + } + + .share-link-input { + font-size: 11px; + padding: 6px; + } + + .share-link-container { + flex-direction: column; + } + + .share-link-container button { + width: 100%; + } + + .qr-code canvas, + .qr-code img { + max-width: 150px; + } + + .share-success-message { + font-size: 0.9rem; + padding: 10px; + } +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/ShareDialog/ShareDialog.tsx b/hyperdrive/packages/file-explorer/ui/src/components/ShareDialog/ShareDialog.tsx new file mode 100644 index 000000000..52a14f6c5 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/ShareDialog/ShareDialog.tsx @@ -0,0 +1,193 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { FileInfo, AuthScheme, shareFile } from '../../lib/api'; +import useFileExplorerStore from '../../store/fileExplorer'; +import QRCode from 'qrcode'; +import './ShareDialog.css'; + +interface ShareDialogProps { + file: FileInfo; + onClose: () => void; +} + +const ShareDialog: React.FC = ({ file, onClose }) => { + const [authScheme, setAuthScheme] = useState("Public"); + const [shareLink, setShareLink] = useState(''); + const [loading, setLoading] = useState(false); + const [qrCodeDataUrl, setQrCodeDataUrl] = useState(''); + const [copied, setCopied] = useState(false); + const { addSharedLink } = useFileExplorerStore(); + const canvasRef = useRef(null); + + // Detect if we're in iOS standalone mode (PWA) + const isIosPwa = () => { + return (window.navigator as any).standalone === true || + window.matchMedia('(display-mode: standalone)').matches; + }; + + // Auto-generate share link on mount + useEffect(() => { + handleShare(); + }, []); + + // Generate QR code when share link is available + useEffect(() => { + if (shareLink) { + const generateQrCode = async () => { + try { + if (isIosPwa()) { + // For iOS PWA, use canvas rendering + if (canvasRef.current) { + await QRCode.toCanvas(canvasRef.current, shareLink, { + width: 200, + margin: 2, + color: { + dark: '#000000', + light: '#FFFFFF' + } + }); + } + } else { + // For desktop and regular mobile browsers, use data URL + const dataUrl = await QRCode.toDataURL(shareLink, { + width: 200, + margin: 2, + color: { + dark: '#000000', + light: '#FFFFFF' + } + }); + setQrCodeDataUrl(dataUrl); + } + } catch (err) { + console.error('Failed to generate QR code:', err); + } + }; + + generateQrCode(); + } + }, [shareLink]); + + const handleShare = async () => { + setLoading(true); + try { + const link = await shareFile(file.path, authScheme); + + // Remove first element of origin (e.g., http://foo.bar.com -> http://bar.com) + let origin = window.location.origin; + const urlParts = new URL(origin); + const hostParts = urlParts.hostname.split('.'); + if (hostParts.length > 2) { + // Remove the first subdomain + hostParts.shift(); + urlParts.hostname = hostParts.join('.'); + origin = urlParts.toString().replace(/\/$/, ''); // Remove trailing slash + } + + const fullLink = `${origin}${link}`; + setShareLink(fullLink); + addSharedLink(file.path, fullLink); + + // Auto-copy to clipboard with fallback + try { + await navigator.clipboard.writeText(fullLink); + setCopied(true); + } catch (clipboardErr) { + // Fallback for when clipboard API fails + const textArea = document.createElement('textarea'); + textArea.value = fullLink; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + setCopied(true); + } catch (e) { + console.error('Failed to copy to clipboard:', e); + } + document.body.removeChild(textArea); + } + } catch (err) { + console.error('Failed to share file:', err); + } finally { + setLoading(false); + } + }; + + const copyToClipboard = async () => { + try { + await navigator.clipboard.writeText(shareLink); + setCopied(true); + } catch (clipboardErr) { + // Fallback for when clipboard API fails + const textArea = document.createElement('textarea'); + textArea.value = shareLink; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + setCopied(true); + } catch (e) { + console.error('Failed to copy to clipboard:', e); + } + document.body.removeChild(textArea); + } + setTimeout(() => setCopied(false), 2000); + }; + + return ( +
+
e.stopPropagation()}> +

Share File: {file.name}

+ + {loading ? ( +
+

Generating share link...

+
+ ) : shareLink ? ( + <> +
+

✓ Share link created and copied to clipboard!

+
+ +
+ + +
+ + {shareLink && ( +
+
+ {isIosPwa() ? ( + + ) : ( + qrCodeDataUrl && QR Code + )} +
+
+ )} + + ) : ( +

Failed to generate share link

+ )} + +
+ +
+
+
+ ); +}; + +export default ShareDialog; diff --git a/hyperdrive/packages/file-explorer/ui/src/components/Upload/UploadZone.css b/hyperdrive/packages/file-explorer/ui/src/components/Upload/UploadZone.css new file mode 100644 index 000000000..5772d204f --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/Upload/UploadZone.css @@ -0,0 +1,38 @@ +.upload-zone { + position: relative; + flex: 1; + display: flex; + flex-direction: column; +} + +.upload-zone.dragging { + background-color: rgba(33, 150, 243, 0.1); +} + +.upload-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(33, 150, 243, 0.2); + display: flex; + align-items: center; + justify-content: center; + pointer-events: none; + z-index: 10; +} + +[data-theme="dark"] .upload-overlay { + background-color: rgba(100, 181, 246, 0.2); +} + +.upload-message { + padding: 24px 48px; + background-color: var(--link-color); + color: white; + border-radius: 8px; + font-size: 18px; + font-weight: 500; + box-shadow: 0 4px 8px var(--shadow-color); +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/components/Upload/UploadZone.tsx b/hyperdrive/packages/file-explorer/ui/src/components/Upload/UploadZone.tsx new file mode 100644 index 000000000..3bcc775f2 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/components/Upload/UploadZone.tsx @@ -0,0 +1,187 @@ +import React, { useState, useRef } from 'react'; +import { uploadFile, createDirectory } from '../../lib/api'; +import useFileExplorerStore from '../../store/fileExplorer'; +import './UploadZone.css'; + +interface UploadZoneProps { + currentPath: string; + onUploadComplete: () => void; + children: React.ReactNode; +} + +const UploadZone: React.FC = ({ currentPath, onUploadComplete, children }) => { + const [isDragging, setIsDragging] = useState(false); + const { updateUploadProgress, setError } = useFileExplorerStore(); + const dragCounter = useRef(0); + + // Listen for upload events from the toolbar + React.useEffect(() => { + const handleUploadEvent = async (e: CustomEvent) => { + const files = e.detail.files as File[]; + for (const file of files) { + await handleFileUpload(file); + } + }; + + window.addEventListener('upload-files', handleUploadEvent as EventListener); + return () => { + window.removeEventListener('upload-files', handleUploadEvent as EventListener); + }; + }, [currentPath, onUploadComplete]); + + const handleDrag = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const handleDragIn = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + dragCounter.current++; + if (e.dataTransfer.items && e.dataTransfer.items.length > 0) { + setIsDragging(true); + } + }; + + const handleDragOut = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + dragCounter.current--; + if (dragCounter.current === 0) { + setIsDragging(false); + } + }; + + const handleDrop = async (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setIsDragging(false); + dragCounter.current = 0; + + // Handle both files and folders + const items = e.dataTransfer.items; + if (items) { + // Use DataTransferItemList interface when available + const files: File[] = []; + + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (item.kind === 'file') { + const entry = item.webkitGetAsEntry?.(); + if (entry) { + await processEntry(entry, '', files); + } else { + // Fallback to getAsFile for browsers that don't support webkitGetAsEntry + const file = item.getAsFile(); + if (file) files.push(file); + } + } + } + + // Upload all collected files + for (const file of files) { + await handleFileUpload(file); + } + } else { + // Fallback for browsers that don't support DataTransferItemList + const files = Array.from(e.dataTransfer.files); + for (const file of files) { + await handleFileUpload(file); + } + } + }; + + // Recursively process file system entries (for folder support) + const processEntry = async (entry: any, path: string, files: File[]): Promise => { + if (entry.isFile) { + // Handle file + return new Promise((resolve) => { + entry.file((file: File) => { + // Add the relative path to the file object + Object.defineProperty(file, 'webkitRelativePath', { + value: path + file.name, + writable: false + }); + files.push(file); + resolve(); + }); + }); + } else if (entry.isDirectory) { + // Handle directory + const dirReader = entry.createReader(); + return new Promise((resolve) => { + dirReader.readEntries(async (entries: any[]) => { + for (const childEntry of entries) { + await processEntry(childEntry, path + entry.name + '/', files); + } + resolve(); + }); + }); + } + }; + + const handleFileUpload = async (file: File) => { + const fileId = `${file.name}-${Date.now()}`; + + try { + updateUploadProgress(fileId, 0); + + const content = await file.arrayBuffer(); + const contentArray = Array.from(new Uint8Array(content)); + + // Check if file is part of a folder upload + const relativePath = (file as any).webkitRelativePath || ''; + let uploadPath = currentPath; + let fileName = file.name; + + if (relativePath) { + // Handle folder structure + const pathParts = relativePath.split('/'); + fileName = pathParts.pop() || file.name; + + // Create nested folder structure + for (const folderName of pathParts) { + uploadPath = uploadPath === '/' ? `/${folderName}` : `${uploadPath}/${folderName}`; + try { + await createDirectory(uploadPath); + } catch (err) { + // Ignore if directory already exists + console.log(`Directory ${uploadPath} might already exist`); + } + } + } + + // Simulate upload progress + updateUploadProgress(fileId, 50); + + await uploadFile(uploadPath, fileName, contentArray); + + updateUploadProgress(fileId, 100); + onUploadComplete(); + } catch (err) { + setError(err instanceof Error ? err.message : 'Upload failed'); + updateUploadProgress(fileId, 100); // Remove from progress + } + }; + + return ( +
+ {children} + {isDragging && ( +
+
+ Drop files or folders here to upload +
+
+ )} +
+ ); +}; + +export default UploadZone; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/contexts/ThemeContext.tsx b/hyperdrive/packages/file-explorer/ui/src/contexts/ThemeContext.tsx new file mode 100644 index 000000000..4394b10af --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/contexts/ThemeContext.tsx @@ -0,0 +1,56 @@ +import React, { createContext, useContext, useEffect, useState } from 'react'; + +type Theme = 'light' | 'dark'; + +interface ThemeContextType { + theme: Theme; + toggleTheme: () => void; +} + +const ThemeContext = createContext(undefined); + +export const useTheme = () => { + const context = useContext(ThemeContext); + if (!context) { + throw new Error('useTheme must be used within a ThemeProvider'); + } + return context; +}; + +export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + // Auto-detect system theme preference + const getSystemTheme = (): Theme => { + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + return 'dark'; + } + return 'light'; + }; + + const [theme, setTheme] = useState(getSystemTheme()); + + useEffect(() => { + // Apply theme to document root + document.documentElement.setAttribute('data-theme', theme); + }, [theme]); + + useEffect(() => { + // Listen for system theme changes + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + const handleChange = (e: MediaQueryListEvent) => { + setTheme(e.matches ? 'dark' : 'light'); + }; + + mediaQuery.addEventListener('change', handleChange); + return () => mediaQuery.removeEventListener('change', handleChange); + }, []); + + const toggleTheme = () => { + setTheme(prev => prev === 'light' ? 'dark' : 'light'); + }; + + return ( + + {children} + + ); +}; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/index.css b/hyperdrive/packages/file-explorer/ui/src/index.css new file mode 100644 index 000000000..5b7e24b37 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/index.css @@ -0,0 +1,120 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Light theme variables */ +[data-theme="light"] { + --bg-primary: #ffffff; + --bg-secondary: #f5f5f5; + --bg-hover: #e9e9e9; + --bg-selected: #e3f2fd; + --text-primary: #213547; + --text-secondary: #666666; + --border-color: #e0e0e0; + --shadow-color: rgba(0, 0, 0, 0.1); + --link-color: #0066cc; + --link-hover: #0052a3; + --error-color: #d32f2f; + --success-color: #388e3c; +} + +/* Dark theme variables */ +[data-theme="dark"] { + --bg-primary: #1e1e1e; + --bg-secondary: #2d2d2d; + --bg-hover: #3a3a3a; + --bg-selected: #1a4d7a; + --text-primary: #e0e0e0; + --text-secondary: #b0b0b0; + --border-color: #404040; + --shadow-color: rgba(0, 0, 0, 0.3); + --link-color: #64b5f6; + --link-hover: #90caf9; + --error-color: #f44336; + --success-color: #66bb6a; +} + +/* Apply theme colors */ +body { + margin: 0; + padding: 0; + min-width: 320px; + min-height: 100vh; + color: var(--text-primary); + background-color: var(--bg-primary); + transition: background-color 0.3s ease, color 0.3s ease; + overflow: hidden; +} + +#root { + width: 100%; + height: 100vh; + margin: 0; + padding: 0; + overflow: hidden; +} + +a { + font-weight: 500; + color: var(--link-color); + text-decoration: inherit; +} +a:hover { + color: var(--link-hover); +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +ul { + list-style: none; + padding: 0; + margin: 0; +} + +button { + border-radius: 8px; + border: 1px solid var(--border-color); + padding: 0.6em 1.2em; + background-color: var(--bg-secondary); + color: var(--text-primary); + font-size: 1em; + font-weight: 500; + font-family: inherit; + cursor: pointer; + transition: background-color 0.25s, border-color 0.25s; +} +button:hover { + background-color: var(--bg-hover); + border-color: var(--text-secondary); +} +button:focus, +button:focus-visible { + outline: 2px solid var(--link-color); + outline-offset: 2px; +} + +/* Additional utility classes */ +.error-message { + color: var(--error-color); + padding: 1rem; + background-color: var(--bg-secondary); + border-radius: 4px; + margin: 0.5rem 0; +} + +.success-message { + color: var(--success-color); + padding: 1rem; + background-color: var(--bg-secondary); + border-radius: 4px; + margin: 0.5rem 0; +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/lib/api.ts b/hyperdrive/packages/file-explorer/ui/src/lib/api.ts new file mode 100644 index 000000000..2d0912e47 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/lib/api.ts @@ -0,0 +1,2 @@ +// Re-export everything from the generated caller-utils +export * from '../types/api'; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/main.tsx b/hyperdrive/packages/file-explorer/ui/src/main.tsx new file mode 100644 index 000000000..3d7150da8 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/hyperdrive/packages/file-explorer/ui/src/store/fileExplorer.ts b/hyperdrive/packages/file-explorer/ui/src/store/fileExplorer.ts new file mode 100644 index 000000000..9e04b5854 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/store/fileExplorer.ts @@ -0,0 +1,110 @@ +import { create } from 'zustand'; +import { FileInfo } from '../lib/api'; + +interface FileExplorerStore { + currentPath: string; + files: FileInfo[]; + selectedFiles: string[]; + expandedDirectories: Set; + uploadProgress: Map; + sharedLinks: Map; + loading: boolean; + error: string | null; + + // Actions + setCurrentPath: (path: string) => void; + setFiles: (files: FileInfo[]) => void; + selectFile: (path: string) => void; + deselectFile: (path: string) => void; + toggleFileSelection: (path: string) => void; + clearSelection: () => void; + selectAll: () => void; + toggleDirectoryExpanded: (path: string) => void; + updateUploadProgress: (fileId: string, progress: number) => void; + addSharedLink: (path: string, link: string) => void; + removeSharedLink: (path: string) => void; + isFileShared: (path: string) => boolean; + setLoading: (loading: boolean) => void; + setError: (error: string | null) => void; +} + +const useFileExplorerStore = create((set, get) => ({ + currentPath: '', // Start with empty path to avoid loading root before home is set + files: [], + selectedFiles: [], + expandedDirectories: new Set(), + uploadProgress: new Map(), + sharedLinks: new Map(), + loading: false, + error: null, + + setCurrentPath: (path) => set({ currentPath: path }), + + setFiles: (files) => set({ files, error: null }), + + selectFile: (path) => set((state) => ({ + selectedFiles: [...state.selectedFiles, path] + })), + + deselectFile: (path) => set((state) => ({ + selectedFiles: state.selectedFiles.filter(p => p !== path) + })), + + toggleFileSelection: (path) => { + const state = get(); + if (state.selectedFiles.includes(path)) { + state.deselectFile(path); + } else { + state.selectFile(path); + } + }, + + clearSelection: () => set({ selectedFiles: [] }), + + selectAll: () => set((state) => ({ + selectedFiles: state.files.map(f => f.path) + })), + + toggleDirectoryExpanded: (path) => set((state) => { + const newExpanded = new Set(state.expandedDirectories); + if (newExpanded.has(path)) { + newExpanded.delete(path); + } else { + newExpanded.add(path); + } + return { expandedDirectories: newExpanded }; + }), + + updateUploadProgress: (fileId, progress) => set((state) => { + const newProgress = new Map(state.uploadProgress); + if (progress >= 100) { + newProgress.delete(fileId); + } else { + newProgress.set(fileId, progress); + } + return { uploadProgress: newProgress }; + }), + + addSharedLink: (path, link) => set((state) => { + const newLinks = new Map(state.sharedLinks); + newLinks.set(path, link); + return { sharedLinks: newLinks }; + }), + + removeSharedLink: (path) => set((state) => { + const newLinks = new Map(state.sharedLinks); + newLinks.delete(path); + return { sharedLinks: newLinks }; + }), + + isFileShared: (path) => { + const state = get(); + return state.sharedLinks.has(path); + }, + + setLoading: (loading) => set({ loading }), + + setError: (error) => set({ error }), +})); + +export default useFileExplorerStore; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/types/api.ts b/hyperdrive/packages/file-explorer/ui/src/types/api.ts new file mode 100644 index 000000000..68d8d24ae --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/types/api.ts @@ -0,0 +1,2 @@ +// Re-export everything from caller-utils +export * from '../../../target/ui/caller-utils'; \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/types/caller-utils.d.ts b/hyperdrive/packages/file-explorer/ui/src/types/caller-utils.d.ts new file mode 100644 index 000000000..e6eb27741 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/types/caller-utils.d.ts @@ -0,0 +1,17 @@ +// Temporary type declarations for caller-utils +declare module '../../../target/ui/caller-utils' { + export interface FileInfo { + name: string; + path: string; + size: number; + created: number; + modified: number; + is_directory: boolean; + permissions: string; + } + + export enum AuthScheme { + Public = "public", + Private = "private" + } +} \ No newline at end of file diff --git a/hyperdrive/packages/file-explorer/ui/src/types/global.ts b/hyperdrive/packages/file-explorer/ui/src/types/global.ts new file mode 100644 index 000000000..44640a4cc --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/types/global.ts @@ -0,0 +1,10 @@ +declare module "global" { + global { + interface Window { + our: { + node: string; + process: string; + }; + } + } +} diff --git a/hyperdrive/packages/file-explorer/ui/src/vite-env.d.ts b/hyperdrive/packages/file-explorer/ui/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/hyperdrive/packages/file-explorer/ui/tsconfig.json b/hyperdrive/packages/file-explorer/ui/tsconfig.json new file mode 100644 index 000000000..6f1484324 --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + // "strict": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src", + "../pkg/manifest.json", + "../pkg/metadata.json", + ], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/hyperdrive/packages/file-explorer/ui/tsconfig.node.json b/hyperdrive/packages/file-explorer/ui/tsconfig.node.json new file mode 100644 index 000000000..42872c59f --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/hyperdrive/packages/file-explorer/ui/vite.config.ts b/hyperdrive/packages/file-explorer/ui/vite.config.ts new file mode 100644 index 000000000..3683e564a --- /dev/null +++ b/hyperdrive/packages/file-explorer/ui/vite.config.ts @@ -0,0 +1,67 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +/* +If you are developing a UI outside of a Hyperware project, +comment out the following 2 lines: +*/ +import manifest from '../pkg/manifest.json' +import metadata from '../metadata.json' + +/* +IMPORTANT: +This must match the process name from pkg/manifest.json + pkg/metadata.json +The format is "/" + "process_name:package_name:publisher_node" +*/ +const BASE_URL = `/${manifest[0].process_name}:${metadata.properties.package_name}:${metadata.properties.publisher}`; + +// This is the proxy URL, it must match the node you are developing against +const PROXY_URL = (process.env.VITE_NODE_URL || 'http://127.0.0.1:8080').replace('localhost', '127.0.0.1'); + +console.log('process.env.VITE_NODE_URL', process.env.VITE_NODE_URL, PROXY_URL); + +export default defineConfig({ + plugins: [react()], + base: BASE_URL, + build: { + rollupOptions: { + external: ['/our.js'] + } + }, + server: { + open: true, + proxy: { + '/our': { + target: PROXY_URL, + changeOrigin: true, + }, + [`${BASE_URL}/our.js`]: { + target: PROXY_URL, + changeOrigin: true, + rewrite: (path) => path.replace(BASE_URL, ''), + }, + // This route will match all other HTTP requests to the backend + [`^${BASE_URL}/(?!(@vite/client|src/.*|node_modules/.*|@react-refresh|$))`]: { + target: PROXY_URL, + changeOrigin: true, + }, + // '/example': { + // target: PROXY_URL, + // changeOrigin: true, + // rewrite: (path) => path.replace(BASE_URL, ''), + // // This is only for debugging purposes + // configure: (proxy, _options) => { + // proxy.on('error', (err, _req, _res) => { + // console.log('proxy error', err); + // }); + // proxy.on('proxyReq', (proxyReq, req, _res) => { + // console.log('Sending Request to the Target:', req.method, req.url); + // }); + // proxy.on('proxyRes', (proxyRes, req, _res) => { + // console.log('Received Response from the Target:', proxyRes.statusCode, req.url); + // }); + // }, + // }, + } + } +}); diff --git a/hyperdrive/packages/hns-indexer/get-block/src/lib.rs b/hyperdrive/packages/hns-indexer/get-block/src/lib.rs index 361ccaed3..a817c73bc 100644 --- a/hyperdrive/packages/hns-indexer/get-block/src/lib.rs +++ b/hyperdrive/packages/hns-indexer/get-block/src/lib.rs @@ -1,7 +1,7 @@ use hyperware_process_lib::{eth, script, Address}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "process-v1", }); diff --git a/hyperdrive/packages/hns-indexer/hns-indexer/src/lib.rs b/hyperdrive/packages/hns-indexer/hns-indexer/src/lib.rs index 220a0b117..8bc7575ec 100644 --- a/hyperdrive/packages/hns-indexer/hns-indexer/src/lib.rs +++ b/hyperdrive/packages/hns-indexer/hns-indexer/src/lib.rs @@ -17,7 +17,7 @@ use std::{ }; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hns-indexer-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/hns-indexer/node-info/src/lib.rs b/hyperdrive/packages/hns-indexer/node-info/src/lib.rs index ede4c4e1b..b706d0d86 100644 --- a/hyperdrive/packages/hns-indexer/node-info/src/lib.rs +++ b/hyperdrive/packages/hns-indexer/node-info/src/lib.rs @@ -3,7 +3,7 @@ use hyperware_process_lib::{println, script, Address, Request}; use std::str::FromStr; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hns-indexer-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/hns-indexer/reset/src/lib.rs b/hyperdrive/packages/hns-indexer/reset/src/lib.rs index e33e052f7..adb543ccb 100644 --- a/hyperdrive/packages/hns-indexer/reset/src/lib.rs +++ b/hyperdrive/packages/hns-indexer/reset/src/lib.rs @@ -4,7 +4,7 @@ use hyperware::process::hns_indexer::IndexerRequest; use hyperware_process_lib::{call_init, Address, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hns-indexer-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/hns-indexer/state/src/lib.rs b/hyperdrive/packages/hns-indexer/state/src/lib.rs index 32b64e8c5..caa6c1573 100644 --- a/hyperdrive/packages/hns-indexer/state/src/lib.rs +++ b/hyperdrive/packages/hns-indexer/state/src/lib.rs @@ -2,7 +2,7 @@ use crate::hyperware::process::hns_indexer::{GetStateRequest, IndexerRequest, In use hyperware_process_lib::{eth, script, Address, Message, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hns-indexer-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/homepage/homepage/src/lib.rs b/hyperdrive/packages/homepage/homepage/src/lib.rs index a05a166b6..9ed29eda6 100644 --- a/hyperdrive/packages/homepage/homepage/src/lib.rs +++ b/hyperdrive/packages/homepage/homepage/src/lib.rs @@ -14,7 +14,7 @@ const DEFAULT_FAVES: &[&str] = &["main:app-store:sys", "settings:settings:sys"]; type PersistedAppOrder = HashMap; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "homepage-sys-v1", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize], diff --git a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs index e4d2969bb..5125b9a11 100644 --- a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs +++ b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs @@ -23,7 +23,7 @@ use hyperware_process_lib::{ }; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hypermap-cacher-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/hypermap-cacher/reset-cache/src/lib.rs b/hyperdrive/packages/hypermap-cacher/reset-cache/src/lib.rs index 64979a0d6..45adadd23 100644 --- a/hyperdrive/packages/hypermap-cacher/reset-cache/src/lib.rs +++ b/hyperdrive/packages/hypermap-cacher/reset-cache/src/lib.rs @@ -16,7 +16,7 @@ use crate::hyperware::process::hypermap_cacher::{CacherRequest, CacherResponse}; use hyperware_process_lib::{await_next_message_body, call_init, println, Address, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hypermap-cacher-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/hypermap-cacher/set-nodes/src/lib.rs b/hyperdrive/packages/hypermap-cacher/set-nodes/src/lib.rs index fa1de5cd6..9236ca28e 100644 --- a/hyperdrive/packages/hypermap-cacher/set-nodes/src/lib.rs +++ b/hyperdrive/packages/hypermap-cacher/set-nodes/src/lib.rs @@ -14,7 +14,7 @@ use crate::hyperware::process::hypermap_cacher::{CacherRequest, CacherResponse}; use hyperware_process_lib::{await_next_message_body, call_init, println, Address, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hypermap-cacher-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/hypermap-cacher/start-providing/src/lib.rs b/hyperdrive/packages/hypermap-cacher/start-providing/src/lib.rs index ced9ee8a3..8162c77ab 100644 --- a/hyperdrive/packages/hypermap-cacher/start-providing/src/lib.rs +++ b/hyperdrive/packages/hypermap-cacher/start-providing/src/lib.rs @@ -2,7 +2,7 @@ use crate::hyperware::process::hypermap_cacher::{CacherRequest, CacherResponse}; use hyperware_process_lib::{call_init, println, Address, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hypermap-cacher-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/hypermap-cacher/stop-providing/src/lib.rs b/hyperdrive/packages/hypermap-cacher/stop-providing/src/lib.rs index c3bbef6d5..bf4491ca7 100644 --- a/hyperdrive/packages/hypermap-cacher/stop-providing/src/lib.rs +++ b/hyperdrive/packages/hypermap-cacher/stop-providing/src/lib.rs @@ -2,7 +2,7 @@ use crate::hyperware::process::hypermap_cacher::{CacherRequest, CacherResponse}; use hyperware_process_lib::{call_init, println, Address, Request}; wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "hypermap-cacher-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], diff --git a/hyperdrive/packages/settings/settings/src/lib.rs b/hyperdrive/packages/settings/settings/src/lib.rs index bd4871a27..00451d69b 100644 --- a/hyperdrive/packages/settings/settings/src/lib.rs +++ b/hyperdrive/packages/settings/settings/src/lib.rs @@ -17,7 +17,7 @@ use std::{collections::HashMap, str::FromStr, vec}; const ICON: &str = include_str!("icon"); wit_bindgen::generate!({ - path: "target/wit", + path: "../target/wit", world: "settings-sys-v0", generate_unused_types: true, additional_derives: [serde::Deserialize, serde::Serialize], @@ -636,9 +636,9 @@ fn make_widget(state: &SettingsState) -> String {
-