From 486b6705565a23d25eea46291ce1c28d44b1a159 Mon Sep 17 00:00:00 2001 From: emilis Date: Wed, 29 Oct 2025 08:51:52 +0000 Subject: [PATCH] initial commit --- .gitignore | 6 + Cargo.lock | 3647 +++++++++++++++++ Cargo.toml | 3 + migrations/1_init.sql | 113 + pkg/plan.service | 19 + plan-macros/Cargo.toml | 13 + plan-macros/src/hashlist.rs | 36 + plan-macros/src/lib.rs | 491 +++ plan-macros/src/targets.rs | 294 ++ plan-proto/Cargo.toml | 29 + plan-proto/src/cbor.rs | 156 + plan-proto/src/error.rs | 148 + plan-proto/src/lib.rs | 465 +++ plan-proto/src/limited.rs | 129 + plan-proto/src/message.rs | 23 + plan-proto/src/plan.rs | 96 + plan-proto/src/token.rs | 40 + plan-proto/src/user.rs | 14 + plan-server/Cargo.toml | 44 + plan-server/build.rs | 129 + plan-server/src/db.rs | 40 + plan-server/src/db/plan.rs | 399 ++ plan-server/src/db/user.rs | 213 + plan-server/src/identity.rs | 8 + plan-server/src/main.rs | 372 ++ plan-server/src/runner.rs | 179 + plan-server/src/session.rs | 350 ++ plan/Cargo.lock | 1531 +++++++ plan/Cargo.toml | 42 + plan/Trunk.toml | 15 + plan/dist/index-1cee5a016147b48c.css | 1 + plan/dist/index.html | 8 + plan/dist/plan-9b4f658762b65072.js | 1 + plan/dist/plan-9b4f658762b65072_bg.wasm | Bin 0 -> 1267967 bytes plan/index.html | 15 + plan/index.scss | 477 +++ plan/src/components/dialog.rs | 55 + plan/src/components/error.rs | 25 + plan/src/components/half_hour_range_select.rs | 54 + plan/src/components/nav.rs | 77 + plan/src/components/planview.rs | 314 ++ plan/src/components/state_input.rs | 61 + plan/src/error.rs | 50 + plan/src/login.rs | 52 + plan/src/main.rs | 227 + plan/src/pages/mainpage.rs | 179 + plan/src/pages/new_plan.rs | 376 ++ plan/src/pages/not_found.rs | 10 + plan/src/pages/plan.rs | 386 ++ plan/src/pages/signin.rs | 110 + plan/src/pages/signup.rs | 150 + plan/src/request.rs | 25 + plan/src/storage.rs | 30 + plan/src/weekday.rs | 19 + rust-toolchain.toml | 2 + 55 files changed, 11748 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 migrations/1_init.sql create mode 100644 pkg/plan.service create mode 100644 plan-macros/Cargo.toml create mode 100644 plan-macros/src/hashlist.rs create mode 100644 plan-macros/src/lib.rs create mode 100644 plan-macros/src/targets.rs create mode 100644 plan-proto/Cargo.toml create mode 100644 plan-proto/src/cbor.rs create mode 100644 plan-proto/src/error.rs create mode 100644 plan-proto/src/lib.rs create mode 100644 plan-proto/src/limited.rs create mode 100644 plan-proto/src/message.rs create mode 100644 plan-proto/src/plan.rs create mode 100644 plan-proto/src/token.rs create mode 100644 plan-proto/src/user.rs create mode 100644 plan-server/Cargo.toml create mode 100644 plan-server/build.rs create mode 100644 plan-server/src/db.rs create mode 100644 plan-server/src/db/plan.rs create mode 100644 plan-server/src/db/user.rs create mode 100644 plan-server/src/identity.rs create mode 100644 plan-server/src/main.rs create mode 100644 plan-server/src/runner.rs create mode 100644 plan-server/src/session.rs create mode 100644 plan/Cargo.lock create mode 100644 plan/Cargo.toml create mode 100644 plan/Trunk.toml create mode 100644 plan/dist/index-1cee5a016147b48c.css create mode 100644 plan/dist/index.html create mode 100644 plan/dist/plan-9b4f658762b65072.js create mode 100644 plan/dist/plan-9b4f658762b65072_bg.wasm create mode 100644 plan/index.html create mode 100644 plan/index.scss create mode 100644 plan/src/components/dialog.rs create mode 100644 plan/src/components/error.rs create mode 100644 plan/src/components/half_hour_range_select.rs create mode 100644 plan/src/components/nav.rs create mode 100644 plan/src/components/planview.rs create mode 100644 plan/src/components/state_input.rs create mode 100644 plan/src/error.rs create mode 100644 plan/src/login.rs create mode 100644 plan/src/main.rs create mode 100644 plan/src/pages/mainpage.rs create mode 100644 plan/src/pages/new_plan.rs create mode 100644 plan/src/pages/not_found.rs create mode 100644 plan/src/pages/plan.rs create mode 100644 plan/src/pages/signin.rs create mode 100644 plan/src/pages/signup.rs create mode 100644 plan/src/request.rs create mode 100644 plan/src/storage.rs create mode 100644 plan/src/weekday.rs create mode 100644 rust-toolchain.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3751403 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +target +target-* +calendar/dist +.vscode +build-and-send.fish +.sqlx diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..469a83e --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3647 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[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 = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "anymap2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures", + "password-hash", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" +dependencies = [ + "axum-core 0.5.5", + "axum-macros", + "base64", + "bytes", + "form_urlencoded", + "futures-util", + "http 1.3.1", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-extra" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96" +dependencies = [ + "axum", + "axum-core 0.5.5", + "bytes", + "futures-util", + "headers", + "http 1.3.1", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "serde_core", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-limit" +version = "0.1.0-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3faa0b4a7a9fe9c072b3acde27ea8884cdc7a61982b5db9f402679631c2549ab" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "dashmap", + "http 1.3.1", +] + +[[package]] +name = "axum-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +dependencies = [ + "serde_core", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[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 = "boolinator" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[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 = "cc" +version = "1.2.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.17", +] + +[[package]] +name = "colored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + +[[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 = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[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 = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[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.107", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[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 = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[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-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[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.107", +] + +[[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 = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "gloo" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28999cda5ef6916ffd33fb4a7b87e1de633c47c0dc6d97905fee1cdaa142b94d" +dependencies = [ + "gloo-console 0.2.3", + "gloo-dialogs 0.1.1", + "gloo-events 0.1.2", + "gloo-file 0.2.3", + "gloo-history 0.1.5", + "gloo-net 0.3.1", + "gloo-render 0.1.1", + "gloo-storage 0.2.2", + "gloo-timers 0.2.6", + "gloo-utils 0.1.7", + "gloo-worker 0.2.1", +] + +[[package]] +name = "gloo" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd35526c28cc55c1db77aed6296de58677dbab863b118483a27845631d870249" +dependencies = [ + "gloo-console 0.3.0", + "gloo-dialogs 0.2.0", + "gloo-events 0.2.0", + "gloo-file 0.3.0", + "gloo-history 0.2.2", + "gloo-net 0.4.0", + "gloo-render 0.2.0", + "gloo-storage 0.3.0", + "gloo-timers 0.3.0", + "gloo-utils 0.2.0", + "gloo-worker 0.4.0", +] + +[[package]] +name = "gloo" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15282ece24eaf4bd338d73ef580c6714c8615155c4190c781290ee3fa0fd372" +dependencies = [ + "gloo-console 0.3.0", + "gloo-dialogs 0.2.0", + "gloo-events 0.2.0", + "gloo-file 0.3.0", + "gloo-history 0.2.2", + "gloo-net 0.5.0", + "gloo-render 0.2.0", + "gloo-storage 0.3.0", + "gloo-timers 0.3.0", + "gloo-utils 0.2.0", + "gloo-worker 0.5.0", +] + +[[package]] +name = "gloo-console" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b7ce3c05debe147233596904981848862b068862e9ec3e34be446077190d3f" +dependencies = [ + "gloo-utils 0.1.7", + "js-sys", + "serde", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-console" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a17868f56b4a24f677b17c8cb69958385102fa879418052d60b50bc1727e261" +dependencies = [ + "gloo-utils 0.2.0", + "js-sys", + "serde", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-dialogs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67062364ac72d27f08445a46cab428188e2e224ec9e37efdba48ae8c289002e6" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-dialogs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4748e10122b01435750ff530095b1217cf6546173459448b83913ebe7815df" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-events" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b107f8abed8105e4182de63845afcc7b69c098b7852a813ea7462a320992fc" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-events" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c26fb45f7c385ba980f5fa87ac677e363949e065a083722697ef1b2cc91e41" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-file" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d5564e570a38b43d78bdc063374a0c3098c4f0d64005b12f9bbe87e869b6d7" +dependencies = [ + "gloo-events 0.1.2", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-file" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97563d71863fb2824b2e974e754a81d19c4a7ec47b09ced8a0e6656b6d54bd1f" +dependencies = [ + "futures-channel", + "gloo-events 0.2.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-history" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85725d90bf0ed47063b3930ef28e863658a7905989e9929a8708aab74a1d5e7f" +dependencies = [ + "gloo-events 0.1.2", + "gloo-utils 0.1.7", + "serde", + "serde-wasm-bindgen 0.5.0", + "serde_urlencoded", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-history" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "903f432be5ba34427eac5e16048ef65604a82061fe93789f2212afc73d8617d6" +dependencies = [ + "getrandom 0.2.16", + "gloo-events 0.2.0", + "gloo-utils 0.2.0", + "serde", + "serde-wasm-bindgen 0.6.5", + "serde_urlencoded", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66b4e3c7d9ed8d315fd6b97c8b1f74a7c6ecbbc2320e65ae7ed38b7068cc620" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils 0.1.7", + "http 0.2.12", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac9e8288ae2c632fa9f8657ac70bfe38a1530f345282d7ba66a1f70b72b7dc4" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils 0.2.0", + "http 0.2.12", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43aaa242d1239a8822c15c645f02166398da4f8b5c4bae795c1f5b44e9eee173" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils 0.2.0", + "http 0.2.12", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-render" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd9306aef67cfd4449823aadcd14e3958e0800aa2183955a309112a84ec7764" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-render" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56008b6744713a8e8d98ac3dcb7d06543d5662358c9c805b4ce2167ad4649833" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-storage" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6ab60bf5dbfd6f0ed1f7843da31b41010515c745735c970e821945ca91e480" +dependencies = [ + "gloo-utils 0.1.7", + "js-sys", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-storage" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc8031e8c92758af912f9bc08fbbadd3c6f3cfcbf6b64cdf3d6a81f0139277a" +dependencies = [ + "gloo-utils 0.2.0", + "js-sys", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13471584da78061a28306d1359dd0178d8d6fc1c7c80e5e35d27260346e0516a" +dependencies = [ + "anymap2", + "bincode", + "gloo-console 0.2.3", + "gloo-utils 0.1.7", + "js-sys", + "serde", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76495d3dd87de51da268fa3a593da118ab43eb7f8809e17eb38d3319b424e400" +dependencies = [ + "bincode", + "futures", + "gloo-utils 0.2.0", + "gloo-worker-macros", + "js-sys", + "pinned", + "serde", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085f262d7604911c8150162529cefab3782e91adb20202e8658f7275d2aefe5d" +dependencies = [ + "bincode", + "futures", + "gloo-utils 0.2.0", + "gloo-worker-macros", + "js-sys", + "pinned", + "serde", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-worker-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956caa58d4857bc9941749d55e4bd3000032d8212762586fa5705632967140e7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64", + "bytes", + "headers-core", + "http 1.3.1", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http 1.3.1", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin", + "stable_deref_trait", +] + +[[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.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[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 1.3.1", +] + +[[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 1.3.1", + "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 = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http 1.3.1", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "implicit-clone" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a9aa791c7b5a71b636b7a68207fdebf171ddfc593d9c8506ec4cbc527b6a84" +dependencies = [ + "implicit-clone-derive", + "indexmap", +] + +[[package]] +name = "implicit-clone-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "699c1b6d335e63d0ba5c1e1c7f647371ce989c3bcbe1f7ed2b85fa56e3bd1a21" +dependencies = [ + "quote", + "syn 2.0.107", +] + +[[package]] +name = "indexmap" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.59.0", +] + +[[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.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime-sniffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b8b2a64cd735f1d5f17ff6701ced3cc3c54851f9448caf454cd9c923d812408" +dependencies = [ + "mime", + "url", +] + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[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-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "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.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[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.107", +] + +[[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 = "pinned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a829027bd95e54cfe13e3e258a1ae7b645960553fb82b75ff852c29688ee595b" +dependencies = [ + "futures", + "rustversion", + "thiserror 1.0.69", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[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 = "plan" +version = "0.1.0" +dependencies = [ + "chrono", + "chrono-humanize", + "ciborium", + "futures", + "gloo 0.11.0", + "instant", + "log", + "once_cell", + "plan-proto", + "postcard", + "serde", + "thiserror 2.0.17", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-logger", + "web-sys", + "yew", + "yew-router", +] + +[[package]] +name = "plan-macros" +version = "0.1.0" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "plan-proto" +version = "0.1.0" +dependencies = [ + "argon2", + "axum", + "axum-extra", + "bytes", + "chrono", + "ciborium", + "log", + "serde", + "sqlx", + "thiserror 2.0.17", + "uuid", +] + +[[package]] +name = "plan-server" +version = "0.1.0" +dependencies = [ + "anyhow", + "argon2", + "axum", + "axum-extra", + "axum-limit", + "chrono", + "ciborium", + "colored", + "futures", + "log", + "mime-sniffer", + "plan-macros", + "plan-proto", + "pretty_env_logger", + "rand 0.9.2", + "serde", + "serde_json", + "sqlx", + "thiserror 2.0.17", + "tokio", + "tower", + "tower-http", + "uuid", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "heapless", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.107", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prokio" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b55e106e5791fa5a13abd13c85d6127312e8e09098059ca2bc9b03ca4cf488" +dependencies = [ + "futures", + "gloo 0.8.1", + "num_cpus", + "once_cell", + "pin-project", + "pinned", + "tokio", + "tokio-stream", + "wasm-bindgen-futures", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[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", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[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.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[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 = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.17", + "tokio", + "tokio-stream", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.107", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.107", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.17", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[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", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[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.107", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[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", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[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", + "tokio-stream", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "http 1.3.1", + "pin-project-lite", + "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 = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror 2.0.17", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[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.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[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 = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.107", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-logger" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074649a66bb306c8f2068c9016395fa65d8e08d2affcbf95acf3c24c3ab19718" +dependencies = [ + "log", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[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-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yew" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f1a03f255c70c7aa3e9c62e15292f142ede0564123543c1cc0c7a4f31660cac" +dependencies = [ + "console_error_panic_hook", + "futures", + "gloo 0.10.0", + "implicit-clone", + "indexmap", + "js-sys", + "prokio", + "rustversion", + "serde", + "slab", + "thiserror 1.0.69", + "tokio", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "yew-macro", +] + +[[package]] +name = "yew-macro" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fd8ca5166d69e59f796500a2ce432ff751edecbbb308ca59fd3fe4d0343de2" +dependencies = [ + "boolinator", + "once_cell", + "prettyplease", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "yew-router" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca1d5052c96e6762b4d6209a8aded597758d442e6c479995faf0c7b5538e0c6" +dependencies = [ + "gloo 0.10.0", + "js-sys", + "route-recognizer", + "serde", + "serde_urlencoded", + "tracing", + "urlencoding", + "wasm-bindgen", + "web-sys", + "yew", + "yew-router-macro", +] + +[[package]] +name = "yew-router-macro" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42bfd190a07ca8cfde7cd4c52b3ac463803dc07323db8c34daa697e86365978c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[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.107", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..2e11071 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +resolver = "3" +members = ["plan", "plan-proto", "plan-server", "plan-macros"] diff --git a/migrations/1_init.sql b/migrations/1_init.sql new file mode 100644 index 0000000..1166cae --- /dev/null +++ b/migrations/1_init.sql @@ -0,0 +1,113 @@ +drop table if exists users cascade; +create table users ( + id uuid not null default gen_random_uuid() primary key, + name text, + username text not null, + password_hash text not null, + + created_at timestamp with time zone not null, + updated_at timestamp with time zone not null, + + check (created_at <= updated_at) +); +drop index if exists users_username_idx; +create index users_username_idx on users (username); +drop index if exists users_username_unique; +create unique index users_username_unique on users (lower(username)); + +drop table if exists plans cascade; +create table plans ( + id uuid not null default gen_random_uuid() primary key, + title text, + created_by uuid not null references users(id), + start_time timestamp with time zone not null, + + created_at timestamp with time zone not null, + updated_at timestamp with time zone not null, + + check (created_at <= updated_at) +); + +drop type if exists half_hour cascade; +create type half_hour as enum ( + 'Hour0Min0', + 'Hour0Min30', + 'Hour1Min0', + 'Hour1Min30', + 'Hour2Min0', + 'Hour2Min30', + 'Hour3Min0', + 'Hour3Min30', + 'Hour4Min0', + 'Hour4Min30', + 'Hour5Min0', + 'Hour5Min30', + 'Hour6Min0', + 'Hour6Min30', + 'Hour7Min0', + 'Hour7Min30', + 'Hour8Min0', + 'Hour8Min30', + 'Hour9Min0', + 'Hour9Min30', + 'Hour10Min0', + 'Hour10Min30', + 'Hour11Min0', + 'Hour11Min30', + 'Hour12Min0', + 'Hour12Min30', + 'Hour13Min0', + 'Hour13Min30', + 'Hour14Min0', + 'Hour14Min30', + 'Hour15Min0', + 'Hour15Min30', + 'Hour16Min0', + 'Hour16Min30', + 'Hour17Min0', + 'Hour17Min30', + 'Hour18Min0', + 'Hour18Min30', + 'Hour19Min0', + 'Hour19Min30', + 'Hour20Min0', + 'Hour20Min30', + 'Hour21Min0', + 'Hour21Min30', + 'Hour22Min0', + 'Hour22Min30', + 'Hour23Min0', + 'Hour23Min30' +); + +drop table if exists plan_days cascade; +create table plan_days ( + id uuid not null default gen_random_uuid() primary key, + plan_id uuid not null references plans(id), + day_offset smallint not null, + day_start half_hour not null, + day_end half_hour not null, + + check (day_offset >= 0), + unique(plan_id, day_offset) +); + +drop table if exists day_tiles cascade; +create table day_tiles ( + day_id uuid not null references plan_days(id), + user_id uuid not null references users(id), + tiles half_hour[] not null, + updated_at timestamp with time zone not null default now(), + + unique(day_id, user_id) +); + +drop table if exists login_tokens cascade; +create table login_tokens ( + token text not null primary key, + user_id uuid not null references users(id), + created_at timestamp with time zone not null, + expires_at timestamp with time zone not null, + + check (created_at < expires_at) +); diff --git a/pkg/plan.service b/pkg/plan.service new file mode 100644 index 0000000..76cbe32 --- /dev/null +++ b/pkg/plan.service @@ -0,0 +1,19 @@ +[Unit] +Description=group plan +After=network.target + +[Service] +Type=simple + +User=plan +Group=plan + +WorkingDirectory=/home/plan +Environment=RUST_LOG=info +Environment=PORT=3028 +ExecStart=/home/plan/plan-server + +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/plan-macros/Cargo.toml b/plan-macros/Cargo.toml new file mode 100644 index 0000000..04d5ef5 --- /dev/null +++ b/plan-macros/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "plan-macros" +version = "0.1.0" +edition = "2024" + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = "1" +quote = "1" +syn = { version = "2", features = ["full", "extra-traits"] } +convert_case = { version = "0.8" } diff --git a/plan-macros/src/hashlist.rs b/plan-macros/src/hashlist.rs new file mode 100644 index 0000000..7a0c72a --- /dev/null +++ b/plan-macros/src/hashlist.rs @@ -0,0 +1,36 @@ +use std::collections::HashMap; +use std::hash::Hash; + +pub struct HashList(HashMap>); + +impl core::fmt::Debug for HashList { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("HashList").field(&self.0).finish() + } +} + +impl Clone for HashList { + fn clone(&self) -> Self { + Self(self.0.clone()) + } +} + +impl HashList { + pub fn new() -> Self { + Self(HashMap::new()) + } + + pub fn add(&mut self, key: K, value: V) { + match self.0.get_mut(&key) { + Some(values) => values.push(value), + None => { + self.0.insert(key, vec![value]); + } + } + } + pub fn decompose(&mut self) -> Box<[(K, Vec)]> { + let mut body = HashMap::new(); + core::mem::swap(&mut self.0, &mut body); + body.into_iter().collect() + } +} diff --git a/plan-macros/src/lib.rs b/plan-macros/src/lib.rs new file mode 100644 index 0000000..9d1ce82 --- /dev/null +++ b/plan-macros/src/lib.rs @@ -0,0 +1,491 @@ +use core::error::Error; +use std::{ + io, + path::{Path, PathBuf}, +}; + +use convert_case::Casing; +use proc_macro2::Span; +use quote::{ToTokens, quote}; +use syn::{parse::Parse, parse_macro_input}; + +pub(crate) mod hashlist; +mod targets; + +struct IncludePath { + dir_path: PathBuf, + modules: Vec, +} + +fn display_err(span: Span, err: impl Error) -> syn::Error { + syn::Error::new(span, err.to_string().as_str()) +} + +fn read_modules(span: Span, path: &Path) -> syn::Result> { + let read_dir = std::fs::read_dir(path).map_err(|err| display_err(span, err))?; + + Ok(read_dir + .map(|file| file.map_err(|err| display_err(span, err))) + .collect::, _>>()? + .into_iter() + .filter(|file| file.file_type().map(|ft| ft.is_file()).unwrap_or_default()) + .filter_map(|file| { + file.file_name() + .to_string_lossy() + .strip_suffix(".rs") + .map(|f| f.to_string()) + }) + .map(|module_name| syn::Ident::new(&module_name, span)) + .collect::>()) +} + +impl Parse for IncludePath { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + let directory = input.parse::()?; + + let dir_path = std::env::current_dir() + .unwrap() + .join(directory.value()) + .to_path_buf(); + + let modules = read_modules(directory.span(), &dir_path)?; + + Ok(Self { modules, dir_path }) + } +} +impl IncludePath { + fn migrations_tokens(&self) -> proc_macro2::TokenStream { + let dir = std::fs::read_dir(&self.dir_path).unwrap(); + let mut files = dir + .into_iter() + .filter_map(|d| { + d.ok().and_then(|d| { + d.file_name() + .to_string_lossy() + .ends_with(".sql") + .then_some(d.path()) + }) + }) + .map(|path| { + let timestamp = path + .file_name() + .unwrap() + .to_string_lossy() + .split_once('.') + .and_then(|c| c.0.parse::().ok()); + match timestamp { + Some(ts) => Ok((ts, path)), + None => Err(syn::Error::new( + Span::call_site(), + format!("migration at [{path:?}] doesn't have a valid timestamp").as_str(), + )), + } + }) + .collect::, syn::Error>>() + .unwrap(); + files.sort_by_key(|f| f.0); + let migrations_len = files.len(); + let includes = files.into_iter().map(|(_, path)| { + let path = path.to_str().unwrap(); + quote! { + include_str!(#path), + } + }); + quote! { + const MIGRATIONS: [&'static str, #migrations_len] = [ + #(#includes)* + ]; + } + } + fn posts_tokens(&self) -> proc_macro2::TokenStream { + let mod_decl = self.modules.iter().map(|module| { + let path = self.dir_path.join(format!("{module}.rs")); + let path = path.to_str().unwrap(); + quote! { + mod #module { + include!(#path); + }} + }); + let posts = self.modules.iter().map(|module| { + quote! { + #module::POST.into_post() + } + }); + + quote! { + #(#mod_decl)* + + pub const POSTS: &[Post] = &[#(#posts),*]; + } + } + fn normal_tokens(&self) -> proc_macro2::TokenStream { + let mod_decl = self.modules.iter().map(|module| { + quote! {mod #module;} + }); + let pub_use = self.modules.iter().map(|module| { + quote! { + #module::* + } + }); + + quote! { + #(#mod_decl)* + pub use {#(#pub_use),*}; + } + } +} +enum IncludeOutput { + Normal(IncludePath), + Posts(IncludePath), + Migrations(IncludePath), +} + +impl ToTokens for IncludeOutput { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + tokens.extend(match self { + IncludeOutput::Normal(include_path) => include_path.normal_tokens(), + IncludeOutput::Posts(include_path) => include_path.posts_tokens(), + IncludeOutput::Migrations(include_path) => include_path.migrations_tokens(), + }); + } +} + +struct FileWithPath { + // bytes: Vec, + include: proc_macro2::TokenStream, + rel_path: String, +} +impl FileWithPath { + fn from_path(path: impl AsRef, origin_path: impl AsRef) -> Result { + let abs_path = path + .as_ref() + .canonicalize() + .ok() + .and_then(|p| p.to_str().map(|t| t.to_string())) + .ok_or(io::Error::new(io::ErrorKind::InvalidData, "invalid path"))?; + let include = quote! { + include_bytes!(#abs_path) + }; + let origin_abs = origin_path.as_ref().canonicalize().and_then(|p| { + p.to_str() + .ok_or(io::Error::new(io::ErrorKind::InvalidData, "invalid path")) + .map(|t| t.to_string()) + })?; + let rel_path = abs_path.replace(&origin_abs, ""); + + Ok(Self { include, rel_path }) + } +} + +fn find_matching_files_recursive( + p: P, + include_in_rerun: F, + directory_filter: D, + out: &mut Vec, + origin_path: &PathBuf, +) -> Result<(), io::Error> +where + P: AsRef, + F: Fn(&str) -> bool + Copy, + D: Fn(&str) -> bool + Copy, +{ + for item in std::fs::read_dir(p.as_ref())? { + let item = item?; + if item.file_type()?.is_dir() { + if directory_filter(item.file_name().to_str().ok_or(io::Error::new( + io::ErrorKind::InvalidData, + "file has no name", + ))?) { + find_matching_files_recursive( + item.path(), + include_in_rerun, + directory_filter, + out, + origin_path, + )?; + } + continue; + } + if let Some(file_name) = item.file_name().to_str() + && include_in_rerun(file_name) + { + out.push(FileWithPath::from_path(item.path(), origin_path)?); + } + } + + Ok(()) +} + +struct IncludeDist { + name: syn::Ident, + files: Vec, +} + +impl IncludeDist { + fn read_dist_path( + name: syn::Ident, + path_span: Span, + path: &Path, + origin_path: &PathBuf, + ) -> syn::Result { + let mut files = Vec::new(); + find_matching_files_recursive(path, |_| true, |_| true, &mut files, origin_path) + .map_err(|err| syn::Error::new(path_span, err.to_string()))?; + Ok(Self { name, files }) + } +} + +impl Parse for IncludeDist { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + let name = input.parse::()?; + input.parse::()?; + let directory = input.parse::()?; + + let dir_path = std::env::current_dir() + .unwrap() + .join(directory.value()) + .to_path_buf(); + + Self::read_dist_path(name, directory.span(), &dir_path, &dir_path) + } +} + +impl ToTokens for IncludeDist { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + // std::collections::HashMap + let array_contents = self.files.iter().map(|file| { + let FileWithPath { include, rel_path } = file; + + quote! { + (#rel_path, #include) + } + }); + let name = &self.name; + tokens.extend(quote! { + pub const #name: &[(&'static str, &'static [u8])] = &[#(#array_contents),*]; + }); + } +} + +struct StaticLinks { + collect_into_const: Option, + relative_to: PathBuf, + files: Vec<(String, PathBuf)>, +} + +impl Parse for StaticLinks { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + let collect_into_const = if input.peek(syn::Ident) { + let out = Some(input.parse()?); + input.parse::]>()?; + out + } else { + None + }; + const EXPECTED: &str = "expected 'relative to'"; + let directory = input.parse::()?; + { + let rel = input + .parse::() + .map_err(|err| syn::Error::new(err.span(), EXPECTED))?; + if rel != "relative" { + return Err(syn::Error::new(rel.span(), EXPECTED)); + } + } + { + let to = input + .parse::() + .map_err(|err| syn::Error::new(err.span(), EXPECTED))?; + if to != "to" { + return Err(syn::Error::new(to.span(), EXPECTED)); + } + } + let current_dir = std::env::current_dir().unwrap(); + let relative_to = current_dir + .join(input.parse::()?.value()) + .canonicalize() + .expect("cannonicalize relative to path"); + + let span = directory.span(); + + let path_dir = current_dir + .join(directory.value()) + .canonicalize() + .expect("canonicalize base path") + .to_path_buf(); + + let read_dir = std::fs::read_dir(&path_dir).map_err(|err| display_err(span, err))?; + + let files = read_dir + .map(|file| file.map_err(|err| display_err(span, err))) + .collect::, _>>()? + .into_iter() + .filter(|file| file.file_type().map(|ft| ft.is_file()).unwrap_or_default()) + .map(|file| { + ( + file.file_name().to_str().expect("bad filename").to_string(), + file.path(), + ) + }) + .collect::>(); + Ok(StaticLinks { + collect_into_const, + relative_to, + files, + }) + } +} + +impl ToTokens for StaticLinks { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let base_path = self.relative_to.to_str().expect("base path to_string"); + let ident_with_decl = self.files.iter().map(|(file, path)| { + let file_ident = syn::Ident::new( + file.replace(['.', ' ', '-'], "_").to_uppercase().as_str(), + Span::call_site(), + ); + let filepath = path + .to_str() + .expect("path to string") + .replace(base_path, ""); + let decl = quote! { + pub const #file_ident: &'static str = #filepath; + }; + (file_ident, decl) + }); + let files = ident_with_decl.clone().map(|(_, q)| q); + + tokens.extend(quote! { + #(#files)* + }); + if let Some(collect_into_const) = &self.collect_into_const { + let idents = ident_with_decl.map(|(ident, _)| ident); + tokens.extend(quote! { + pub const #collect_into_const: &[&str] = &[#(#idents),*]; + }); + } + } +} + +impl StaticLinks { + fn into_demand_metadata(self) -> StaticLinksDemandMetadata { + let StaticLinks { + collect_into_const, + relative_to, + files, + } = self; + StaticLinksDemandMetadata { + collect_into_const, + relative_to, + files, + } + } +} + +struct StaticLinksDemandMetadata { + collect_into_const: Option, + relative_to: PathBuf, + files: Vec<(String, PathBuf)>, +} + +impl ToTokens for StaticLinksDemandMetadata { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let base_path = self.relative_to.to_str().expect("base path to_string"); + let ident_with_decl = self.files.iter().map(|(file, path)| { + let file_ident = syn::Ident::new( + file.replace(['.', ' ', '-'], "_").to_uppercase().as_str(), + Span::call_site(), + ); + let filepath = path + .to_str() + .expect("path to string") + .replace(base_path, ""); + let decl = quote! { + pub const #file_ident: &'static str = #filepath; + }; + (file_ident, filepath, decl) + }); + let files = ident_with_decl.clone().map(|(_, _, q)| q); + + tokens.extend(quote! { + #(#files)* + }); + if let Some(collect_into_const) = &self.collect_into_const { + let idents = ident_with_decl.clone().map(|(ident, _, _)| ident); + tokens.extend(quote! { + pub const #collect_into_const: &[&str] = &[#(#idents),*]; + }); + } + + let (paths_and_snake_idents, members): (Vec<_>, Vec<_>) = ident_with_decl + .clone() + .map(|(i, filepath, _)| { + let snake_ident = syn::Ident::new( + i.to_string().to_case(convert_case::Case::Snake).as_str(), + i.span(), + ); + let member = quote! { + pub #snake_ident: Metadata, + }; + ((filepath, snake_ident), member) + }) + .unzip(); + + let find_by_key = paths_and_snake_idents.iter().map(|(path, ident)| { + quote! { + #path => &self.#ident + } + }); + + tokens.extend(quote! { + pub struct MetadataMap { + #(#members)* + } + + impl MetadataMap { + pub fn find_by_key(&self, key: &str) -> Option<&Metadata> { + Some(match key { + #(#find_by_key,)* + _ => return None, + }) + } + } + }); + } +} + +#[proc_macro] +pub fn include_dist(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let incl_dist = parse_macro_input!(input as IncludeDist); + quote! {#incl_dist}.into() +} + +#[proc_macro] +pub fn posts(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let pubuse = IncludeOutput::Posts(parse_macro_input!(input as IncludePath)); + quote! {#pubuse}.into() +} + +#[proc_macro] +pub fn include_path(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let incl_path = IncludeOutput::Normal(parse_macro_input!(input as IncludePath)); + quote! {#incl_path}.into() +} + +#[proc_macro] +pub fn static_links(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let static_links = parse_macro_input!(input as StaticLinks); + quote! {#static_links}.into() +} + +#[proc_macro] +pub fn static_links_demand_metadata(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let demand_metadata = parse_macro_input!(input as StaticLinks).into_demand_metadata(); + quote! {#demand_metadata}.into() +} + +#[proc_macro] +pub fn migrations(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let incl_path = IncludeOutput::Migrations(parse_macro_input!(input as IncludePath)); + quote! {#incl_path}.into() +} diff --git a/plan-macros/src/targets.rs b/plan-macros/src/targets.rs new file mode 100644 index 0000000..7d53820 --- /dev/null +++ b/plan-macros/src/targets.rs @@ -0,0 +1,294 @@ +use convert_case::{Case, Casing}; +use proc_macro2::TokenStream; +use quote::{ToTokens, quote, quote_spanned}; +use syn::spanned::Spanned; + +use crate::hashlist::HashList; + +const TARGETS_PATH: &str = "extract"; + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +enum VariantFieldIndex { + Ident(syn::Ident), + Numeric(syn::LitInt), + None, +} + +impl syn::parse::Parse for VariantFieldIndex { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + if input.is_empty() { + Ok(VariantFieldIndex::None) + } else if input.peek(syn::LitInt) { + Ok(VariantFieldIndex::Numeric(input.parse()?)) + } else { + Ok(VariantFieldIndex::Ident(input.parse()?)) + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +struct VariantAttr { + index: VariantFieldIndex, + alias: Option, +} + +impl syn::parse::Parse for VariantAttr { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + let index = if input.peek(syn::token::As) { + VariantFieldIndex::None + } else { + input.parse::()? + }; + if !input.peek(syn::token::As) { + return Ok(Self { index, alias: None }); + } + input.parse::()?; + + Ok(Self { + index, + alias: Some(input.parse()?), + }) + } +} + +#[derive(Debug, Clone)] +struct TargetVariant { + attr: VariantAttr, + access: TokenStream, + ty: syn::Type, + variant: syn::Variant, +} + +impl TargetVariant { + fn name(&self) -> syn::Ident { + if let Some(alias) = self.attr.alias.as_ref() { + return alias.clone(); + } + match &self.attr.index { + VariantFieldIndex::Ident(ident) => ident.clone(), + VariantFieldIndex::Numeric(_) | VariantFieldIndex::None => self.variant.ident.clone(), + } + } +} + +#[derive(Debug)] +pub struct Targets { + name: syn::Ident, + targets: Vec, + total_fields: usize, +} + +impl Targets { + pub fn parse(input: syn::DeriveInput) -> Result { + let name = input.ident; + let mut targets: Vec = Vec::new(); + let total_fields; + match &input.data { + syn::Data::Enum(data) => { + total_fields = data.variants.len(); + for field in data.variants.iter() { + let field_ident = &field.ident; + for attr in field.attrs.iter().filter(|attr| { + attr.path() + .get_ident() + .map(|id| id.to_string().as_str() == TARGETS_PATH) + .unwrap_or_default() + }) { + let attr_span = attr.span(); + let attr = attr.parse_args::()?; + let (access, ty) = match &field.fields { + syn::Fields::Named(fields) => match &attr.index { + VariantFieldIndex::Ident(ident) => { + let mut matching_val = None; + let mut accesses = Vec::new(); + for field in fields.named.iter() { + let matching = field + .ident + .as_ref() + .map(|i| i == ident) + .unwrap_or_default(); + if matching_val.is_some() && matching { + panic!("duplicate?") + } + + let ident = field.ident.clone().unwrap(); + if matching { + matching_val = Some((ident.clone(), field.ty.clone())); + accesses.push(quote! { + #ident + }); + } else { + accesses.push(quote! { + #ident: _ + }); + } + } + let (mut matching_ident, matching_ty) = matching_val.ok_or( + syn::Error::new(ident.span(), "no such variant field"), + )?; + matching_ident.set_span(ident.span()); + + ( + quote! { + #name::#field_ident { #(#accesses),* } => &#matching_ident, + }, + matching_ty, + ) + } + + VariantFieldIndex::Numeric(num) => { + return Err(syn::Error::new( + num.span(), + "cannot used numeric index for a variant with named fields", + )); + } + VariantFieldIndex::None => { + if fields.named.len() == 1 { + let field = fields.named.iter().next().unwrap(); + let field_ident = field.ident.as_ref().unwrap(); + ( + quote! { + #name::#field_ident { #field_ident } => &#field_ident, + }, + field.ty.clone(), + ) + } else { + return Err(syn::Error::new( + fields.named.span(), + "unnamed field index with more than one field", + )); + } + } + }, + syn::Fields::Unnamed(fields) => { + if let VariantFieldIndex::Numeric(num) = &attr.index { + let num = num.base10_parse::()? as usize; + let field = fields + .unnamed + .iter() + .nth(num) + .ok_or(syn::Error::new( + attr_span, + "field index out of range", + ))? + .clone(); + let left = (0..num).map(|_| quote! {_}); + let right = (num..fields.unnamed.len()).map(|_| quote! {_}); + ( + quote! { + #name::#field_ident(#(#left),*, val, #(#right),*) => &val, + }, + field.ty.clone(), + ) + } else if fields.unnamed.len() == 1 { + ( + quote! { + #name::#field_ident(val) => &val, + }, + fields.unnamed.iter().next().unwrap().ty.clone(), + ) + } else { + return Err(syn::Error::new( + fields.span(), + "unnamed fields without numeric index", + )); + } + } + syn::Fields::Unit => { + return Err(syn::Error::new( + field.span(), + "target cannot be a unit field", + )); + } + }; + let target = TargetVariant { + attr, + ty, + access, + variant: field.clone(), + }; + // if targets.iter().any(|t| t.name() == target.name()) { + // return Err(syn::Error::new(attr_span, "duplicate target field")); + // } + // target.variant.ident.set_span(attr_span); + + targets.push(target); + } + } + } + + _ => todo!(), + }; + + Ok(Self { + name, + targets, + total_fields, + }) + } +} + +impl ToTokens for Targets { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + // this is so horrid and haphazard but idc rn + // commenting to make the criticizing voice stfu + let mut by_target = { + let mut out = HashList::new(); + for target in self.targets.iter() { + out.add(target.name().to_string(), target.clone()); + } + out + }; + let fns = by_target.decompose().into_iter().map(|(_, targets)| { + if targets.is_empty() { + return quote! {}; + } + let all_variants = targets.len() == self.total_fields; + let fn_ret = { + let ty = targets.first().unwrap().ty.clone(); + if all_variants { + quote! {&#ty} + } else { + quote! {Option<&#ty>} + } + }; + let fn_name = { + let name = targets.first().unwrap().name(); + syn::Ident::new(name.to_string().to_case(Case::Snake).as_str(), name.span()) + }; + let raw_accesses = targets.iter().map(|t| { + let access = &t.access; + + quote_spanned! { t.attr.alias.as_ref().unwrap().span() => + #access + } + }); + let accesses = if all_variants { + quote! { + match self { + #(#raw_accesses)* + } + } + } else { + quote! { + Some(match self { + #(#raw_accesses)* + _ => return None, + }) + } + }; + + quote! { + pub const fn #fn_name(&self) -> #fn_ret { + #accesses + } + } + }); + let name = &self.name; + tokens.extend(quote! { + impl #name { + #(#fns)* + } + }); + } +} diff --git a/plan-proto/Cargo.toml b/plan-proto/Cargo.toml new file mode 100644 index 0000000..f132b9d --- /dev/null +++ b/plan-proto/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "plan-proto" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = { version = "1", features = ["derive"] } +chrono = { version = "0.4", features = ["serde"] } +thiserror = { version = "2" } +axum = { version = "*", optional = true } +argon2 = { version = "*", optional = true } +sqlx = { version = "*", optional = true } +ciborium = { version = "*", optional = true } +bytes = { version = "1.10.1", features = ["serde"], optional = true } +axum-extra = { version = "*", optional = true } +uuid = { version = "1", features = ["serde", "v4"] } +log = { version = "0.4", optional = true } + +[features] +server = [ + "dep:axum", + "dep:sqlx", + "dep:argon2", + "dep:ciborium", + "dep:bytes", + "dep:axum-extra", + "dep:log", +] +client = ["uuid/js"] diff --git a/plan-proto/src/cbor.rs b/plan-proto/src/cbor.rs new file mode 100644 index 0000000..ef47f39 --- /dev/null +++ b/plan-proto/src/cbor.rs @@ -0,0 +1,156 @@ +use axum::{ + body::Bytes, + extract::{FromRequest, Request, rejection::BytesRejection}, + http::{HeaderMap, HeaderValue, StatusCode, header}, + response::{IntoResponse, Response}, +}; +use axum_extra::headers::Mime; +use bytes::{BufMut, BytesMut}; +use core::fmt::Display; +use serde::{Serialize, de::DeserializeOwned}; + +const CBOR_CONTENT_TYPE: &str = "application/cbor"; +const PLAIN_CONTENT_TYPE: &str = "text/plain"; + +#[must_use] +pub struct Cbor(pub T); + +impl Cbor { + pub const fn new(t: T) -> Self { + Self(t) + } +} + +impl FromRequest for Cbor +where + T: DeserializeOwned, + S: Send + Sync, +{ + type Rejection = CborRejection; + + async fn from_request(req: Request, state: &S) -> Result { + if !cbor_content_type(req.headers()) { + return Err(CborRejection::MissingCborContentType); + } + + let bytes = Bytes::from_request(req, state).await?; + Ok(Self(ciborium::from_reader::(&*bytes)?)) + } +} + +impl IntoResponse for Cbor +where + T: Serialize, +{ + fn into_response(self) -> axum::response::Response { + // Extracted into separate fn so it's only compiled once for all T. + fn make_response(buf: BytesMut, ser_result: Result<(), CborRejection>) -> Response { + match ser_result { + Ok(()) => ( + [( + header::CONTENT_TYPE, + HeaderValue::from_static("application/cbor"), + )], + buf.freeze(), + ) + .into_response(), + Err(err) => err.into_response(), + } + } + + // Use a small initial capacity of 128 bytes like serde_json::to_vec + // https://docs.rs/serde_json/1.0.82/src/serde_json/ser.rs.html#2189 + let mut buf = BytesMut::with_capacity(128).writer(); + let res = ciborium::into_writer(&self.0, &mut buf) + .map_err(|err| CborRejection::SerdeRejection(err.to_string())); + make_response(buf.into_inner(), res) + } +} + +#[derive(Debug)] +pub enum CborRejection { + MissingCborContentType, + BytesRejection(BytesRejection), + DeserializeRejection(String), + SerdeRejection(String), +} +impl From> for CborRejection { + fn from(value: ciborium::de::Error) -> Self { + Self::SerdeRejection(match value { + ciborium::de::Error::Io(err) => format!("i/o: {err}"), + ciborium::de::Error::Syntax(offset) => format!("syntax error at {offset}"), + ciborium::de::Error::Semantic(offset, err) => format!( + "semantic parse: {err}{}", + offset + .map(|offset| format!(" at {offset}")) + .unwrap_or_default(), + ), + ciborium::de::Error::RecursionLimitExceeded => { + String::from("the input caused serde to recurse too much") + } + }) + } +} + +impl From for CborRejection { + fn from(value: BytesRejection) -> Self { + Self::BytesRejection(value) + } +} + +impl IntoResponse for CborRejection { + fn into_response(self) -> axum::response::Response { + match self { + CborRejection::MissingCborContentType => ( + StatusCode::BAD_REQUEST, + [( + header::CONTENT_TYPE, + HeaderValue::from_static(PLAIN_CONTENT_TYPE), + )], + String::from("missing cbor content type"), + ), + CborRejection::BytesRejection(err) => ( + err.status(), + [( + header::CONTENT_TYPE, + HeaderValue::from_static(PLAIN_CONTENT_TYPE), + )], + format!("bytes rejection: {}", err.body_text()), + ), + CborRejection::SerdeRejection(err) => ( + StatusCode::BAD_REQUEST, + [( + header::CONTENT_TYPE, + HeaderValue::from_static(PLAIN_CONTENT_TYPE), + )], + err, + ), + CborRejection::DeserializeRejection(err) => ( + StatusCode::INTERNAL_SERVER_ERROR, + [( + header::CONTENT_TYPE, + HeaderValue::from_static(PLAIN_CONTENT_TYPE), + )], + err, + ), + } + .into_response() + } +} + +fn cbor_content_type(headers: &HeaderMap) -> bool { + let Some(content_type) = headers.get(header::CONTENT_TYPE) else { + return false; + }; + + let Ok(content_type) = content_type.to_str() else { + return false; + }; + + let Ok(mime) = content_type.parse::() else { + return false; + }; + + mime.type_() == "application" + && (mime.subtype() == "cbor" || mime.suffix().is_some_and(|name| name == "cbor")) +} diff --git a/plan-proto/src/error.rs b/plan-proto/src/error.rs new file mode 100644 index 0000000..5a819ed --- /dev/null +++ b/plan-proto/src/error.rs @@ -0,0 +1,148 @@ +use core::fmt::Display; + +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +use crate::plan::PlanError; + +#[derive(Debug, Clone, PartialEq, Error, Serialize, Deserialize)] +pub enum ServerError { + #[error("database error: {0}")] + DatabaseError(DatabaseError), + #[error("invalid credentials")] + InvalidCredentials, + #[error("token expired")] + ExpiredToken, + #[error("internal server error: {0}")] + InternalServerError(String), + #[error("connection error")] + ConnectionError, + #[error("invalid request: {0}")] + InvalidRequest(String), + #[error("not found")] + NotFound, +} + +impl> From for ServerError { + fn from(value: I) -> Self { + let database_err: DatabaseError = value.into(); + if let DatabaseError::NotFound = &database_err { + return Self::NotFound; + } + Self::DatabaseError(database_err) + } +} + +impl From for ServerError { + fn from(value: PlanError) -> Self { + Self::InvalidRequest(value.to_string()) + } +} + +#[cfg(feature = "server")] +impl From> for ServerError { + fn from(_: ciborium::de::Error) -> Self { + Self::InvalidRequest(String::from("could not decode request")) + } +} + +#[cfg(feature = "server")] +impl axum::response::IntoResponse for ServerError { + fn into_response(self) -> axum::response::Response { + use axum::http::StatusCode; + + use crate::cbor::Cbor; + + match self { + ServerError::ExpiredToken => { + (StatusCode::UNAUTHORIZED, Cbor(ServerError::ExpiredToken)).into_response() + } + ServerError::NotFound | ServerError::DatabaseError(DatabaseError::NotFound) => { + (StatusCode::NOT_FOUND, Cbor(ServerError::NotFound)).into_response() + } + ServerError::DatabaseError(DatabaseError::UserAlreadyExists) => ( + StatusCode::BAD_REQUEST, + Cbor(ServerError::InvalidRequest(String::from("username taken"))), + ) + .into_response(), + ServerError::DatabaseError(err) => { + use uuid::Uuid; + + let error_id = Uuid::new_v4(); + log::error!("database error[{error_id}]: {err}"); + + ( + StatusCode::INTERNAL_SERVER_ERROR, + Cbor(ServerError::InternalServerError(format!( + "internal server error. error id: {error_id}" + ))), + ) + .into_response() + } + ServerError::InvalidCredentials => ( + StatusCode::UNAUTHORIZED, + Cbor(ServerError::InvalidCredentials), + ) + .into_response(), + ServerError::InternalServerError(_) => { + (StatusCode::INTERNAL_SERVER_ERROR, Cbor(self)).into_response() + } + ServerError::ConnectionError => { + (StatusCode::BAD_REQUEST, Cbor(ServerError::ConnectionError)).into_response() + } + ServerError::InvalidRequest(reason) => ( + StatusCode::BAD_REQUEST, + Cbor(ServerError::InvalidRequest(reason)), + ) + .into_response(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Error, Serialize, Deserialize)] +pub enum DatabaseError { + #[error("user already exists")] + UserAlreadyExists, + #[error("password hashing error: {0}")] + PasswordHashError(String), + #[error("sqlx error: {0}")] + SqlxError(String), + #[error("not found")] + NotFound, +} + +#[cfg(feature = "server")] +impl axum::response::IntoResponse for DatabaseError { + fn into_response(self) -> axum::response::Response { + use axum::http::StatusCode; + + use crate::cbor::Cbor; + + ( + match self { + DatabaseError::UserAlreadyExists => StatusCode::BAD_REQUEST, + DatabaseError::NotFound => StatusCode::NOT_FOUND, + _ => StatusCode::INTERNAL_SERVER_ERROR, + }, + Cbor(self), + ) + .into_response() + } +} + +#[cfg(feature = "server")] +impl From for DatabaseError { + fn from(err: sqlx::Error) -> Self { + match err { + sqlx::Error::RowNotFound => Self::NotFound, + _ => Self::SqlxError(err.to_string()), + } + } +} + +#[cfg(feature = "server")] +impl From for DatabaseError { + fn from(err: argon2::password_hash::Error) -> Self { + Self::PasswordHashError(err.to_string()) + } +} diff --git a/plan-proto/src/lib.rs b/plan-proto/src/lib.rs new file mode 100644 index 0000000..2075244 --- /dev/null +++ b/plan-proto/src/lib.rs @@ -0,0 +1,465 @@ +#![feature(step_trait)] + +#[cfg(feature = "server")] +pub mod cbor; +pub mod error; +pub mod limited; +pub mod message; +pub mod plan; +pub mod token; +pub mod user; +use core::{fmt::Display, ops::RangeBounds}; + +use chrono::{DateTime, NaiveDate, NaiveTime, TimeZone, Timelike, Utc}; +use serde::{Deserialize, Serialize}; + +#[derive( + Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash, Default, +)] +#[cfg_attr(feature = "server", derive(sqlx::Type))] +#[cfg_attr(feature = "server", sqlx(type_name = "half_hour"))] +// #[derive( +// Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash, sqlx::Type, +// )] +// #[sqlx(type_name = "half_hour")] +pub enum HalfHour { + #[default] + Hour0Min0, + Hour0Min30, + Hour1Min0, + Hour1Min30, + Hour2Min0, + Hour2Min30, + Hour3Min0, + Hour3Min30, + Hour4Min0, + Hour4Min30, + Hour5Min0, + Hour5Min30, + Hour6Min0, + Hour6Min30, + Hour7Min0, + Hour7Min30, + Hour8Min0, + Hour8Min30, + Hour9Min0, + Hour9Min30, + Hour10Min0, + Hour10Min30, + Hour11Min0, + Hour11Min30, + Hour12Min0, + Hour12Min30, + Hour13Min0, + Hour13Min30, + Hour14Min0, + Hour14Min30, + Hour15Min0, + Hour15Min30, + Hour16Min0, + Hour16Min30, + Hour17Min0, + Hour17Min30, + Hour18Min0, + Hour18Min30, + Hour19Min0, + Hour19Min30, + Hour20Min0, + Hour20Min30, + Hour21Min0, + Hour21Min30, + Hour22Min0, + Hour22Min30, + Hour23Min0, + Hour23Min30, +} + +impl HalfHour { + pub const fn previous_half_hour(&self) -> HalfHour { + match self { + HalfHour::Hour0Min0 => Self::Hour23Min30, + HalfHour::Hour0Min30 => Self::Hour0Min0, + HalfHour::Hour1Min0 => Self::Hour0Min30, + HalfHour::Hour1Min30 => Self::Hour1Min0, + HalfHour::Hour2Min0 => Self::Hour1Min30, + HalfHour::Hour2Min30 => Self::Hour2Min0, + HalfHour::Hour3Min0 => Self::Hour2Min30, + HalfHour::Hour3Min30 => Self::Hour3Min0, + HalfHour::Hour4Min0 => Self::Hour3Min30, + HalfHour::Hour4Min30 => Self::Hour4Min0, + HalfHour::Hour5Min0 => Self::Hour4Min30, + HalfHour::Hour5Min30 => Self::Hour5Min0, + HalfHour::Hour6Min0 => Self::Hour5Min30, + HalfHour::Hour6Min30 => Self::Hour6Min0, + HalfHour::Hour7Min0 => Self::Hour6Min30, + HalfHour::Hour7Min30 => Self::Hour7Min0, + HalfHour::Hour8Min0 => Self::Hour7Min30, + HalfHour::Hour8Min30 => Self::Hour8Min0, + HalfHour::Hour9Min0 => Self::Hour8Min30, + HalfHour::Hour9Min30 => Self::Hour9Min0, + HalfHour::Hour10Min0 => Self::Hour9Min30, + HalfHour::Hour10Min30 => Self::Hour10Min0, + HalfHour::Hour11Min0 => Self::Hour10Min30, + HalfHour::Hour11Min30 => Self::Hour11Min0, + HalfHour::Hour12Min0 => Self::Hour11Min30, + HalfHour::Hour12Min30 => Self::Hour12Min0, + HalfHour::Hour13Min0 => Self::Hour12Min30, + HalfHour::Hour13Min30 => Self::Hour13Min0, + HalfHour::Hour14Min0 => Self::Hour13Min30, + HalfHour::Hour14Min30 => Self::Hour14Min0, + HalfHour::Hour15Min0 => Self::Hour14Min30, + HalfHour::Hour15Min30 => Self::Hour15Min0, + HalfHour::Hour16Min0 => Self::Hour15Min30, + HalfHour::Hour16Min30 => Self::Hour16Min0, + HalfHour::Hour17Min0 => Self::Hour16Min30, + HalfHour::Hour17Min30 => Self::Hour17Min0, + HalfHour::Hour18Min0 => Self::Hour17Min30, + HalfHour::Hour18Min30 => Self::Hour18Min0, + HalfHour::Hour19Min0 => Self::Hour18Min30, + HalfHour::Hour19Min30 => Self::Hour19Min0, + HalfHour::Hour20Min0 => Self::Hour19Min30, + HalfHour::Hour20Min30 => Self::Hour20Min0, + HalfHour::Hour21Min0 => Self::Hour20Min30, + HalfHour::Hour21Min30 => Self::Hour21Min0, + HalfHour::Hour22Min0 => Self::Hour21Min30, + HalfHour::Hour22Min30 => Self::Hour22Min0, + HalfHour::Hour23Min0 => Self::Hour22Min30, + HalfHour::Hour23Min30 => Self::Hour23Min0, + } + } + pub const fn next_half_hour(&self) -> HalfHour { + match self { + HalfHour::Hour0Min0 => Self::Hour0Min30, + HalfHour::Hour0Min30 => Self::Hour1Min0, + HalfHour::Hour1Min0 => Self::Hour1Min30, + HalfHour::Hour1Min30 => Self::Hour2Min0, + HalfHour::Hour2Min0 => Self::Hour2Min30, + HalfHour::Hour2Min30 => Self::Hour3Min0, + HalfHour::Hour3Min0 => Self::Hour3Min30, + HalfHour::Hour3Min30 => Self::Hour4Min0, + HalfHour::Hour4Min0 => Self::Hour4Min30, + HalfHour::Hour4Min30 => Self::Hour5Min0, + HalfHour::Hour5Min0 => Self::Hour5Min30, + HalfHour::Hour5Min30 => Self::Hour6Min0, + HalfHour::Hour6Min0 => Self::Hour6Min30, + HalfHour::Hour6Min30 => Self::Hour7Min0, + HalfHour::Hour7Min0 => Self::Hour7Min30, + HalfHour::Hour7Min30 => Self::Hour8Min0, + HalfHour::Hour8Min0 => Self::Hour8Min30, + HalfHour::Hour8Min30 => Self::Hour9Min0, + HalfHour::Hour9Min0 => Self::Hour9Min30, + HalfHour::Hour9Min30 => Self::Hour10Min0, + HalfHour::Hour10Min0 => Self::Hour10Min30, + HalfHour::Hour10Min30 => Self::Hour11Min0, + HalfHour::Hour11Min0 => Self::Hour11Min30, + HalfHour::Hour11Min30 => Self::Hour12Min0, + HalfHour::Hour12Min0 => Self::Hour12Min30, + HalfHour::Hour12Min30 => Self::Hour13Min0, + HalfHour::Hour13Min0 => Self::Hour13Min30, + HalfHour::Hour13Min30 => Self::Hour14Min0, + HalfHour::Hour14Min0 => Self::Hour14Min30, + HalfHour::Hour14Min30 => Self::Hour15Min0, + HalfHour::Hour15Min0 => Self::Hour15Min30, + HalfHour::Hour15Min30 => Self::Hour16Min0, + HalfHour::Hour16Min0 => Self::Hour16Min30, + HalfHour::Hour16Min30 => Self::Hour17Min0, + HalfHour::Hour17Min0 => Self::Hour17Min30, + HalfHour::Hour17Min30 => Self::Hour18Min0, + HalfHour::Hour18Min0 => Self::Hour18Min30, + HalfHour::Hour18Min30 => Self::Hour19Min0, + HalfHour::Hour19Min0 => Self::Hour19Min30, + HalfHour::Hour19Min30 => Self::Hour20Min0, + HalfHour::Hour20Min0 => Self::Hour20Min30, + HalfHour::Hour20Min30 => Self::Hour21Min0, + HalfHour::Hour21Min0 => Self::Hour21Min30, + HalfHour::Hour21Min30 => Self::Hour22Min0, + HalfHour::Hour22Min0 => Self::Hour22Min30, + HalfHour::Hour22Min30 => Self::Hour23Min0, + HalfHour::Hour23Min0 => Self::Hour23Min30, + HalfHour::Hour23Min30 => Self::Hour0Min0, + } + } +} + +impl From for chrono::NaiveTime { + fn from(value: HalfHour) -> Self { + match value { + HalfHour::Hour0Min0 => chrono::NaiveTime::from_hms_opt(0, 0, 0), + HalfHour::Hour0Min30 => chrono::NaiveTime::from_hms_opt(0, 30, 0), + HalfHour::Hour1Min0 => chrono::NaiveTime::from_hms_opt(1, 0, 0), + HalfHour::Hour1Min30 => chrono::NaiveTime::from_hms_opt(1, 30, 0), + HalfHour::Hour2Min0 => chrono::NaiveTime::from_hms_opt(2, 0, 0), + HalfHour::Hour2Min30 => chrono::NaiveTime::from_hms_opt(2, 30, 0), + HalfHour::Hour3Min0 => chrono::NaiveTime::from_hms_opt(3, 0, 0), + HalfHour::Hour3Min30 => chrono::NaiveTime::from_hms_opt(3, 30, 0), + HalfHour::Hour4Min0 => chrono::NaiveTime::from_hms_opt(4, 0, 0), + HalfHour::Hour4Min30 => chrono::NaiveTime::from_hms_opt(4, 30, 0), + HalfHour::Hour5Min0 => chrono::NaiveTime::from_hms_opt(5, 0, 0), + HalfHour::Hour5Min30 => chrono::NaiveTime::from_hms_opt(5, 30, 0), + HalfHour::Hour6Min0 => chrono::NaiveTime::from_hms_opt(6, 0, 0), + HalfHour::Hour6Min30 => chrono::NaiveTime::from_hms_opt(6, 30, 0), + HalfHour::Hour7Min0 => chrono::NaiveTime::from_hms_opt(7, 0, 0), + HalfHour::Hour7Min30 => chrono::NaiveTime::from_hms_opt(7, 30, 0), + HalfHour::Hour8Min0 => chrono::NaiveTime::from_hms_opt(8, 0, 0), + HalfHour::Hour8Min30 => chrono::NaiveTime::from_hms_opt(8, 30, 0), + HalfHour::Hour9Min0 => chrono::NaiveTime::from_hms_opt(9, 0, 0), + HalfHour::Hour9Min30 => chrono::NaiveTime::from_hms_opt(9, 30, 0), + HalfHour::Hour10Min0 => chrono::NaiveTime::from_hms_opt(10, 0, 0), + HalfHour::Hour10Min30 => chrono::NaiveTime::from_hms_opt(10, 30, 0), + HalfHour::Hour11Min0 => chrono::NaiveTime::from_hms_opt(11, 0, 0), + HalfHour::Hour11Min30 => chrono::NaiveTime::from_hms_opt(11, 30, 0), + HalfHour::Hour12Min0 => chrono::NaiveTime::from_hms_opt(12, 0, 0), + HalfHour::Hour12Min30 => chrono::NaiveTime::from_hms_opt(12, 30, 0), + HalfHour::Hour13Min0 => chrono::NaiveTime::from_hms_opt(13, 0, 0), + HalfHour::Hour13Min30 => chrono::NaiveTime::from_hms_opt(13, 30, 0), + HalfHour::Hour14Min0 => chrono::NaiveTime::from_hms_opt(14, 0, 0), + HalfHour::Hour14Min30 => chrono::NaiveTime::from_hms_opt(14, 30, 0), + HalfHour::Hour15Min0 => chrono::NaiveTime::from_hms_opt(15, 0, 0), + HalfHour::Hour15Min30 => chrono::NaiveTime::from_hms_opt(15, 30, 0), + HalfHour::Hour16Min0 => chrono::NaiveTime::from_hms_opt(16, 0, 0), + HalfHour::Hour16Min30 => chrono::NaiveTime::from_hms_opt(16, 30, 0), + HalfHour::Hour17Min0 => chrono::NaiveTime::from_hms_opt(17, 0, 0), + HalfHour::Hour17Min30 => chrono::NaiveTime::from_hms_opt(17, 30, 0), + HalfHour::Hour18Min0 => chrono::NaiveTime::from_hms_opt(18, 0, 0), + HalfHour::Hour18Min30 => chrono::NaiveTime::from_hms_opt(18, 30, 0), + HalfHour::Hour19Min0 => chrono::NaiveTime::from_hms_opt(19, 0, 0), + HalfHour::Hour19Min30 => chrono::NaiveTime::from_hms_opt(19, 30, 0), + HalfHour::Hour20Min0 => chrono::NaiveTime::from_hms_opt(20, 0, 0), + HalfHour::Hour20Min30 => chrono::NaiveTime::from_hms_opt(20, 30, 0), + HalfHour::Hour21Min0 => chrono::NaiveTime::from_hms_opt(21, 0, 0), + HalfHour::Hour21Min30 => chrono::NaiveTime::from_hms_opt(21, 30, 0), + HalfHour::Hour22Min0 => chrono::NaiveTime::from_hms_opt(22, 0, 0), + HalfHour::Hour22Min30 => chrono::NaiveTime::from_hms_opt(22, 30, 0), + HalfHour::Hour23Min0 => chrono::NaiveTime::from_hms_opt(23, 0, 0), + HalfHour::Hour23Min30 => chrono::NaiveTime::from_hms_opt(23, 30, 0), + } + .unwrap() + } +} + +impl std::iter::Step for HalfHour { + fn steps_between(start: &Self, end: &Self) -> (usize, Option) { + let mut steps = 0usize; + let mut start = *start; + while start != *end { + steps += 1; + start = start.next_half_hour(); + } + + (steps, Some(steps)) + } + + fn forward_checked(mut start: Self, count: usize) -> Option { + for _ in 0..count { + start = start.next_half_hour(); + } + Some(start) + } + + fn backward_checked(mut start: Self, count: usize) -> Option { + for _ in 0..count { + start = start.previous_half_hour(); + } + Some(start) + } +} + +impl Display for HalfHour { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(match self { + HalfHour::Hour0Min0 => "00:00", + HalfHour::Hour0Min30 => "00:30", + HalfHour::Hour1Min0 => "01:00", + HalfHour::Hour1Min30 => "01:30", + HalfHour::Hour2Min0 => "02:00", + HalfHour::Hour2Min30 => "02:30", + HalfHour::Hour3Min0 => "03:00", + HalfHour::Hour3Min30 => "03:30", + HalfHour::Hour4Min0 => "04:00", + HalfHour::Hour4Min30 => "04:30", + HalfHour::Hour5Min0 => "05:00", + HalfHour::Hour5Min30 => "05:30", + HalfHour::Hour6Min0 => "06:00", + HalfHour::Hour6Min30 => "06:30", + HalfHour::Hour7Min0 => "07:00", + HalfHour::Hour7Min30 => "07:30", + HalfHour::Hour8Min0 => "08:00", + HalfHour::Hour8Min30 => "08:30", + HalfHour::Hour9Min0 => "09:00", + HalfHour::Hour9Min30 => "09:30", + HalfHour::Hour10Min0 => "10:00", + HalfHour::Hour10Min30 => "10:30", + HalfHour::Hour11Min0 => "11:00", + HalfHour::Hour11Min30 => "11:30", + HalfHour::Hour12Min0 => "12:00", + HalfHour::Hour12Min30 => "12:30", + HalfHour::Hour13Min0 => "13:00", + HalfHour::Hour13Min30 => "13:30", + HalfHour::Hour14Min0 => "14:00", + HalfHour::Hour14Min30 => "14:30", + HalfHour::Hour15Min0 => "15:00", + HalfHour::Hour15Min30 => "15:30", + HalfHour::Hour16Min0 => "16:00", + HalfHour::Hour16Min30 => "16:30", + HalfHour::Hour17Min0 => "17:00", + HalfHour::Hour17Min30 => "17:30", + HalfHour::Hour18Min0 => "18:00", + HalfHour::Hour18Min30 => "18:30", + HalfHour::Hour19Min0 => "19:00", + HalfHour::Hour19Min30 => "19:30", + HalfHour::Hour20Min0 => "20:00", + HalfHour::Hour20Min30 => "20:30", + HalfHour::Hour21Min0 => "21:00", + HalfHour::Hour21Min30 => "21:30", + HalfHour::Hour22Min0 => "22:00", + HalfHour::Hour22Min30 => "22:30", + HalfHour::Hour23Min0 => "23:00", + HalfHour::Hour23Min30 => "23:30", + }) + } +} + +impl Iterator for HalfHour { + type Item = HalfHour; + + fn next(&mut self) -> Option { + Some(self.next_half_hour()) + } +} + +impl From for HalfHour { + fn from(time: NaiveTime) -> Self { + let minute = time.minute(); + macro_rules! match_hour_minute { + ($($hour:literal: $min0:ident, $min30:ident;)*) => { + match time.hour().min(23) { + $( + $hour => if minute < 30{ + HalfHour::$min0 + } else { + HalfHour::$min30 + } + )* + hour => unreachable!("got hour {hour}") + } + }; + } + match_hour_minute!( + 0: Hour0Min0, Hour0Min30; + 1: Hour1Min0, Hour1Min30; + 2: Hour2Min0, Hour2Min30; + 3: Hour3Min0, Hour3Min30; + 4: Hour4Min0, Hour4Min30; + 5: Hour5Min0, Hour5Min30; + 6: Hour6Min0, Hour6Min30; + 7: Hour7Min0, Hour7Min30; + 8: Hour8Min0, Hour8Min30; + 9: Hour9Min0, Hour9Min30; + 10: Hour10Min0, Hour10Min30; + 11: Hour11Min0, Hour11Min30; + 12: Hour12Min0, Hour12Min30; + 13: Hour13Min0, Hour13Min30; + 14: Hour14Min0, Hour14Min30; + 15: Hour15Min0, Hour15Min30; + 16: Hour16Min0, Hour16Min30; + 17: Hour17Min0, Hour17Min30; + 18: Hour18Min0, Hour18Min30; + 19: Hour19Min0, Hour19Min30; + 20: Hour20Min0, Hour20Min30; + 21: Hour21Min0, Hour21Min30; + 22: Hour22Min0, Hour22Min30; + 23: Hour23Min0, Hour23Min30; + ) + } +} + +#[macro_export] +macro_rules! id_impl { + ($name:ident) => { + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] + pub struct $name(uuid::Uuid); + + #[cfg(feature = "server")] + impl sqlx::TypeInfo for $name { + fn is_null(&self) -> bool { + self.0 == uuid::Uuid::nil() + } + + fn name(&self) -> &str { + "uuid" + } + } + + #[cfg(feature = "server")] + impl sqlx::Type for $name { + fn type_info() -> ::TypeInfo { + >::type_info() + } + } + + #[cfg(feature = "server")] + impl<'q> sqlx::Encode<'q, sqlx::Postgres> for $name { + fn encode_by_ref( + &self, + buf: &mut ::ArgumentBuffer<'q>, + ) -> Result { + self.0.encode_by_ref(buf) + } + } + + #[cfg(feature = "server")] + impl<'r> sqlx::Decode<'r, sqlx::Postgres> for $name { + fn decode( + value: ::ValueRef<'r>, + ) -> Result { + Ok(Self(uuid::Uuid::decode(value)?)) + } + } + + impl From for $name { + fn from(value: uuid::Uuid) -> Self { + Self::from_uuid(value) + } + } + + impl From<$name> for uuid::Uuid { + fn from(value: $name) -> Self { + value.into_uuid() + } + } + + impl Default for $name { + fn default() -> Self { + Self::new() + } + } + + impl $name { + pub fn new() -> Self { + Self(uuid::Uuid::new_v4()) + } + + pub const fn from_uuid(uuid: uuid::Uuid) -> Self { + Self(uuid) + } + + pub const fn into_uuid(self) -> uuid::Uuid { + self.0 + } + } + + impl core::fmt::Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } + } + + impl core::str::FromStr for $name { + type Err = uuid::Error; + + fn from_str(s: &str) -> Result { + Ok(Self(uuid::Uuid::from_str(s)?)) + } + } + }; +} diff --git a/plan-proto/src/limited.rs b/plan-proto/src/limited.rs new file mode 100644 index 0000000..5b90efe --- /dev/null +++ b/plan-proto/src/limited.rs @@ -0,0 +1,129 @@ +use core::{ + fmt::Display, + ops::{Deref, RangeInclusive}, +}; + +use serde::{Deserialize, Deserializer, Serialize}; + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct FixedLenString(String); + +impl Display for FixedLenString { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl FixedLenString { + pub fn new(s: String) -> Option { + (s.chars().take(LEN + 1).count() == LEN).then_some(Self(s)) + } +} + +impl Deref for FixedLenString { + type Target = String; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'de, const LEN: usize> Deserialize<'de> for FixedLenString { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct ExpectedLen(usize); + impl serde::de::Expected for ExpectedLen { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "a string exactly {} characters long", self.0) + } + } + ::deserialize(deserializer).and_then(|s| { + let char_count = s.chars().take(LEN.saturating_add(1)).count(); + if char_count != LEN { + Err(serde::de::Error::invalid_length( + char_count, + &ExpectedLen(LEN), + )) + } else { + Ok(Self(s)) + } + }) + } +} + +impl Serialize for FixedLenString { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.0.as_str()) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct ClampedString(String); + +impl ClampedString { + pub fn new(s: String) -> Result> { + let str_len = s.chars().take(MAX.saturating_add(1)).count(); + (str_len >= MIN && str_len <= MAX) + .then_some(Self(s)) + .ok_or(MIN..=MAX) + } + + pub fn into_inner(self) -> String { + self.0 + } +} + +impl Display for ClampedString { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Deref for ClampedString { + type Target = String; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'de, const MIN: usize, const MAX: usize> Deserialize<'de> for ClampedString { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct ExpectedLen(usize, usize); + impl serde::de::Expected for ExpectedLen { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!( + f, + "a string between {} and {} characters long", + self.0, self.1 + ) + } + } + ::deserialize(deserializer).and_then(|s| { + let char_count = s.chars().take(MAX.saturating_add(1)).count(); + if char_count < MIN || char_count > MAX { + Err(serde::de::Error::invalid_length( + char_count, + &ExpectedLen(MIN, MAX), + )) + } else { + Ok(Self(s)) + } + }) + } +} + +impl Serialize for ClampedString { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.0.as_str()) + } +} diff --git a/plan-proto/src/message.rs b/plan-proto/src/message.rs new file mode 100644 index 0000000..39ee77a --- /dev/null +++ b/plan-proto/src/message.rs @@ -0,0 +1,23 @@ +use core::ops::Deref; + +use serde::{Deserialize, Deserializer, Serialize}; + +use crate::{ + HalfHour, + error::ServerError, + plan::{Plan, PlanDay, UpdateTiles}, +}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServerMessage { + Error(ServerError), + DayUpdate { offset: u8, day: PlanDay }, + PlanInfo(Plan), +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ClientMessage { + MarkTile { day_offset: u8, tile: HalfHour }, + UnmarkTile { day_offset: u8, tile: HalfHour }, + GetPlan, +} diff --git a/plan-proto/src/plan.rs b/plan-proto/src/plan.rs new file mode 100644 index 0000000..77c6f78 --- /dev/null +++ b/plan-proto/src/plan.rs @@ -0,0 +1,96 @@ +use core::num::NonZeroU8; +use std::collections::HashMap; + +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +use crate::{HalfHour, limited::ClampedString}; + +#[derive(Debug, Clone, Copy, PartialEq, Error)] +pub enum PlanError { + #[error("start after end")] + StartAfterEnd, + #[error("day 0 ends before the plan starts")] + Day0EndsBeforePlanStarts, +} + +crate::id_impl!(PlanId); + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct CreatePlan { + pub start_time: DateTime, + pub title: Option>, + pub days: HashMap, +} +impl CreatePlan { + pub fn check(&self) -> Result<(), PlanError> { + let start_half_hour: HalfHour = self.start_time.time().into(); + + if let Some(day0) = self.days.get(&0u8) + && day0.day_end < start_half_hour + { + return Err(PlanError::Day0EndsBeforePlanStarts); + } + self.days.values().try_for_each(|v| v.check())?; + + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct CreatePlanDay { + pub day_start: HalfHour, + pub day_end: HalfHour, +} + +impl CreatePlanDay { + pub fn check(&self) -> Result<(), PlanError> { + if self.day_start > self.day_end { + return Err(PlanError::StartAfterEnd); + } + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Plan { + pub created_by: String, + pub title: Option, + pub start_time: DateTime, + pub days: HashMap, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PlanDay { + pub day_start: HalfHour, + pub day_end: HalfHour, + pub tiles_count: HashMap, + pub your_tiles: Box<[HalfHour]>, + pub users_available: Box<[LastUpdatedAvailability]>, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct LastUpdatedAvailability { + pub username: String, + pub last_updated_availability: DateTime, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct UpdateTiles { + pub day_offset: u8, + pub tiles: Box<[HalfHour]>, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PlanHeadline { + pub id: PlanId, + pub title: Option, + pub date: DateTime, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct UserPlans { + pub created_plans: Box<[PlanHeadline]>, + pub participating_in: Box<[PlanHeadline]>, +} diff --git a/plan-proto/src/token.rs b/plan-proto/src/token.rs new file mode 100644 index 0000000..0f32b72 --- /dev/null +++ b/plan-proto/src/token.rs @@ -0,0 +1,40 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; + +use crate::{limited::FixedLenString, user::Username}; + +pub const TOKEN_LEN: usize = 0x20; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Token { + pub token: FixedLenString, + pub username: Username, + pub created_at: DateTime, + pub expires_at: DateTime, +} + +impl Token { + pub fn login_token(&self) -> TokenLogin { + TokenLogin(self.token.clone()) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TokenLogin(pub FixedLenString); + +#[cfg(feature = "server")] +impl axum_extra::headers::authorization::Credentials for TokenLogin { + const SCHEME: &'static str = "Bearer"; + + fn decode(value: &axum::http::HeaderValue) -> Option { + value + .to_str() + .ok() + .and_then(|v| FixedLenString::new(v.strip_prefix("Bearer ").unwrap_or(v).to_string())) + .map(Self) + } + + fn encode(&self) -> axum::http::HeaderValue { + axum::http::HeaderValue::from_str(self.0.as_str()).expect("bearer token encode") + } +} diff --git a/plan-proto/src/user.rs b/plan-proto/src/user.rs new file mode 100644 index 0000000..f7d2c79 --- /dev/null +++ b/plan-proto/src/user.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +use crate::limited::ClampedString; + +pub type Username = ClampedString<1, 0x40>; +pub type Password = ClampedString<6, 0x100>; + +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] +pub struct UserLogin { + pub username: Username, + pub password: Password, +} + +crate::id_impl!(UserId); diff --git a/plan-server/Cargo.toml b/plan-server/Cargo.toml new file mode 100644 index 0000000..aa943eb --- /dev/null +++ b/plan-server/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "plan-server" +version = "0.1.0" +edition = "2024" + +[dependencies] +axum = { version = "0.8", features = ["ws", "macros"] } +tokio = { version = "1.47", features = ["full"] } +log = { version = "0.4" } +pretty_env_logger = { version = "0.5" } +futures = "0.3.31" +anyhow = { version = "1" } +mime-sniffer = { version = "0.1" } +chrono = { version = "0.4" } +axum-extra = { version = "0.10", features = ["typed-header"] } +rand = { version = "0.9" } +serde_json = { version = "1.0" } +serde = { version = "1.0", features = ["derive"] } +thiserror = { version = "2" } +ciborium = { version = "0.2" } +colored = { version = "3.0" } +plan-macros = { path = "../plan-macros" } +plan-proto = { path = "../plan-proto", features = ["server"] } +uuid = { version = "1.18", features = ["v4"] } +sqlx = { version = "0.8", features = [ + "runtime-tokio", + "postgres", + "derive", + "macros", + "uuid", + "chrono", +] } +argon2 = { version = "0.5" } +tower-http = { version = "0.6", features = ["cors"] } +tower = { version = "0.5.2", features = [ + "limit", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "buffer", + "timeout", +] } +axum-limit = "0.1.0-alpha.2" diff --git a/plan-server/build.rs b/plan-server/build.rs new file mode 100644 index 0000000..6afcdf4 --- /dev/null +++ b/plan-server/build.rs @@ -0,0 +1,129 @@ +#![feature(unix_send_signal)] +use core::time::Duration; +use std::{ + io::Read, + os::unix::process::ChildExt, + path::Path, + process::{ChildStdout, Command, ExitStatus, Stdio}, + thread::sleep, + time::Instant, +}; + +fn main() { + // add_from_dir("../"); + return; + let server_path = std::env::current_dir().unwrap_or_else(|_| { + std::env::var("CARGO_MANIFEST_DIR") + .expect("CARGO_MANIFEST_DIR") + .into() + }); + unsafe { + std::env::set_var( + "CARGO_TARGET_DIR", + server_path + .parent() + .unwrap() + .join("target-server") + .to_str() + .unwrap(), + ) + }; + let web_path = server_path.parent().expect("no parent").join("calendar"); + add_from_dir(&web_path); + build_calendar(&web_path); +} + +fn build_calendar(web_path: &Path) { + let mut cmd = Command::new("trunk"); + let target_dir = web_path.parent().unwrap().join("target-calendar"); + cmd.current_dir(web_path) + // .env_clear() + // .env("PATH", std::env::var("PATH").unwrap_or_default()) + .arg("build") + .arg("--release") + .arg("--color") + .arg("never") + .arg("--verbose") + .env("CARGO_TARGET_DIR", target_dir.to_str().unwrap()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .stdin(Stdio::null()); + let mut child = cmd.spawn().unwrap(); + + let start = Instant::now(); + let status = loop { + if let Some(status) = child.try_wait().unwrap() { + break Some(status); + } + if (Instant::now() - start) > Duration::from_secs(30) { + eprintln!("build_calendar timed out"); + if let Err(err) = child.send_signal(9) { + panic!("killing build_calendar build: {err}"); + } + // panic!("a"); + break None; + } + sleep(Duration::from_millis(100)); + }; + let status_code = status.and_then(|status| status.code()).unwrap_or(!0u8 as _); + + if status_code != 0 { + eprintln!("trunk build status code: {status_code}"); + // // if let Some(mut stdout) = child.stdout.take() { + // // // let mut buf = vec![]; + // // let mut buf = [0u8; 1]; + // // let mut cnt = 0usize; + // // while let Ok(len) = stdout.read(&mut buf) { + // // if cnt == 2269 { + // // panic!("A"); + // // } + // // if len == 0 { + // // break; + // // } else { + // // eprint!("{}", buf[0] as char); + // // cnt += 1; + // // } + // // } + // // // panic!("a"); + // // // stdout.read_to_end(&mut buf).unwrap(); + // // // eprintln!("trunk build stdout: {}", String::from_utf8(buf).unwrap()); + // // } + // if let Some(mut stderr) = child.stderr.take() { + // // let mut buf = vec![]; + // // stderr.read_to_end(&mut buf).unwrap(); + // let mut buf = [0u8; 1]; + // let mut cnt = 0usize; + // while let Ok(len) = stderr.read(&mut buf) { + // if len == 0 { + // break; + // } else { + // eprint!("{}", buf[0] as char); + // cnt += 1; + // } + // if cnt == 50 { + // panic!("A"); + // } + // } + // panic!("a"); + // // eprintln!("trunk build stderr: {}", String::from_utf8(buf).unwrap()); + // } + eprintln!("calendar build failed"); + } +} + +#[allow(unused)] +fn add_from_dir(dir: &Path) { + for item in std::fs::read_dir(dir) + .unwrap_or_else(|err| panic!("could not read calendar source directory ({dir:?}): {err}")) + { + let item = item.unwrap_or_else(|err| panic!("item in {dir:?} source directory: {err}")); + if let Some(file_name) = item.file_name().to_str() + && file_name.ends_with(".rs") + { + let path = dir.join(file_name); + println!("cargo:rerun-if-changed={}", path.to_str().unwrap()); + } else if item.file_type().map(|t| t.is_dir()).unwrap_or_default() { + add_from_dir(&item.path()); + } + } +} diff --git a/plan-server/src/db.rs b/plan-server/src/db.rs new file mode 100644 index 0000000..1892992 --- /dev/null +++ b/plan-server/src/db.rs @@ -0,0 +1,40 @@ +pub mod plan; +pub mod user; +use plan_proto::error::DatabaseError; +use sqlx::{Pool, Postgres}; + +use crate::db::{plan::PlanDatabase, user::UserDatabase}; + +type Result = core::result::Result; + +#[derive(Debug, Clone)] +pub struct Database { + pool: Pool, +} + +impl Database { + pub const fn new(pool: Pool) -> Self { + Self { pool } + } + + pub fn user(&self) -> UserDatabase { + UserDatabase { + pool: self.pool.clone(), + } + } + + pub fn plan(&self) -> PlanDatabase { + PlanDatabase { + pool: self.pool.clone(), + } + } + + pub async fn migrate(&self) { + log::info!("running migrations"); + sqlx::migrate!("../migrations") + .run(&self.pool) + .await + .expect("run migrations"); + log::info!("migrations done"); + } +} diff --git a/plan-server/src/db/plan.rs b/plan-server/src/db/plan.rs new file mode 100644 index 0000000..9981c04 --- /dev/null +++ b/plan-server/src/db/plan.rs @@ -0,0 +1,399 @@ +use core::num::NonZeroU8; +use std::collections::HashMap; + +use chrono::{DateTime, Utc}; +use plan_proto::{ + HalfHour, + error::{DatabaseError, ServerError}, + plan::{CreatePlan, LastUpdatedAvailability, Plan, PlanDay, PlanHeadline, PlanId, UpdateTiles}, + user::UserId, +}; +use sqlx::{Pool, Postgres, query, query_as}; +use uuid::Uuid; + +type Result = core::result::Result; + +#[derive(Debug, Clone)] +pub struct PlanDatabase { + pub(super) pool: Pool, +} + +pub enum TileOperation { + Mark, + Unmark, +} + +impl PlanDatabase { + pub async fn get_participating_plans(&self, user_id: UserId) -> Result> { + Ok(query_as!( + PlanHeadline, + r#" select + p.id, p.title, p.start_time as "date" + from + plans p + join + ( + select + d.plan_id, max(t.updated_at) as last_modified + from + day_tiles t + join + plan_days d on t.day_id = d.id + join + plans p on p.id = d.plan_id + where + p.created_by != $1 + and + t.user_id = $1 + group by + d.plan_id + ) participated on participated.plan_id = p.id + order by + participated.last_modified desc"#, + user_id.into_uuid(), + ) + .fetch_all(&self.pool) + .await? + .into_boxed_slice()) + } + pub async fn get_user_plans(&self, user: UserId) -> Result> { + Ok(query_as!( + PlanHeadline, + r#" select + id, title, start_time as "date" + from + plans + where + created_by = $1 + order by + created_at desc"#, + user.into_uuid(), + ) + .fetch_all(&self.pool) + .await? + .into_boxed_slice()) + } + + pub async fn create_plan(&self, creator: UserId, create: CreatePlan) -> Result { + create.check()?; + let mut tx = self.pool.begin().await?; + let created_at = Utc::now(); + let plan_id = PlanId::from_uuid( + query!( + r#" insert into plans + (title, created_by, start_time, created_at, updated_at) + values + ($1, $2, $3, $4, $5) + returning id"#, + create.title.map(|t| t.into_inner()), + creator.into_uuid(), + create.start_time, + created_at, + created_at, + ) + .fetch_one(&mut *tx) + .await? + .id, + ); + for (day_offset, day) in &create.days { + query!( + r#" insert into plan_days + (plan_id, day_offset, day_start, day_end) + values + ($1, $2, $3, $4)"#, + plan_id.into_uuid(), + (*day_offset) as i16, + day.day_start as _, + day.day_end as _, + ) + .execute(&mut *tx) + .await?; + } + + tx.commit().await?; + Ok(plan_id) + } + + pub async fn mark_day_tile( + &self, + id: PlanId, + user_id: UserId, + day_offset: u8, + tile: HalfHour, + operation: TileOperation, + ) -> Result<()> { + let day_id = query!( + "select id from plan_days where plan_id = $1 and day_offset = $2", + id.into_uuid(), + day_offset as i16, + ) + .fetch_one(&self.pool) + .await?; + + let mut tx = self.pool.begin().await?; + let mut current_tiles = match sqlx::query!( + r#" select + tiles as "tiles: Vec" + from + day_tiles + where + day_id = $1 + and + user_id = $2"#, + day_id.id, + user_id.into_uuid(), + ) + .fetch_one(&mut *tx) + .await + .map_err(Into::::into) + { + Ok(tiles) => tiles.tiles, + Err(ServerError::NotFound) => Vec::new(), + Err(err) => return Err(err), + }; + match operation { + TileOperation::Mark => { + if !current_tiles.contains(&tile) { + current_tiles.push(tile); + } + } + TileOperation::Unmark => current_tiles.retain(|t| *t != tile), + } + + if current_tiles.is_empty() { + sqlx::query!( + "delete from day_tiles where day_id = $1 and user_id = $2", + day_id.id, + user_id.into_uuid() + ) + .execute(&mut *tx) + .await?; + tx.commit().await?; + return Ok(()); + } + + sqlx::query( + r#" insert into + day_tiles (day_id, user_id, tiles, updated_at) + values + ($1, $2, $3, now()) + on conflict (day_id, user_id) do update + set tiles = $3, updated_at = now()"#, + ) + .bind(day_id.id) + .bind(user_id.into_uuid()) + .bind(current_tiles) + .execute(&mut *tx) + .await?; + + tx.commit().await?; + + Ok(()) + } + + pub async fn update_day_tiles( + &self, + id: PlanId, + user_id: UserId, + update: UpdateTiles, + ) -> Result { + let day_id = query!( + "select id from plan_days where plan_id = $1 and day_offset = $2", + id.into_uuid(), + update.day_offset as i16, + ) + .fetch_one(&self.pool) + .await?; + + sqlx::query( + r#" insert into + day_tiles (day_id, user_id, tiles) + values + ($1, $2, $3) + on conflict update"#, + ) + .bind(day_id.id) + .bind(user_id.into_uuid()) + .bind(update.tiles.to_vec()) + .execute(&self.pool) + .await?; + + let day = query_as!( + Day, + r#" select + id, day_offset, day_start as "day_start: HalfHour", day_end as "day_end: HalfHour" + from + plan_days + where + plan_id = $1 + and + day_offset = $2"#, + id.into_uuid(), + update.day_offset as i16, + ) + .fetch_one(&self.pool) + .await?; + + self.get_day_tiles(day, user_id).await + } + + pub async fn get_day(&self, plan_id: PlanId, day_offset: u8) -> Result { + Ok(query_as!( + Day, + r#" select + id, day_offset, day_start as "day_start: HalfHour", day_end as "day_end: HalfHour" + from + plan_days + where + plan_id = $1 + and + day_offset = $2"#, + plan_id.into_uuid(), + day_offset as i16, + ) + .fetch_one(&self.pool) + .await?) + } + + pub async fn get_day_tiles(&self, day: Day, requested_by: UserId) -> Result { + let day_tiles = query!( + r#" select + d.tiles as "tiles: Vec", d.user_id, u.username, d.updated_at + from + day_tiles d + join + users u on u.id = d.user_id + where + day_id = $1"#, + day.id + ) + .fetch_all(&self.pool) + .await?; + let mut tiles_count: HashMap> = HashMap::new(); + for day_tile in day_tiles.iter().flat_map(|t| t.tiles.iter()) { + match tiles_count.get_mut(day_tile) { + Some(cnt) => { + if let Some(next) = cnt.checked_add(1) { + *cnt = next; + } + } + None => { + tiles_count.insert(*day_tile, NonZeroU8::new(1).unwrap()); + } + } + } + let users_available = { + let mut users_available = day_tiles + .iter() + .map(|t| LastUpdatedAvailability { + username: t.username.clone(), + last_updated_availability: t.updated_at, + }) + .collect::>(); + users_available.sort_by_key(|u| u.last_updated_availability.timestamp()); + users_available.reverse(); + users_available + }; + + let your_tiles = day_tiles + .into_iter() + .find_map(|d| { + (d.user_id == requested_by.into_uuid()).then(|| d.tiles.into_boxed_slice()) + }) + .unwrap_or_default(); + + Ok(PlanDay { + your_tiles, + tiles_count, + users_available, + day_end: day.day_end, + day_start: day.day_start, + }) + } + + pub async fn day_tiles_per_user( + &self, + plan_id: PlanId, + day_offset: u8, + ) -> Result>> { + let day = query!( + "select id from plan_days where plan_id = $1 and day_offset = $2", + plan_id.into_uuid(), + day_offset as i16, + ) + .fetch_one(&self.pool) + .await?; + let tiles = query!( + r#" select + user_id, tiles as "tiles: Vec" + from + day_tiles + where + day_id = $1"#, + day.id, + ) + .fetch_all(&self.pool) + .await?; + Ok(tiles + .into_iter() + .map(|tile| { + ( + UserId::from_uuid(tile.user_id), + tile.tiles.into_boxed_slice(), + ) + }) + .collect()) + } + + pub async fn get_plan(&self, id: PlanId, requested_by: UserId) -> Result { + let plan = query!( + r#" select + p.id, p.title, users.username, p.start_time + from + plans p + join + users on users.id = p.created_by + where + p.id = $1"#, + id.into_uuid() + ) + .fetch_one(&self.pool) + .await?; + let mut plan = Plan { + created_by: plan.username, + start_time: plan.start_time, + days: HashMap::new(), + title: plan.title, + }; + + let days = query_as!( + Day, + r#" select + id, day_offset, day_start as "day_start: HalfHour", day_end as "day_end: HalfHour" + from + plan_days + where + plan_id = $1"#, + id.into_uuid() + ) + .fetch_all(&self.pool) + .await?; + for day in days { + let offset = day.day_offset as u8; + let day_id = day.id; + let day = self.get_day_tiles(day, requested_by).await?; + if let Some(dupe) = plan.days.insert(offset, day) { + log::warn!("duplicate day (plan id: {id}; day id: {day_id}): {dupe:?}",); + } + } + + Ok(plan) + } +} + +pub struct Day { + pub id: Uuid, + pub day_offset: i16, + pub day_start: HalfHour, + pub day_end: HalfHour, +} diff --git a/plan-server/src/db/user.rs b/plan-server/src/db/user.rs new file mode 100644 index 0000000..181c7d2 --- /dev/null +++ b/plan-server/src/db/user.rs @@ -0,0 +1,213 @@ +use super::Result; +use argon2::{ + Argon2, PasswordHash, PasswordVerifier, + password_hash::{PasswordHasher, SaltString, rand_core::OsRng}, +}; +use chrono::{TimeDelta, Utc}; +use plan_proto::{ + error::{DatabaseError, ServerError}, + token, + user::UserId, +}; +use rand::distr::SampleString; +use sqlx::{Decode, Encode, Pool, Postgres, prelude::FromRow, query, query_as}; + +#[derive(Debug, Clone)] +pub struct UserDatabase { + pub(super) pool: Pool, +} + +#[derive(Debug, Clone, FromRow)] +pub struct LoginToken { + pub token: String, + pub user_id: UserId, + + pub created_at: chrono::DateTime, + pub expires_at: chrono::DateTime, +} + +impl LoginToken { + const TOKEN_LONGEVITY: TimeDelta = TimeDelta::days(30); + + pub fn new(user_id: UserId) -> Self { + let created_at = Utc::now(); + let expires_at = created_at + .checked_add_signed(Self::TOKEN_LONGEVITY) + .unwrap_or_else(|| { + panic!( + "could not add {} time to {created_at}", + Self::TOKEN_LONGEVITY + ) + }); + + let token = rand::distr::Alphanumeric.sample_string(&mut rand::rng(), token::TOKEN_LEN); + + Self { + token, + user_id, + created_at, + expires_at, + } + } +} + +pub enum GetUserBy<'a> { + Username(&'a str), + Id(UserId), +} + +impl UserDatabase { + pub async fn create(&self, username: &str, password: &str) -> Result { + let salt = SaltString::generate(&mut OsRng); + let argon2 = Argon2::default(); + let password_hash = argon2 + .hash_password(password.as_bytes(), &salt)? + .to_string(); + + let now = chrono::offset::Utc::now(); + + let user = User { + id: UserId::new(), + username: username.into(), + password_hash, + created_at: now, + updated_at: now, + }; + + query!( + r#"insert into users + (id, username, password_hash, created_at, updated_at) + values + ($1, $2, $3, $4, $5)"#, + user.id.into_uuid(), + user.username, + user.password_hash, + user.created_at, + user.updated_at + ) + .execute(&self.pool) + .await + .map_err(|err| { + if let sqlx::Error::Database(db_err) = &err + && let Some(constraint) = db_err.constraint() + && constraint == "users_username_unique" + { + DatabaseError::UserAlreadyExists + } else { + err.into() + } + })?; + + Ok(user) + } + + pub async fn get_user(&self, get_user_by: GetUserBy<'_>) -> Result { + Ok(match get_user_by { + GetUserBy::Username(username) => { + query_as!( + User, + r#" + select + id, username, password_hash, + created_at, updated_at + from + users + where + username = $1"#, + username + ) + .fetch_one(&self.pool) + .await? + } + GetUserBy::Id(id) => { + query_as!( + User, + r#" + select + id, username, password_hash, + created_at, updated_at + from + users + where + id = $1"#, + id.into_uuid() + ) + .fetch_one(&self.pool) + .await? + } + }) + } + + pub async fn login( + &self, + username: &str, + password: &str, + ) -> core::result::Result { + let user = self.get_user(GetUserBy::Username(username)).await?; + + let parsed_hash = PasswordHash::new(&user.password_hash).map_err(DatabaseError::from)?; + Argon2::default() + .verify_password(password.as_bytes(), &parsed_hash) + .map_err(|err| match err { + argon2::password_hash::Error::Password => ServerError::InvalidCredentials, + err => ServerError::DatabaseError(err.into()), + })?; + + let token = LoginToken::new(user.id); + + query!( + r#" insert into login_tokens + (token, user_id, created_at, expires_at) + values + ($1, $2, $3, $4)"#, + token.token, + token.user_id.into_uuid(), + token.created_at, + token.expires_at + ) + .execute(&self.pool) + .await + .map_err(Into::::into)?; + + Ok(token) + } + + pub async fn check_token(&self, token: &str) -> core::result::Result { + let token = query_as!( + LoginToken, + r#" select + token, user_id, created_at, expires_at + from + login_tokens + where + token = $1 + and + expires_at > now() + "#, + token + ) + .fetch_one(&self.pool) + .await + .map_err(Into::::into) + .map_err(|err| match err { + DatabaseError::NotFound => ServerError::ExpiredToken, + _ => err.into(), + })?; + + if Utc::now() >= token.expires_at { + return Err(ServerError::ExpiredToken); + } + + Ok(self.get_user(GetUserBy::Id(token.user_id)).await?) + } +} + +#[derive(Debug, Clone, FromRow, Encode, Decode)] +pub struct User { + pub id: UserId, + pub username: String, + pub password_hash: String, + + pub created_at: chrono::DateTime, + pub updated_at: chrono::DateTime, +} diff --git a/plan-server/src/identity.rs b/plan-server/src/identity.rs new file mode 100644 index 0000000..bc9ec51 --- /dev/null +++ b/plan-server/src/identity.rs @@ -0,0 +1,8 @@ +use plan_proto::{plan::PlanId, user::UserId}; + +#[derive(Debug, Clone, PartialEq)] +pub struct SessionIdentity { + pub user_id: UserId, + pub user_name: String, + pub plan_id: PlanId, +} diff --git a/plan-server/src/main.rs b/plan-server/src/main.rs new file mode 100644 index 0000000..7d60fc6 --- /dev/null +++ b/plan-server/src/main.rs @@ -0,0 +1,372 @@ +mod db; +mod identity; +mod runner; +mod session; + +use axum::{ + BoxError, Router, debug_handler, + error_handling::HandleErrorLayer, + extract::State, + http::{Request, StatusCode, header}, + response::IntoResponse, + routing::{any, get, post, put}, +}; +use axum_extra::{ + TypedHeader, + handler::HandlerCallWithExtractors, + headers::{self, Authorization}, +}; +use core::{fmt::Display, net::SocketAddr, str::FromStr, time::Duration}; +use plan_proto::{ + cbor::Cbor, + error::ServerError, + limited::FixedLenString, + message::ClientMessage, + plan::{CreatePlan, UserPlans}, + token::{Token, TokenLogin}, + user::UserLogin, +}; +use sqlx::postgres::PgPoolOptions; +use std::io::Write; +use tokio::sync::mpsc::UnboundedSender; +use tower::{ + ServiceBuilder, + buffer::BufferLayer, + limit::{RateLimit, RateLimitLayer, rate::Rate}, +}; + +use crate::{db::Database, identity::SessionIdentity, runner::Runner, session::SessionManager}; + +const fn parse_port(port: &str) -> u16 { + const fn parse_char(c: u8) -> u16 { + match c { + b'0' => 0, + b'1' => 1, + b'2' => 2, + b'3' => 3, + b'4' => 4, + b'5' => 5, + b'6' => 6, + b'7' => 7, + b'8' => 8, + b'9' => 9, + _ => panic!("not a decimal number"), + } + } + let port_bytes = port.as_bytes(); + match port.len() { + 0 => panic!("port too short"), + 1 => parse_char(port_bytes[0]), + 2 => (parse_char(port_bytes[0]) * 10) + parse_char(port_bytes[1]), + 3 => { + (parse_char(port_bytes[0]) * 100) + + (parse_char(port_bytes[1]) * 10) + + parse_char(port_bytes[2]) + } + 4 => { + (parse_char(port_bytes[0]) * 1000) + + (parse_char(port_bytes[1]) * 100) + + (parse_char(port_bytes[2]) * 10) + + parse_char(port_bytes[3]) + } + 5 => { + (parse_char(port_bytes[0]) * 10000) + + (parse_char(port_bytes[1]) * 1000) + + (parse_char(port_bytes[2]) * 100) + + (parse_char(port_bytes[3]) * 10) + + parse_char(port_bytes[4]) + } + _ => panic!("port too long"), + } +} + +const PORT: u16 = match option_env!("PORT") { + Some(port) => parse_port(port), + None => 8080, +}; +const HOST: &str = match option_env!("HOST") { + Some(host) => host, + None => "127.0.0.1", +}; + +const DEFAULT_MAX_PG_CONNECTIONS: u32 = 30; +const DEFAULT_PG_CONN_STRING: &str = "postgres://emilis@localhost/calendar"; + +#[tokio::main] +async fn main() { + // pretty_env_logger::init(); + use colored::Colorize; + pretty_env_logger::formatted_builder() + .parse_default_env() + .format(|f, record| { + let time = chrono::Local::now().time().to_string().dimmed(); + + match record.file() { + Some(file) => { + let file = format!( + "[{file}{}]", + record + .line() + .map(|l| format!(":{l}")) + .unwrap_or_else(String::new), + ) + .dimmed(); + let level = match record.level() { + log::Level::Error => "[err]".red().bold(), + log::Level::Warn => "[warn]".yellow().bold(), + log::Level::Info => "[info]".white().bold(), + log::Level::Debug => "[debug]".dimmed().bold(), + log::Level::Trace => "[trace]".dimmed(), + }; + let args = record.args(); + + let arrow = "➢".bold().magenta(); + writeln!( + f, + "{time} {file}\n{level} {arrow} {args}", + // "⇗⇘⇗⇘⇗⇘".bold().dimmed(), + ) + } + _ => writeln!(f, "{time} [{}] {}", record.level(), record.args()), + } + }) + .try_init() + .unwrap(); + + let default_panic = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |info| { + default_panic(info); + std::process::exit(1); + })); + + let listen_addr = + SocketAddr::from_str(format!("{HOST}:{PORT}").as_str()).expect("invalid host/port"); + + let pg_pool = PgPoolOptions::new() + .max_connections( + std::env::var("MAX_DB_CONNECTIONS") + .ok() + .and_then(|val| u32::from_str(&val).ok()) + .unwrap_or(DEFAULT_MAX_PG_CONNECTIONS), + ) + .connect( + std::env::var("PG_CONN_STRING") + .unwrap_or_else(|_| String::from(DEFAULT_PG_CONN_STRING)) + .as_str(), + ) + .await + .expect("could not init db"); + let db = Database::new(pg_pool); + + db.migrate().await; + + let (send_server, recv_server) = tokio::sync::mpsc::unbounded_channel(); + let state = AppState { + db: db.clone(), + message_sender: send_server, + session_manager: SessionManager::new(), + }; + let sessions = state.session_manager.clone(); + tokio::spawn(async move { + Runner::new(recv_server, db, sessions).run().await; + log::error!("runner ended"); + std::process::exit(0x40); + }); + + let app = Router::new() + .route("/s/users", put(signup)) + .route("/s/tokens", post(signin)) + // .route("/s/tokens/check", get(check_token)) + .route("/s/plans/{id}", any(session::calendar_session)) + .route("/s/plans", get(my_plans)) + .route("/s/plans", post(new_plan)) + .route( + "/s/tokens/check", + get(check_token).layer( + ServiceBuilder::new() + .layer(HandleErrorLayer::new(|err: BoxError| async move { + ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Unhandled error: {}", err), + ) + })) + .layer(BufferLayer::new(0x1000)) + .layer(RateLimitLayer::new(100, Duration::from_secs(10))), + ), + ) + .with_state(state) + .layer(tower_http::cors::CorsLayer::permissive().allow_headers([header::AUTHORIZATION])) + .fallback(get(handle_http_static)); + let listener = tokio::net::TcpListener::bind(listen_addr).await.unwrap(); + log::info!("listening on {}", listener.local_addr().unwrap()); + axum::serve( + listener, + app.into_make_service_with_connect_info::(), + ) + .await + .unwrap(); +} + +async fn new_plan( + State(AppState { db, .. }): State, + TypedHeader(Authorization(login)): TypedHeader>, + Cbor(plan): Cbor, +) -> Result { + let user = db.user().check_token(&login.0).await?; + let plan_id = db.plan().create_plan(user.id, plan).await?; + Ok((StatusCode::CREATED, Cbor(plan_id))) +} + +#[debug_handler] +async fn check_token( + State(AppState { db, .. }): State, + TypedHeader(Authorization(login)): TypedHeader>, +) -> Result { + db.user().check_token(&login.0).await?; + Ok(StatusCode::OK) +} + +async fn my_plans( + State(AppState { db, .. }): State, + TypedHeader(Authorization(login)): TypedHeader>, +) -> Result { + let user = db.user().check_token(&login.0).await?; + Ok(Cbor(UserPlans { + created_plans: db.plan().get_user_plans(user.id).await?, + participating_in: db.plan().get_participating_plans(user.id).await?, + })) +} + +async fn signin( + State(AppState { db, .. }): State, + Cbor(UserLogin { username, password }): Cbor, +) -> Result { + let token = db.user().login(&username, &password).await?; + + Ok(Cbor(Token { + username, + token: FixedLenString::new(token.token.clone()).ok_or_else(|| { + ServerError::InternalServerError(format!( + "could not get a fixed len string for token [{}]", + token.token + )) + })?, + created_at: token.created_at, + expires_at: token.expires_at, + }) + .into_response()) +} + +async fn signup( + State(AppState { db, .. }): State, + Cbor(UserLogin { username, password }): Cbor, +) -> Result { + db.user().create(&username, &password).await?; + Ok(StatusCode::CREATED) +} + +#[derive(Debug, Clone)] +struct AppState { + db: Database, + session_manager: SessionManager, + message_sender: UnboundedSender<(SessionIdentity, ClientMessage)>, +} + +async fn handle_http_static(req: Request) -> impl IntoResponse { + use mime_sniffer::MimeTypeSniffer; + const INDEX_FILE: &[u8] = include_bytes!("../../plan/dist/index.html"); + let path = req.uri().path(); + + plan_macros::include_dist!(DIST_FILES, "plan/dist"); + + let file = if let Some(file) = DIST_FILES.iter().find_map(|(file_path, file)| { + if *file_path == path { + Some(*file) + } else { + None + } + }) { + file + } else { + return ( + [(header::CONTENT_TYPE, "text/html".to_string())], + INDEX_FILE, + ); + }; + + let mime = if path.ends_with(".js") { + "text/javascript".to_string() + } else if path.ends_with(".css") { + "text/css".to_string() + } else if path.ends_with(".wasm") { + "application/wasm".to_string() + } else if path.ends_with(".svg") { + "image/svg+xml".to_string() + } else { + file.sniff_mime_type() + .unwrap_or("application/octet-stream") + .to_string() + }; + + ([(header::CONTENT_TYPE, mime)], file) +} + +struct XForwardedFor(String); + +impl Display for XForwardedFor { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(self.0.as_str()) + } +} + +impl headers::Header for XForwardedFor { + fn name() -> &'static header::HeaderName { + static NAME: header::HeaderName = header::HeaderName::from_static("x-forwarded-for"); + &NAME + } + + fn decode<'i, I>(values: &mut I) -> Result + where + Self: Sized, + I: Iterator, + { + Ok(Self( + values + .next() + .and_then(|v| v.to_str().ok()) + .ok_or(headers::Error::invalid())? + .to_string(), + )) + } + + fn encode>(&self, _: &mut E) {} +} + +pub trait LogError { + fn log_warn(self); + fn log_err(self); + fn log_debug(self); +} + +impl LogError for Result +where + E: Display, +{ + fn log_warn(self) { + if let Err(err) = self { + log::warn!("{err}"); + } + } + + fn log_err(self) { + if let Err(err) = self { + log::error!("{err}"); + } + } + + fn log_debug(self) { + if let Err(err) = self { + log::debug!("{err}") + } + } +} diff --git a/plan-server/src/runner.rs b/plan-server/src/runner.rs new file mode 100644 index 0000000..7e744c6 --- /dev/null +++ b/plan-server/src/runner.rs @@ -0,0 +1,179 @@ +use std::collections::HashMap; + +use plan_proto::{ + HalfHour, + error::ServerError, + message::{ClientMessage, ServerMessage}, + plan::{Plan, PlanDay, PlanId}, + user::UserId, +}; +use tokio::sync::mpsc::UnboundedReceiver; +use uuid::Uuid; + +use crate::{ + LogError, + db::{ + Database, + plan::{Day, TileOperation}, + }, + identity::SessionIdentity, + session::SessionManager, +}; + +pub struct Runner { + recv: UnboundedReceiver<(SessionIdentity, ClientMessage)>, + database: Database, + session: SessionManager, +} + +pub(crate) enum ActionOutcome { + UpdateDay { + offset: u8, + day: PlanDay, + tiles: HashMap>, + }, + SendPlan(Plan), +} + +impl Runner { + pub const fn new( + recv: UnboundedReceiver<(SessionIdentity, ClientMessage)>, + database: Database, + session: SessionManager, + ) -> Self { + Self { + recv, + database, + session, + } + } + + pub async fn run(mut self) { + loop { + let (ident, msg) = match self.recv.recv().await { + Some(next) => next, + None => panic!("runner recv channel closed"), + }; + let outcome = match self.run_inner(ident.clone(), msg).await { + Ok(outcome) => outcome, + Err(err) => { + log::debug!( + "run_inner for {} ({}): {err}", + ident.user_name, + ident.user_id, + ); + let message = if let ServerError::DatabaseError(err) = &err { + let error_id = Uuid::new_v4(); + log::error!("database error[{error_id}]: {err}"); + + ServerMessage::Error(ServerError::InternalServerError(format!( + "internal server error. error id: {error_id}" + ))) + } else { + ServerMessage::Error(err) + }; + self.session + .send(ident.plan_id, ident.user_id, message) + .await; + continue; + } + }; + match outcome { + ActionOutcome::UpdateDay { offset, day, tiles } => { + let senders = self.session.get_all_plan_senders(ident.plan_id).await; + + for (user, send) in senders { + send.send(ServerMessage::DayUpdate { + offset, + day: PlanDay { + day_start: day.day_start, + day_end: day.day_end, + tiles_count: day.tiles_count.clone(), + users_available: day.users_available.clone(), + your_tiles: tiles.get(&user).cloned().unwrap_or_default(), + }, + }) + .await + .log_debug(); + } + } + ActionOutcome::SendPlan(plan) => { + self.session + .send(ident.plan_id, ident.user_id, ServerMessage::PlanInfo(plan)) + .await + } + } + } + } + + pub(crate) async fn run_inner( + &mut self, + ident: SessionIdentity, + message: ClientMessage, + ) -> Result { + match message { + ClientMessage::GetPlan => Ok(ActionOutcome::SendPlan( + self.database + .plan() + .get_plan(ident.plan_id, ident.user_id) + .await?, + )), + ClientMessage::MarkTile { + day_offset: offset, + tile, + } => { + self.database + .plan() + .mark_day_tile( + ident.plan_id, + ident.user_id, + offset, + tile, + TileOperation::Mark, + ) + .await?; + let tiles = self + .database + .plan() + .day_tiles_per_user(ident.plan_id, offset) + .await?; + let day = self.database.plan().get_day(ident.plan_id, offset).await?; + let day = self + .database + .plan() + .get_day_tiles(day, ident.user_id) + .await?; + + Ok(ActionOutcome::UpdateDay { offset, day, tiles }) + } + ClientMessage::UnmarkTile { + day_offset: offset, + tile, + } => { + self.database + .plan() + .mark_day_tile( + ident.plan_id, + ident.user_id, + offset, + tile, + TileOperation::Unmark, + ) + .await?; + let tiles = self + .database + .plan() + .day_tiles_per_user(ident.plan_id, offset) + .await?; + let day = self.database.plan().get_day(ident.plan_id, offset).await?; + let day = self + .database + .plan() + .get_day_tiles(day, ident.user_id) + .await?; + + Ok(ActionOutcome::UpdateDay { offset, day, tiles }) + } + } + } +} diff --git a/plan-server/src/session.rs b/plan-server/src/session.rs new file mode 100644 index 0000000..127391f --- /dev/null +++ b/plan-server/src/session.rs @@ -0,0 +1,350 @@ +use core::net::SocketAddr; +use std::{collections::HashMap, sync::Arc}; + +use axum::{ + extract::{ + ConnectInfo, Path, State, WebSocketUpgrade, + ws::{self, WebSocket}, + }, + response::IntoResponse, +}; +use axum_extra::{TypedHeader, headers}; +use colored::Colorize; +use futures::{SinkExt, lock::Mutex}; +use plan_proto::{ + error::ServerError, + message::{ClientMessage, ServerMessage}, + plan::PlanId, + token::TokenLogin, + user::UserId, +}; +use thiserror::Error; +use tokio::sync::mpsc::{Receiver, Sender, UnboundedSender}; +use uuid::Uuid; + +use crate::{ + AppState, LogError, XForwardedFor, + db::{Database, user::User}, + identity::SessionIdentity, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct ConnectionId(u32); + +impl ConnectionId { + fn new() -> Self { + Self(rand::random()) + } +} + +#[allow(clippy::type_complexity)] +#[derive(Debug, Clone)] +pub struct SessionManager(Arc>>>); + +pub struct Connection { + pub plan_id: PlanId, + pub sender: Sender, +} + +#[derive(Debug, Clone, Copy, PartialEq, Error)] +pub enum SessionError { + #[error("the given connection id already exists for this user")] + ConnectionIdExists, +} + +pub struct ConnectionDropToken(SessionManager, UserId, ConnectionId); + +impl Drop for ConnectionDropToken { + fn drop(&mut self) { + let (s, u, c) = (self.0.clone(), self.1, self.2); + tokio::spawn(async move { + s.drop_connection(u, c).await; + }); + } +} + +impl SessionManager { + pub fn new() -> Self { + Self(Arc::new(Mutex::new(HashMap::new()))) + } + + pub async fn send(&self, plan_id: PlanId, user_id: UserId, message: ServerMessage) { + for sender in self + .0 + .lock() + .await + .get(&user_id) + .iter() + .flat_map(|conns| conns.values()) + .filter_map(|conn| (conn.plan_id == plan_id).then_some(&conn.sender)) + { + sender.send(message.clone()).await.log_debug(); + } + } + + pub async fn get_all_plan_senders( + &self, + plan_id: PlanId, + ) -> Box<[(UserId, Sender)]> { + self.0 + .lock() + .await + .iter() + .flat_map(|(user, conns)| { + conns + .values() + .filter_map(|c| (c.plan_id == plan_id).then_some((*user, c.sender.clone()))) + }) + .collect::>() + } + + pub async fn broadcast(&self, plan_id: PlanId, message: ServerMessage) { + for sender in self + .0 + .lock() + .await + .iter() + .flat_map(|(_, conns)| { + conns + .values() + .filter_map(|c| (c.plan_id == plan_id).then_some(c.sender.clone())) + }) + // Call collect due to [#98380](https://github.com/rust-lang/rust/issues/98380) + .collect::>() + { + sender.send(message.clone()).await.log_debug(); + } + } + + pub async fn add_connection( + &self, + user_id: UserId, + connection_id: ConnectionId, + plan_id: PlanId, + sender: Sender, + ) -> Result { + let mut sessions = self.0.lock().await; + let user_sessions = match sessions.get_mut(&user_id) { + Some(s) => s, + None => { + sessions.insert(user_id, HashMap::new()); + sessions.get_mut(&user_id).unwrap() + } + }; + if user_sessions.contains_key(&connection_id) { + return Err(SessionError::ConnectionIdExists); + } + user_sessions.insert(connection_id, Connection { plan_id, sender }); + + Ok(ConnectionDropToken(self.clone(), user_id, connection_id)) + } + + async fn drop_connection(&self, user_id: UserId, connection_id: ConnectionId) { + let mut sessions = self.0.lock().await; + let user_sessions = match sessions.get_mut(&user_id) { + Some(sessions) => sessions, + None => return, + }; + let _ = user_sessions.remove(&connection_id); + } +} + +pub async fn calendar_session( + ws: WebSocketUpgrade, + user_agent: Option>, + x_forwarded_for: Option>, + ConnectInfo(addr): ConnectInfo, + State(state): State, + Path(plan_id): Path, +) -> impl IntoResponse { + let who = x_forwarded_for + .map(|x| x.to_string()) + .unwrap_or_else(|| addr.to_string()) + .italic(); + + // log::debug!( + // "{who}{} connected.", + // user_agent + // .map(|agent| format!(" (User-Agent: {})", agent.as_str())) + // .unwrap_or_default(), + // ); + + // finalize the upgrade process by returning upgrade callback. + // we can customize the callback by sending additional info such as address. + ws.on_upgrade(move |mut socket| async move { + let ident = match get_identification(&mut socket, &who, state.db.clone()).await { + Ok(ident) => ident, + Err(err) => { + socket + .send({ + ws::Message::Binary({ + let mut v = Vec::new(); + if let Err(err) = + ciborium::into_writer(&ServerMessage::Error(err.clone()), &mut v) + { + log::info!("encoding error message for {who}: {err}"); + return; + } + v.into() + }) + }) + .await + .log_debug(); + log::info!("identification failed for {who}: {err}"); + if let Err(err) = socket.close().await { + log::warn!("closing socket on identification fail: {err}") + } + return; + } + }; + + // check if the plan is real + if let Err(err) = state.db.plan().get_plan(plan_id, ident.id).await { + log::info!("getting plan: {err}; rejecting connection"); + socket + .send({ + ws::Message::Binary({ + let mut v = Vec::new(); + if let Err(err) = + ciborium::into_writer(&ServerMessage::Error(err.clone()), &mut v) + { + log::info!("encoding error message for {who}: {err}"); + return; + } + v.into() + }) + }) + .await + .log_debug(); + } + // log::debug!("connected {who} as {ident}"); + let (send, recv) = tokio::sync::mpsc::channel(100); + let mut connection_id = ConnectionId::new(); + let token = loop { + match state + .session_manager + .add_connection(ident.id, connection_id, plan_id, send.clone()) + .await + { + Ok(token) => break token, + Err(SessionError::ConnectionIdExists) => connection_id = ConnectionId::new(), + } + }; + Session::new( + socket, + SessionIdentity { + plan_id, + user_id: ident.id, + user_name: ident.username.clone(), + }, + token, + recv, + state.message_sender, + ) + .run() + .await; + + // log::debug!("ending connection with {who}"); + }) +} + +async fn get_identification( + socket: &mut WebSocket, + who: &str, + db: Database, +) -> Result { + db.user() + .check_token( + &ciborium::from_reader::( + &socket + .recv() + .await + .ok_or(ServerError::ConnectionError)? + .map_err(|err| { + ServerError::InvalidRequest(format!("parse token request: {err}")) + })? + .into_data(), + )? + .0, + ) + .await +} + +struct Session { + socket: WebSocket, + identity: SessionIdentity, + connection_token: ConnectionDropToken, + recv: Receiver, + send: UnboundedSender<(SessionIdentity, ClientMessage)>, +} + +impl Session { + const fn new( + socket: WebSocket, + identity: SessionIdentity, + connection_token: ConnectionDropToken, + recv: Receiver, + send: UnboundedSender<(SessionIdentity, ClientMessage)>, + ) -> Self { + Self { + send, + recv, + socket, + identity, + connection_token, + } + } + + async fn handle_message(&mut self, message: ServerMessage) -> Result<(), anyhow::Error> { + self.socket + .send({ + ws::Message::Binary({ + let mut v = Vec::new(); + ciborium::into_writer(&message, &mut v)?; + v.into() + }) + }) + .await?; + Ok(()) + } + + async fn run(mut self) { + loop { + tokio::select! { + r = self.recv.recv() => { + match r { + Some(msg) => self.handle_message(msg).await.log_debug(), + None => { + log::info!("recv channel closed"); + return; + }, + } + } + r = self.socket.recv() => { + match r { + Some(Ok(msg)) => match ciborium::from_reader::(msg.into_data().iter().as_slice()) { + Ok(msg) => self.send.send((self.identity.clone(), msg)).log_debug(), + Err(err) => { + self.handle_message(ServerMessage::Error(ServerError::InvalidRequest( + err.to_string(), + ))) + .await + .log_debug(); + log::info!("error decoding client message: {err}"); + continue; + } + }, + Some(Err(err)) => { + log::warn!("socket error: {err}"); + return; + } + None => { + log::info!("socket closed"); + return; + }, + } + } + } + } + } +} diff --git a/plan/Cargo.lock b/plan/Cargo.lock new file mode 100644 index 0000000..1e6a637 --- /dev/null +++ b/plan/Cargo.lock @@ -0,0 +1,1531 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anymap2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "boolinator" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[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" + +[[package]] +name = "calendar" +version = "0.1.0" +dependencies = [ + "chrono", + "futures", + "gloo 0.11.0", + "instant", + "log", + "once_cell", + "postcard", + "serde", + "thiserror 2.0.17", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-logger", + "web-sys", + "yew", + "yew-router", +] + +[[package]] +name = "cc" +version = "1.2.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.17", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[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.106", +] + +[[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 = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gloo" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28999cda5ef6916ffd33fb4a7b87e1de633c47c0dc6d97905fee1cdaa142b94d" +dependencies = [ + "gloo-console 0.2.3", + "gloo-dialogs 0.1.1", + "gloo-events 0.1.2", + "gloo-file 0.2.3", + "gloo-history 0.1.5", + "gloo-net 0.3.1", + "gloo-render 0.1.1", + "gloo-storage 0.2.2", + "gloo-timers 0.2.6", + "gloo-utils 0.1.7", + "gloo-worker 0.2.1", +] + +[[package]] +name = "gloo" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd35526c28cc55c1db77aed6296de58677dbab863b118483a27845631d870249" +dependencies = [ + "gloo-console 0.3.0", + "gloo-dialogs 0.2.0", + "gloo-events 0.2.0", + "gloo-file 0.3.0", + "gloo-history 0.2.2", + "gloo-net 0.4.0", + "gloo-render 0.2.0", + "gloo-storage 0.3.0", + "gloo-timers 0.3.0", + "gloo-utils 0.2.0", + "gloo-worker 0.4.0", +] + +[[package]] +name = "gloo" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15282ece24eaf4bd338d73ef580c6714c8615155c4190c781290ee3fa0fd372" +dependencies = [ + "gloo-console 0.3.0", + "gloo-dialogs 0.2.0", + "gloo-events 0.2.0", + "gloo-file 0.3.0", + "gloo-history 0.2.2", + "gloo-net 0.5.0", + "gloo-render 0.2.0", + "gloo-storage 0.3.0", + "gloo-timers 0.3.0", + "gloo-utils 0.2.0", + "gloo-worker 0.5.0", +] + +[[package]] +name = "gloo-console" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b7ce3c05debe147233596904981848862b068862e9ec3e34be446077190d3f" +dependencies = [ + "gloo-utils 0.1.7", + "js-sys", + "serde", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-console" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a17868f56b4a24f677b17c8cb69958385102fa879418052d60b50bc1727e261" +dependencies = [ + "gloo-utils 0.2.0", + "js-sys", + "serde", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-dialogs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67062364ac72d27f08445a46cab428188e2e224ec9e37efdba48ae8c289002e6" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-dialogs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4748e10122b01435750ff530095b1217cf6546173459448b83913ebe7815df" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-events" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b107f8abed8105e4182de63845afcc7b69c098b7852a813ea7462a320992fc" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-events" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c26fb45f7c385ba980f5fa87ac677e363949e065a083722697ef1b2cc91e41" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-file" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d5564e570a38b43d78bdc063374a0c3098c4f0d64005b12f9bbe87e869b6d7" +dependencies = [ + "gloo-events 0.1.2", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-file" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97563d71863fb2824b2e974e754a81d19c4a7ec47b09ced8a0e6656b6d54bd1f" +dependencies = [ + "futures-channel", + "gloo-events 0.2.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-history" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85725d90bf0ed47063b3930ef28e863658a7905989e9929a8708aab74a1d5e7f" +dependencies = [ + "gloo-events 0.1.2", + "gloo-utils 0.1.7", + "serde", + "serde-wasm-bindgen 0.5.0", + "serde_urlencoded", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-history" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "903f432be5ba34427eac5e16048ef65604a82061fe93789f2212afc73d8617d6" +dependencies = [ + "getrandom", + "gloo-events 0.2.0", + "gloo-utils 0.2.0", + "serde", + "serde-wasm-bindgen 0.6.5", + "serde_urlencoded", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66b4e3c7d9ed8d315fd6b97c8b1f74a7c6ecbbc2320e65ae7ed38b7068cc620" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils 0.1.7", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac9e8288ae2c632fa9f8657ac70bfe38a1530f345282d7ba66a1f70b72b7dc4" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils 0.2.0", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-net" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43aaa242d1239a8822c15c645f02166398da4f8b5c4bae795c1f5b44e9eee173" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils 0.2.0", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-render" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd9306aef67cfd4449823aadcd14e3958e0800aa2183955a309112a84ec7764" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-render" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56008b6744713a8e8d98ac3dcb7d06543d5662358c9c805b4ce2167ad4649833" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-storage" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6ab60bf5dbfd6f0ed1f7843da31b41010515c745735c970e821945ca91e480" +dependencies = [ + "gloo-utils 0.1.7", + "js-sys", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-storage" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc8031e8c92758af912f9bc08fbbadd3c6f3cfcbf6b64cdf3d6a81f0139277a" +dependencies = [ + "gloo-utils 0.2.0", + "js-sys", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13471584da78061a28306d1359dd0178d8d6fc1c7c80e5e35d27260346e0516a" +dependencies = [ + "anymap2", + "bincode", + "gloo-console 0.2.3", + "gloo-utils 0.1.7", + "js-sys", + "serde", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76495d3dd87de51da268fa3a593da118ab43eb7f8809e17eb38d3319b424e400" +dependencies = [ + "bincode", + "futures", + "gloo-utils 0.2.0", + "gloo-worker-macros", + "js-sys", + "pinned", + "serde", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085f262d7604911c8150162529cefab3782e91adb20202e8658f7275d2aefe5d" +dependencies = [ + "bincode", + "futures", + "gloo-utils 0.2.0", + "gloo-worker-macros", + "js-sys", + "pinned", + "serde", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-worker-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956caa58d4857bc9941749d55e4bd3000032d8212762586fa5705632967140e7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "implicit-clone" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a9aa791c7b5a71b636b7a68207fdebf171ddfc593d9c8506ec4cbc527b6a84" +dependencies = [ + "implicit-clone-derive", + "indexmap", +] + +[[package]] +name = "implicit-clone-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "699c1b6d335e63d0ba5c1e1c7f647371ce989c3bcbe1f7ed2b85fa56e3bd1a21" +dependencies = [ + "quote", + "syn 2.0.106", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[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.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[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.106", +] + +[[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 = "pinned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a829027bd95e54cfe13e3e258a1ae7b645960553fb82b75ff852c29688ee595b" +dependencies = [ + "futures", + "rustversion", + "thiserror 1.0.69", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "heapless", + "serde", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.106", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prokio" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b55e106e5791fa5a13abd13c85d6127312e8e09098059ca2bc9b03ca4cf488" +dependencies = [ + "futures", + "gloo 0.8.1", + "num_cpus", + "once_cell", + "pin-project", + "pinned", + "tokio", + "tokio-stream", + "wasm-bindgen-futures", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[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 = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[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.106", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "pin-project-lite", +] + +[[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", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-logger" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074649a66bb306c8f2068c9016395fa65d8e08d2affcbf95acf3c24c3ab19718" +dependencies = [ + "log", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "yew" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f1a03f255c70c7aa3e9c62e15292f142ede0564123543c1cc0c7a4f31660cac" +dependencies = [ + "console_error_panic_hook", + "futures", + "gloo 0.10.0", + "implicit-clone", + "indexmap", + "js-sys", + "prokio", + "rustversion", + "serde", + "slab", + "thiserror 1.0.69", + "tokio", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "yew-macro", +] + +[[package]] +name = "yew-macro" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fd8ca5166d69e59f796500a2ce432ff751edecbbb308ca59fd3fe4d0343de2" +dependencies = [ + "boolinator", + "once_cell", + "prettyplease", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "yew-router" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca1d5052c96e6762b4d6209a8aded597758d442e6c479995faf0c7b5538e0c6" +dependencies = [ + "gloo 0.10.0", + "js-sys", + "route-recognizer", + "serde", + "serde_urlencoded", + "tracing", + "urlencoding", + "wasm-bindgen", + "web-sys", + "yew", + "yew-router-macro", +] + +[[package]] +name = "yew-router-macro" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42bfd190a07ca8cfde7cd4c52b3ac463803dc07323db8c34daa697e86365978c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] diff --git a/plan/Cargo.toml b/plan/Cargo.toml new file mode 100644 index 0000000..eab9809 --- /dev/null +++ b/plan/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "plan" +version = "0.1.0" +edition = "2024" + +[dependencies] +web-sys = { version = "0.3.77", features = [ + "HtmlTableCellElement", + "Event", + "EventTarget", + "HtmlImageElement", + "HtmlDivElement", + "HtmlSelectElement", + "DomException", + "KeyboardEvent", + "Navigator", + "Permissions", + "PermissionDescriptor", + "PermissionName", + "PermissionStatus", + "PermissionState", + "AbortController", + "HtmlSpanElement", + "ReadableStreamDefaultReader", +] } +log = "0.4" +yew = { version = "0.21", features = ["csr"] } +yew-router = "0.18.0" +serde = { version = "1.0", features = ["derive"] } +gloo = "0.11" +wasm-logger = "0.2" +instant = { version = "0.1", features = ["wasm-bindgen"] } +once_cell = "1" +chrono = "0.4.40" +futures = "0.3.31" +wasm-bindgen-futures = "0.4.50" +wasm-bindgen = { version = "0.2.100" } +postcard = "1.0.0" +thiserror = { version = "2" } +plan-proto = { path = "../plan-proto", features = ["client"] } +ciborium = { version = "0.2" } +chrono-humanize = { version = "0.2.3", features = ["wasmbind"] } diff --git a/plan/Trunk.toml b/plan/Trunk.toml new file mode 100644 index 0000000..104387a --- /dev/null +++ b/plan/Trunk.toml @@ -0,0 +1,15 @@ +[build] +target = "index.html" # The index HTML file to drive the bundling process. +html_output = "index.html" # The name of the output HTML file. +# release = false # Build in release mode. +release = true # Build in release mode. +dist = "dist" # The output dir for all final assets. +public_url = "/" # The public URL from which assets are to be served. +filehash = true # Whether to include hash values in the output file names. +inject_scripts = true # Whether to inject scripts (and module preloads) into the finalized output. +offline = false # Run without network access +frozen = false # Require Cargo.lock and cache are up to date +locked = false # Require Cargo.lock is up to date +minify = "on_release" # Control minification: can be one of: never, on_release, always +# minify = "always" # Control minification: can be one of: never, on_release, always +no_sri = false # Allow disabling sub-resource integrity (SRI) diff --git a/plan/dist/index-1cee5a016147b48c.css b/plan/dist/index-1cee5a016147b48c.css new file mode 100644 index 0000000..d482889 --- /dev/null +++ b/plan/dist/index-1cee5a016147b48c.css @@ -0,0 +1 @@ +body{background-color:#000;color:#fff;margin:0}body *{font-family:"Cute Font"}.content{margin:8px;display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center}.nfc-form{font-size:2em;display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center}.nfc-form button{margin-top:10px;font-size:1em}button{background-color:#000;color:#fff;border:1px solid #fff;cursor:pointer}button:hover{background-color:#fff;color:#000}button:disabled{border-color:rgba(255,255,255,.3);color:rgba(255,255,255,.3)}button:disabled:hover{background-color:rgba(255,255,255,.1)}.content{flex-direction:column;flex-wrap:nowrap;align-items:center}.error{flex-direction:column;flex-wrap:nowrap;align-items:center;background-color:rgba(255,0,0,.1);border:1px solid rgba(255,0,0,.3);text-align:center}.calendar{user-select:none;width:max-content}.date-span{font-size:2rem}.week{display:flex;flex-direction:row;flex-wrap:wrap;list-style:none;gap:1vw;max-width:80vw}@media only screen and (max-width: 999px){.day{width:50vw}}.day{padding:10px 30px 10px 30px;border:1px solid rgba(255,255,255,.3);display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center}.date{font-size:1.2rem}.day-tiles{padding-left:0;display:flex;flex-direction:column;flex-wrap:nowrap;list-style:none}.tile{flex-grow:1;flex-shrink:1;padding:10px;cursor:pointer;color:rgba(255,255,255,.7)}.tile.pending{background-color:red;color:#000}.tile.pending:hover{background-color:rgba(255,255,255,.7)}.tile.selected-mine{color:#fff}.tile.selected-mine.border-middle{border-left:1px solid #fff;border-right:1px solid #fff}.tile.selected-mine.border-top{border-left:1px solid #fff;border-right:1px solid #fff;border-top:1px solid #fff}.tile.selected-mine.border-bottom{border-left:1px solid #fff;border-right:1px solid #fff;border-bottom:1px solid #fff}.tile.selected-mine.border-lone{border:1px solid #fff}.tile[style]{background-color:var(--color)}.tile:hover{backdrop-filter:invert(30%)}nav.user-nav{display:flex;flex-direction:row;flex-wrap:nowrap;gap:20px;user-select:none;width:max-content;padding:10px;margin:0;align-items:baseline;font-size:1rem}nav.user-nav .username{width:max-content}nav.user-nav .sign-out{position:absolute;right:20px}nav.user-nav button{padding-top:5px;padding-bottom:5px;font-size:1rem}.new-plan{display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center;gap:10px}.field{display:flex;flex-direction:column;flex-wrap:nowrap;font-size:1.5em;width:100%}.days{display:flex;flex-direction:row;flex-wrap:wrap;gap:10px}.faint{filter:opacity(50%);font-size:.5em}.create-day{border:1px solid #fff;padding:10px;display:flex;flex-direction:column;align-items:flex-start;flex-wrap:nowrap}.create-day .remove{width:100%;text-align:center}.set-date{display:flex;flex-direction:row;flex-wrap:nowrap}.set-date>button{flex-grow:1}.set-date>.date{padding-left:5px;padding-right:5px}.date-detail{width:100%;text-align:center}.message{display:flex;flex-direction:column;width:100%;align-items:center;flex-wrap:nowrap}.click-backdrop{z-index:4;background-color:rgba(0,0,0,.7);position:fixed;top:0;left:0;height:200vh;width:100vw;background-size:cover}.dialog{z-index:5;width:100vw;height:100vh;display:flex;flex-direction:column;flex-wrap:nowrap;position:fixed;top:0;left:0;align-items:center;justify-content:center}.dialog .dialog-box{font-size:2rem;border:1px solid #fff;display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center;padding-left:30px;padding-right:30px;padding-top:10px;padding-bottom:10px;background-color:#000}.dialog .dialog-box .options{display:flex;flex-direction:row;flex-wrap:wrap;gap:20px}.dialog .dialog-box .options>button{min-width:4cm;font-size:1em}.users-available{list-style:none}.users-available .user{display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center}.users-available .user:hover{background-color:rgba(255,255,255,.3)}.users-available [last_available]:hover::after{display:block;position:absolute;content:attr(last_available);border:1px solid #fff;background:rgba(0,0,0,.7);padding:.25em}.signup,.signin{display:flex;flex-direction:column;align-items:center;font-size:1.5rem}.signup input,.signin input{background-color:#000;border:1px solid #fff;color:#fff}.signup .submit,.signin .submit{margin-top:30px;font-size:1.5rem}.fields{display:flex;align-items:center;flex-direction:column;gap:10px}@media only screen and (max-width: 999px){.created-plans,.participating-plans{width:100%}}@media only screen and (min-width: 1000px){.created-plans,.participating-plans{width:40vw}}.created-plans,.participating-plans{padding:0 30px 0 30px;align-items:center;display:flex;gap:10px;flex-direction:column}.plan-column{width:100%}.main-plans{user-select:none;text-align:center;display:flex;flex-direction:row;flex-wrap:wrap;gap:30px}.plans{list-style:none;display:flex;flex-direction:column;gap:10px;padding-left:0}.plans .plan-headline button{width:100%}.plans .plan-detail{display:flex;flex-direction:row;gap:30px;font-size:1.5rem;padding:10px}.plans .plan-detail .start-date{filter:opacity(50%)}.splash{display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center;width:100%}.splash .options{display:flex;flex-direction:row;flex-wrap:wrap;gap:1cm}.splash .options button{font-size:2rem} diff --git a/plan/dist/index.html b/plan/dist/index.html new file mode 100644 index 0000000..e7e4500 --- /dev/null +++ b/plan/dist/index.html @@ -0,0 +1,8 @@ +plan \ No newline at end of file diff --git a/plan/dist/plan-9b4f658762b65072.js b/plan/dist/plan-9b4f658762b65072.js new file mode 100644 index 0000000..07e54bc --- /dev/null +++ b/plan/dist/plan-9b4f658762b65072.js @@ -0,0 +1 @@ +let T=`boolean`,a5=977,V=`function`,K=null,N=`utf-8`,_=`undefined`,Q=1,R=3,U=`string`,L=0,S=`number`,P=4,X=`Object`,a0=4294967297,W=Array,a3=Date,Y=Error,Z=FinalizationRegistry,$=Number,a1=Object,a6=Object.getPrototypeOf,a2=Reflect,M=Uint8Array,a4=globalThis,O=undefined;var k=(a=>a===O||a===K);var z=((b,c)=>{a.wasm_bindgen__convert__closures_____invoke__h829941794c876fed(b,c)});var x=((b,c,d)=>{a.closure1018_externref_shim(b,c,d)});var u=((b,c,d,e)=>{const f={a:b,b:c,cnt:Q,dtor:d};const g=(...b)=>{f.cnt++;const c=f.a;f.a=L;try{return e(c,f.b,...b)}finally{if(--f.cnt===L){a.__wbindgen_export_7.get(f.dtor)(c,f.b);t.unregister(f)}else{f.a=c}}};g.original=f;t.register(g,f,f);return g});var g=((a,b)=>{f+=b;if(f>=e){d=new TextDecoder(N,{ignoreBOM:!0,fatal:!0});d.decode();f=b};return d.decode(c().subarray(a,a+ b))});var c=(()=>{if(b===K||b.byteLength===L){b=new M(a.memory.buffer)};return b});var A=((b,c,d)=>{a.closure872_externref_shim(b,c,d)});var q=((a,b,d)=>{if(d===O){const d=p.encode(a);const e=b(d.length,Q)>>>L;c().subarray(e,e+ d.length).set(d);o=d.length;return e};let e=a.length;let f=b(e,Q)>>>L;const g=c();let h=L;for(;h127)break;g[f+ h]=b};if(h!==e){if(h!==L){a=a.slice(h)};f=d(f,e,e=h+ a.length*R,Q)>>>L;const b=c().subarray(f+ h,f+ e);const g=p.encodeInto(a,b);h+=g.written;f=d(f,e,h,Q)>>>L};o=h;return f});var m=(()=>{if(l===K||l.buffer.detached===!0||l.buffer.detached===O&&l.buffer!==a.memory.buffer){l=new DataView(a.memory.buffer)};return l});var F=(()=>{const b={};b.wbg={};b.wbg.__wbg_Error_e17e777aac105295=((a,b)=>{const c=Y(h(a,b));return c});b.wbg.__wbg_Number_998bea33bd87c3e0=(a=>{const b=$(a);return b});b.wbg.__wbg_addEventListener_775911544ac9d643=function(){return j(((a,b,c,d)=>{a.addEventListener(h(b,c),d)}),arguments)};b.wbg.__wbg_addEventListener_d1c39a5c2329c624=function(){return j(((a,b,c,d,e)=>{a.addEventListener(h(b,c),d,e)}),arguments)};b.wbg.__wbg_arrayBuffer_9c99b8e2809e8cbb=function(){return j((a=>{const b=a.arrayBuffer();return b}),arguments)};b.wbg.__wbg_bubbles_c2875b63b0f1f311=(a=>{const b=a.bubbles;return b});b.wbg.__wbg_cachekey_57601dac16343711=(a=>{const b=a.__yew_subtree_cache_key;return k(b)?a0:b>>>L});b.wbg.__wbg_call_13410aac570ffff7=function(){return j(((a,b)=>{const c=a.call(b);return c}),arguments)};b.wbg.__wbg_cancelBubble_a4c48803e199b5e8=(a=>{const b=a.cancelBubble;return b});b.wbg.__wbg_childNodes_5c44c2ec67a90732=(a=>{const b=a.childNodes;return b});b.wbg.__wbg_clearTimeout_96804de0ab838f26=(a=>{const b=clearTimeout(a);return b});b.wbg.__wbg_cloneNode_79d46b18d5619863=function(){return j((a=>{const b=a.cloneNode();return b}),arguments)};b.wbg.__wbg_close_6437264570d2d37f=function(){return j((a=>{a.close()}),arguments)};b.wbg.__wbg_code_177e3bed72688e58=(a=>{const b=a.code;return b});b.wbg.__wbg_code_89056d52bf1a8bb0=(a=>{const b=a.code;return b});b.wbg.__wbg_composedPath_e5b3f0b3e8415bb5=(a=>{const b=a.composedPath();return b});b.wbg.__wbg_createElementNS_ffbb8bb20b2a7e4c=function(){return j(((a,b,c,d,e)=>{const f=a.createElementNS(b===L?O:h(b,c),h(d,e));return f}),arguments)};b.wbg.__wbg_createElement_4909dfa2011f2abe=function(){return j(((a,b,c)=>{const d=a.createElement(h(b,c));return d}),arguments)};b.wbg.__wbg_createTextNode_c71a51271fadf515=((a,b,c)=>{const d=a.createTextNode(h(b,c));return d});b.wbg.__wbg_data_9ab529722bcc4e6c=(a=>{const b=a.data;return b});b.wbg.__wbg_debug_7f3000e7358ea482=((a,b,c,d)=>{console.debug(a,b,c,d)});b.wbg.__wbg_dispatchEvent_cb7e5ff30130cf80=function(){return j(((a,b)=>{const c=a.dispatchEvent(b);return c}),arguments)};b.wbg.__wbg_document_7d29d139bd619045=(a=>{const b=a.document;return k(b)?L:i(b)});b.wbg.__wbg_entries_2be2f15bd5554996=(a=>{const b=a1.entries(a);return b});b.wbg.__wbg_error_0889f151acea569e=((a,b,c,d)=>{console.error(a,b,c,d)});b.wbg.__wbg_error_3c7d958458bf649b=((b,c)=>{var d=n(b,c).slice();a.__wbindgen_free(b,c*P,P);console.error(...d)});b.wbg.__wbg_error_7534b8e9a36f1ab4=((b,c)=>{let d;let e;try{d=b;e=c;console.error(h(b,c))}finally{a.__wbindgen_free(d,e,Q)}});b.wbg.__wbg_error_99981e16d476aa5c=(a=>{console.error(a)});b.wbg.__wbg_fetch_44b6058021aef5e3=((a,b)=>{const c=a.fetch(b);return c});b.wbg.__wbg_fetch_87aed7f306ec6d63=((a,b)=>{const c=a.fetch(b);return c});b.wbg.__wbg_focus_8541343802c6721b=function(){return j((a=>{a.focus()}),arguments)};b.wbg.__wbg_from_88bc52ce20ba6318=(a=>{const b=W.from(a);return b});b.wbg.__wbg_getItem_9fc74b31b896f95a=function(){return j(((b,c,d,e)=>{const f=c.getItem(h(d,e));var g=k(f)?L:q(f,a.__wbindgen_malloc,a.__wbindgen_realloc);var i=o;m().setInt32(b+ P*Q,i,!0);m().setInt32(b+ P*L,g,!0)}),arguments)};b.wbg.__wbg_getTime_6bb3f64e0f18f817=(a=>{const b=a.getTime();return b});b.wbg.__wbg_getTimezoneOffset_1e3ddc1382e7c8b0=(a=>{const b=a.getTimezoneOffset();return b});b.wbg.__wbg_get_0da715ceaecea5c8=((a,b)=>{const c=a[b>>>L];return c});b.wbg.__wbg_get_458e874b43b18b25=function(){return j(((a,b)=>{const c=a2.get(a,b);return c}),arguments)};b.wbg.__wbg_getwithrefkey_1dc361bd10053bfe=((a,b)=>{const c=a[b];return c});b.wbg.__wbg_hash_0ce7fe010ac2cc6b=((b,c)=>{const d=c.hash;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_hash_61a93e84f71459f5=function(){return j(((b,c)=>{const d=c.hash;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)}),arguments)};b.wbg.__wbg_history_bf9f443b5be043de=function(){return j((a=>{const b=a.history;return b}),arguments)};b.wbg.__wbg_host_484d55073e076054=(a=>{const b=a.host;return b});b.wbg.__wbg_href_33fba0e78b8c3084=((b,c)=>{const d=c.href;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_href_65a798194bf5ead5=function(){return j(((b,c)=>{const d=c.href;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)}),arguments)};b.wbg.__wbg_id_cf626ed5d83cb98d=((b,c)=>{const d=c.id;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_info_15c3631232fceddb=((a,b,c,d)=>{console.info(a,b,c,d)});b.wbg.__wbg_insertBefore_30228206e8f1d3fb=function(){return j(((a,b,c)=>{const d=a.insertBefore(b,c);return d}),arguments)};b.wbg.__wbg_instanceof_ArrayBuffer_67f3012529f6a2dd=(a=>{let b;try{b=a instanceof ArrayBuffer}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_Element_162e4334c7d6f450=(a=>{let b;try{b=a instanceof Element}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_Error_76149ae9b431750e=(a=>{let b;try{b=a instanceof Y}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_HtmlElement_d60c51c41eb8699a=(a=>{let b;try{b=a instanceof HTMLElement}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_HtmlInputElement_486d1ca974d99353=(a=>{let b;try{b=a instanceof HTMLInputElement}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_HtmlSelectElement_432da62d310182dc=(a=>{let b;try{b=a instanceof HTMLSelectElement}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_Response_50fde2cd696850bf=(a=>{let b;try{b=a instanceof Response}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_ShadowRoot_f3723967133597a3=(a=>{let b;try{b=a instanceof ShadowRoot}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_Uint8Array_9a8378d955933db7=(a=>{let b;try{b=a instanceof M}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_Window_12d20d558ef92592=(a=>{let b;try{b=a instanceof Window}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_instanceof_WorkerGlobalScope_85d487cc157fd065=(a=>{let b;try{b=a instanceof WorkerGlobalScope}catch(a){b=!1}const c=b;return c});b.wbg.__wbg_isSafeInteger_1c0d1af5542e102a=(a=>{const b=$.isSafeInteger(a);return b});b.wbg.__wbg_is_8346b6c36feaf71a=((a,b)=>{const c=a1.is(a,b);return c});b.wbg.__wbg_key_caac8fafdd6d5317=((b,c)=>{const d=c.key;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_lastChild_0f60bc497b807d25=(a=>{const b=a.lastChild;return k(b)?L:i(b)});b.wbg.__wbg_length_186546c51cd61acd=(a=>{const b=a.length;return b});b.wbg.__wbg_length_6bb7e81f9d7713e4=(a=>{const b=a.length;return b});b.wbg.__wbg_listenerid_ed1678830a5b97ec=(a=>{const b=a.__yew_listener_id;return k(b)?a0:b>>>L});b.wbg.__wbg_localStorage_9330af8bf39365ba=function(){return j((a=>{const b=a.localStorage;return k(b)?L:i(b)}),arguments)};b.wbg.__wbg_location_92d89c32ae076cab=(a=>{const b=a.location;return b});b.wbg.__wbg_log_ddbf5bc3d4dae44c=((a,b,c,d)=>{console.log(a,b,c,d)});b.wbg.__wbg_message_125a1b2998b3552a=(a=>{const b=a.message;return b});b.wbg.__wbg_message_5481231e71ccaf7b=((b,c)=>{const d=c.message;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_name_f733db82b3c2804d=(a=>{const b=a.name;return b});b.wbg.__wbg_name_f75f535832c8ea6b=((b,c)=>{const d=c.name;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_namespaceURI_020a81e6d28c2c96=((b,c)=>{const d=c.namespaceURI;var e=k(d)?L:q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);var f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_new0_b0a0a38c201e6df5=(()=>{const a=new a3();return a});b.wbg.__wbg_new_19c25a3f2fa63a02=(()=>{const a=new a1();return a});b.wbg.__wbg_new_5a2ae4557f92b50e=(a=>{const b=new a3(a);return b});b.wbg.__wbg_new_638ebfaedbf32a5e=(a=>{const b=new M(a);return b});b.wbg.__wbg_new_8a6f238a6ece86ea=(()=>{const a=new Y();return a});b.wbg.__wbg_new_95e31b8bc5de31d6=function(){return j(((a,b)=>{const c=new URL(h(a,b));return c}),arguments)};b.wbg.__wbg_new_a9b6e13df060b671=function(){return j(((a,b)=>{const c=new MouseEvent(h(a,b));return c}),arguments)};b.wbg.__wbg_new_e213f63d18b0de01=function(){return j(((a,b)=>{const c=new WebSocket(h(a,b));return c}),arguments)};b.wbg.__wbg_new_e8b27dfd3785875f=function(){return j((()=>{const a=new URLSearchParams();return a}),arguments)};b.wbg.__wbg_new_f6e53210afea8e45=function(){return j((()=>{const a=new Headers();return a}),arguments)};b.wbg.__wbg_newnoargs_254190557c45b4ec=((a,b)=>{const c=new Function(h(a,b));return c});b.wbg.__wbg_newwithbase_96f007ba18c568ff=function(){return j(((a,b,c,d)=>{const e=new URL(h(a,b),h(c,d));return e}),arguments)};b.wbg.__wbg_newwitheventinitdict_fe21d8ccd6054401=function(){return j(((a,b,c)=>{const d=new CloseEvent(h(a,b),c);return d}),arguments)};b.wbg.__wbg_newwithstr_1bc70be98f2e7425=function(){return j(((a,b)=>{const c=new Request(h(a,b));return c}),arguments)};b.wbg.__wbg_newwithstrandinit_b5d168a29a3fd85f=function(){return j(((a,b,c)=>{const d=new Request(h(a,b),c);return d}),arguments)};b.wbg.__wbg_newwithyearmonthdayhrminsec_3194e83daea43c6d=((a,b,c,d,e,f)=>{const g=new a3(a>>>L,b,c,d,e,f);return g});b.wbg.__wbg_nextSibling_1fb03516719cac0f=(a=>{const b=a.nextSibling;return k(b)?L:i(b)});b.wbg.__wbg_ok_2eac216b65d90573=(a=>{const b=a.ok;return b});b.wbg.__wbg_outerHTML_5fe297cb1fc146f2=((b,c)=>{const d=c.outerHTML;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_parentElement_48440a9a6ba034a8=(a=>{const b=a.parentElement;return k(b)?L:i(b)});b.wbg.__wbg_parentNode_cc820baee7401ca3=(a=>{const b=a.parentNode;return k(b)?L:i(b)});b.wbg.__wbg_pathname_e7278f48b2a6a5ad=((b,c)=>{const d=c.pathname;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_pathname_fdb9cca2dd58c31b=function(){return j(((b,c)=>{const d=c.pathname;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)}),arguments)};b.wbg.__wbg_prototypesetcall_3d4a26c1ed734349=((a,b,c)=>{M.prototype.set.call(r(a,b),c)});b.wbg.__wbg_querySelector_2bda8764de90ea1d=function(){return j(((a,b,c)=>{const d=a.querySelector(h(b,c));return k(d)?L:i(d)}),arguments)};b.wbg.__wbg_querySelector_438f2df379fbb8d2=function(){return j(((a,b,c)=>{const d=a.querySelector(h(b,c));return k(d)?L:i(d)}),arguments)};b.wbg.__wbg_queueMicrotask_25d0739ac89e8c88=(a=>{queueMicrotask(a)});b.wbg.__wbg_queueMicrotask_4488407636f5bf24=(a=>{const b=a.queueMicrotask;return b});b.wbg.__wbg_readyState_b0d20ca4531d3797=(a=>{const b=a.readyState;return b});b.wbg.__wbg_reason_97efd955be6394bd=((b,c)=>{const d=c.reason;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_reload_9fde301bc335e70d=function(){return j((a=>{a.reload()}),arguments)};b.wbg.__wbg_removeAttribute_cf35412842be6ae4=function(){return j(((a,b,c)=>{a.removeAttribute(h(b,c))}),arguments)};b.wbg.__wbg_removeChild_1c094e96ff042c2d=function(){return j(((a,b)=>{const c=a.removeChild(b);return c}),arguments)};b.wbg.__wbg_removeEventListener_6d5be9c2821a511e=function(){return j(((a,b,c,d)=>{a.removeEventListener(h(b,c),d)}),arguments)};b.wbg.__wbg_removeEventListener_b370c9d66874eec6=function(){return j(((a,b,c,d,e)=>{a.removeEventListener(h(b,c),d,e!==L)}),arguments)};b.wbg.__wbg_removeItem_487c5a070c7adaf7=function(){return j(((a,b,c)=>{a.removeItem(h(b,c))}),arguments)};b.wbg.__wbg_resolve_4055c623acdd6a1b=(a=>{const b=Promise.resolve(a);return b});b.wbg.__wbg_search_3a02a8f2a1a2e604=((b,c)=>{const d=c.search;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_search_73c5c4925b506661=function(){return j(((b,c)=>{const d=c.search;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)}),arguments)};b.wbg.__wbg_selectedIndex_71fb145a2e58f226=(a=>{const b=a.selectedIndex;return b});b.wbg.__wbg_send_aa9cb445685f0fd0=function(){return j(((a,b,c)=>{a.send(r(b,c))}),arguments)};b.wbg.__wbg_send_bdda9fac7465e036=function(){return j(((a,b,c)=>{a.send(h(b,c))}),arguments)};b.wbg.__wbg_setAttribute_d1baf9023ad5696f=function(){return j(((a,b,c,d,e)=>{a.setAttribute(h(b,c),h(d,e))}),arguments)};b.wbg.__wbg_setItem_7add5eb06a28b38f=function(){return j(((a,b,c,d,e)=>{a.setItem(h(b,c),h(d,e))}),arguments)};b.wbg.__wbg_setTimeout_eefe7f4c234b0c6b=function(){return j(((a,b)=>{const c=setTimeout(a,b);return c}),arguments)};b.wbg.__wbg_set_1c17f9738fac2718=function(){return j(((a,b,c,d,e)=>{a.set(h(b,c),h(d,e))}),arguments)};b.wbg.__wbg_set_453345bcda80b89a=function(){return j(((a,b,c)=>{const d=a2.set(a,b,c);return d}),arguments)};b.wbg.__wbg_setbinaryType_37f3cd35d7775a47=((a,b)=>{a.binaryType=C[b]});b.wbg.__wbg_setbody_c8460bdf44147df8=((a,b)=>{a.body=b});b.wbg.__wbg_setcachekey_bb5f908a0e3ee714=((a,b)=>{a.__yew_subtree_cache_key=b>>>L});b.wbg.__wbg_setcapture_9a5af32fdb4619e5=((a,b)=>{a.capture=b!==L});b.wbg.__wbg_setchecked_0c6fdca893f4a16f=((a,b)=>{a.checked=b!==L});b.wbg.__wbg_setcode_3d8eb30649405e81=((a,b)=>{a.code=b});b.wbg.__wbg_setheaders_0052283e2f3503d1=((a,b)=>{a.headers=b});b.wbg.__wbg_sethref_07131e420ded2edd=function(){return j(((a,b,c)=>{a.href=h(b,c)}),arguments)};b.wbg.__wbg_setinnerHTML_34e240d6b8e8260c=((a,b,c)=>{a.innerHTML=h(b,c)});b.wbg.__wbg_setlistenerid_3d14d37a42484593=((a,b)=>{a.__yew_listener_id=b>>>L});b.wbg.__wbg_setmethod_9b504d5b855b329c=((a,b,c)=>{a.method=h(b,c)});b.wbg.__wbg_setnodeValue_629799145cb84fd8=((a,b,c)=>{a.nodeValue=b===L?O:h(b,c)});b.wbg.__wbg_setonce_5b860c1f79d40d3b=((a,b)=>{a.once=b!==L});b.wbg.__wbg_setpassive_be202eba558bf454=((a,b)=>{a.passive=b!==L});b.wbg.__wbg_setreason_d56f0662fe6c410f=((a,b,c)=>{a.reason=h(b,c)});b.wbg.__wbg_setsearch_fbee2174e0389ccd=((a,b,c)=>{a.search=h(b,c)});b.wbg.__wbg_setsubtreeid_32b8ceff55862e29=((a,b)=>{a.__yew_subtree_id=b>>>L});b.wbg.__wbg_settitle_af9e0fec4dbb74d6=((a,b,c)=>{a.title=h(b,c)});b.wbg.__wbg_setvalue_06e05f2cb17fefdd=((a,b,c)=>{a.value=h(b,c)});b.wbg.__wbg_setvalue_4c91a711c0108335=((a,b,c)=>{a.value=h(b,c)});b.wbg.__wbg_stack_0ed75d68575b0f3c=((b,c)=>{const d=c.stack;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_state_a77e7af597629742=function(){return j((a=>{const b=a.state;return b}),arguments)};b.wbg.__wbg_static_accessor_GLOBAL_8921f820c2ce3f12=(()=>{const a=typeof global===_?K:global;return k(a)?L:i(a)});b.wbg.__wbg_static_accessor_GLOBAL_THIS_f0a4409105898184=(()=>{const a=typeof a4===_?K:a4;return k(a)?L:i(a)});b.wbg.__wbg_static_accessor_SELF_995b214ae681ff99=(()=>{const a=typeof self===_?K:self;return k(a)?L:i(a)});b.wbg.__wbg_static_accessor_WINDOW_cde3890479c675ea=(()=>{const a=typeof window===_?K:window;return k(a)?L:i(a)});b.wbg.__wbg_statusText_c285fe96dbd990df=((b,c)=>{const d=c.statusText;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_status_3fea3036088621d6=(a=>{const b=a.status;return b});b.wbg.__wbg_subtreeid_e65dfcc52d403fd9=(a=>{const b=a.__yew_subtree_id;return k(b)?a0:b>>>L});b.wbg.__wbg_tagName_0052175ec2444f12=((b,c)=>{const d=c.tagName;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_target_f2c963b447be6283=(a=>{const b=a.target;return k(b)?L:i(b)});b.wbg.__wbg_textContent_4e2b2a6c46694642=((b,c)=>{const d=c.textContent;var e=k(d)?L:q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);var f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_then_b33a773d723afa3e=((a,b,c)=>{const d=a.then(b,c);return d});b.wbg.__wbg_then_e22500defe16819f=((a,b)=>{const c=a.then(b);return c});b.wbg.__wbg_toString_78df35411a4fd40c=(a=>{const b=a.toString();return b});b.wbg.__wbg_toString_d8f537919ef401d6=(a=>{const b=a.toString();return b});b.wbg.__wbg_url_79bd91c4e84e8270=((b,c)=>{const d=c.url;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_value_57637cc189f7a639=((b,c)=>{const d=c.value;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_value_fdf54c7557edc2e8=((b,c)=>{const d=c.value;const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_warn_90eb15d986910fe9=((a,b,c,d)=>{console.warn(a,b,c,d)});b.wbg.__wbg_wasClean_ffb515fbcbcbdd3d=(a=>{const b=a.wasClean;return b});b.wbg.__wbg_wbindgenbooleanget_3fe6f642c7d97746=(a=>{const b=a;const c=typeof b===T?b:O;return k(c)?16777215:c?Q:L});b.wbg.__wbg_wbindgencbdrop_eb10308566512b88=(a=>{const b=a.original;if(b.cnt--==Q){b.a=L;return !0};const c=!1;return c});b.wbg.__wbg_wbindgendebugstring_99ef257a3ddda34d=((b,c)=>{const d=s(c);const e=q(d,a.__wbindgen_malloc,a.__wbindgen_realloc);const f=o;m().setInt32(b+ P*Q,f,!0);m().setInt32(b+ P*L,e,!0)});b.wbg.__wbg_wbindgenin_d7a1ee10933d2d55=((a,b)=>{const c=a in b;return c});b.wbg.__wbg_wbindgenisfunction_8cee7dce3725ae74=(a=>{const b=typeof a===V;return b});b.wbg.__wbg_wbindgenisobject_307a53c6bd97fbf8=(a=>{const b=a;const c=typeof b===`object`&&b!==K;return c});b.wbg.__wbg_wbindgenisstring_d4fa939789f003b0=(a=>{const b=typeof a===U;return b});b.wbg.__wbg_wbindgenisundefined_c4b71d073b92f3c5=(a=>{const b=a===O;return b});b.wbg.__wbg_wbindgenjsvallooseeq_9bec8c9be826bed1=((a,b)=>{const c=a==b;return c});b.wbg.__wbg_wbindgennumberget_f74b4c7525ac05cb=((a,b)=>{const c=b;const d=typeof c===S?c:O;m().setFloat64(a+ 8*Q,k(d)?L:d,!0);m().setInt32(a+ P*L,!k(d),!0)});b.wbg.__wbg_wbindgenstringget_0f16a6ddddef376f=((b,c)=>{const d=c;const e=typeof d===U?d:O;var f=k(e)?L:q(e,a.__wbindgen_malloc,a.__wbindgen_realloc);var g=o;m().setInt32(b+ P*Q,g,!0);m().setInt32(b+ P*L,f,!0)});b.wbg.__wbg_wbindgenthrow_451ec1a8469d7eb6=((a,b)=>{throw new Y(h(a,b))});b.wbg.__wbindgen_cast_00b46a24780e5aba=((a,b)=>{const c=u(a,b,a5,y);return c});b.wbg.__wbindgen_cast_18c348f059880d1c=((a,b)=>{const c=u(a,b,1029,w);return c});b.wbg.__wbindgen_cast_2241b6af4c4b2941=((a,b)=>{const c=h(a,b);return c});b.wbg.__wbindgen_cast_6eb4b54fc77bcc6f=((a,b)=>{const c=u(a,b,a5,z);return c});b.wbg.__wbindgen_cast_710e797c1e89866e=((a,b)=>{const c=v(a,b,871,A);return c});b.wbg.__wbindgen_cast_77bc3e92745e9a35=((b,c)=>{var d=r(b,c).slice();a.__wbindgen_free(b,c*Q,Q);const e=d;return e});b.wbg.__wbindgen_cast_969d5d473d4a5a92=((a,b)=>{const c=u(a,b,a5,y);return c});b.wbg.__wbindgen_cast_a2c1d45f46cd4c19=((a,b)=>{const c=u(a,b,a5,y);return c});b.wbg.__wbindgen_cast_acac365039f9bb7c=((a,b)=>{const c=u(a,b,945,B);return c});b.wbg.__wbindgen_cast_d6cd19b81560fd6e=(a=>{const b=a;return b});b.wbg.__wbindgen_cast_e2b597ec861af5b7=((a,b)=>{const c=u(a,b,1017,x);return c});b.wbg.__wbindgen_init_externref_table=(()=>{const b=a.__wbindgen_export_2;const c=b.grow(P);b.set(L,O);b.set(c+ L,O);b.set(c+ Q,K);b.set(c+ 2,!0);b.set(c+ R,!1)});return b});var v=((b,c,d,e)=>{const f={a:b,b:c,cnt:Q,dtor:d};const g=(...b)=>{f.cnt++;try{return e(f.a,f.b,...b)}finally{if(--f.cnt===L){a.__wbindgen_export_7.get(f.dtor)(f.a,f.b);f.a=L;t.unregister(f)}}};g.original=f;t.register(g,f,f);return g});var w=((b,c,d)=>{a.closure1030_externref_shim(b,c,d)});var I=(b=>{if(a!==O)return a;if(typeof b!==_){if(a6(b)===a1.prototype){({module:b}=b)}else{console.warn(`using deprecated parameters for \`initSync()\`; pass a single object instead`)}};const c=F();G(c);if(!(b instanceof WebAssembly.Module)){b=new WebAssembly.Module(b)};const d=new WebAssembly.Instance(b,c);return H(d,b)});var E=(async(a,b)=>{if(typeof Response===V&&a instanceof Response){if(typeof WebAssembly.instantiateStreaming===V){try{return await WebAssembly.instantiateStreaming(a,b)}catch(b){const c=a.ok&&D.has(a.type);if(c&&a.headers.get(`Content-Type`)!==`application/wasm`){console.warn(`\`WebAssembly.instantiateStreaming\` failed because your server does not serve Wasm with \`application/wasm\` MIME type. Falling back to \`WebAssembly.instantiate\` which is slower. Original error:\\n`,b)}else{throw b}}};const c=await a.arrayBuffer();return await WebAssembly.instantiate(c,b)}else{const c=await WebAssembly.instantiate(a,b);if(c instanceof WebAssembly.Instance){return {instance:c,module:a}}else{return c}}});var y=((b,c,d)=>{a.closure978_externref_shim(b,c,d)});var h=((a,b)=>{a=a>>>L;return g(a,b)});var J=(async(b)=>{if(a!==O)return a;if(typeof b!==_){if(a6(b)===a1.prototype){({module_or_path:b}=b)}else{console.warn(`using deprecated parameters for the initialization function; pass a single object instead`)}};if(typeof b===_){b=new URL(`plan_bg.wasm`,import.meta.url)};const c=F();if(typeof b===U||typeof Request===V&&b instanceof Request||typeof URL===V&&b instanceof URL){b=fetch(b)};G(c);const {instance:d,module:e}=await E(await b,c);return H(d,e)});var s=(a=>{const b=typeof a;if(b==S||b==T||a==K){return `${a}`};if(b==U){return `"${a}"`};if(b==`symbol`){const b=a.description;if(b==K){return `Symbol`}else{return `Symbol(${b})`}};if(b==V){const b=a.name;if(typeof b==U&&b.length>L){return `Function(${b})`}else{return `Function`}};if(W.isArray(a)){const b=a.length;let c=`[`;if(b>L){c+=s(a[L])};for(let d=Q;dQ){d=c[Q]}else{return toString.call(a)};if(d==X){try{return `Object(`+ JSON.stringify(a)+ `)`}catch(a){return X}};if(a instanceof Y){return `${a.name}: ${a.message}\n${a.stack}`};return d});var i=(b=>{const c=a.__externref_table_alloc();a.__wbindgen_export_2.set(c,b);return c});var G=((a,b)=>{});var H=((c,d)=>{a=c.exports;J.__wbindgen_wasm_module=d;l=K;b=K;a.__wbindgen_start();return a});var n=((b,c)=>{b=b>>>L;const d=m();const e=[];for(let f=b;f{a=a>>>L;return c().subarray(a/Q,a/Q+ b)});var B=((b,c)=>{a.wasm_bindgen__convert__closures_____invoke__h8c3f7762626cfd0d(b,c)});function j(b,c){try{return b.apply(this,c)}catch(b){const c=i(b);a.__wbindgen_exn_store(c)}}let a;let b=K;let d=new TextDecoder(N,{ignoreBOM:!0,fatal:!0});d.decode();const e=2146435072;let f=L;let l=K;let o=L;const p=new TextEncoder();if(!(`encodeInto` in p)){p.encodeInto=((a,b)=>{const c=p.encode(a);b.set(c);return {read:a.length,written:c.length}})};const t=typeof Z===_?{register:()=>{},unregister:()=>{}}:new Z(b=>{a.__wbindgen_export_7.get(b.dtor)(b.a,b.b)});const C=[`blob`,`arraybuffer`];const D=new Set([`basic`,`cors`,`default`]);export default J;export{I as initSync} \ No newline at end of file diff --git a/plan/dist/plan-9b4f658762b65072_bg.wasm b/plan/dist/plan-9b4f658762b65072_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..47169e3896227d5d3f637b29f5a97acc66f41893 GIT binary patch literal 1267967 zcmdqK3zQsHwJ=<-uIjGp>aOmd4j~C}x{W%ymt3p5o{e}-MTf_Qt6t&zuiwA!znXfI zbcUHQ)8TO!ml+@`3TV)%K~RF?B`S~bG$Lw%009F8h!`P2M8xn$MU4vPU;CV@?w-s9 zNaU{1|F2oAtNYYBr}o+Jz0a;1${Rn0rYMS@LhxCo`8?D zPGTk|DEOc!@aNh1bMz#30@~q|o*<{QPvRzUBR*@=l!@=1@L#K1^q;%p3hGVbgI^0Sl4$sNxolb@XcfT!fhjQE6cH43ne!d)2X z&YTU++}Q*W`YgcjS#a00pq(D2PNGNg7y2ytHhK~>3Zq5=CoG-@J^|Tq8a*j93P_-m zGd+3|H;NYn?JyFbM_~r?0WgiiyzJ;G{JTuAu7{DXffp=^ zmPKc_Oxsem&ex7Sl|_)ZYT zv1vM1BWg6sZR_2h-8=if88=nOQzJc!Y|S7Y=a7yg(djM6v*L#Ccvcidjum+n0}Gg! z%+&FMWi2%dZ8NkS(>8rI)&uIF`np78W20j&+tdx;iJG2n#hT|E6c1ez%#KH$6PKP6 zjjrglq9~5+*a#ZB;j4k=Q}2g<$qIwv$Qw(0HZ4ar!btUeM|a|eMKz)4y9r#Uu83Ad z|GG378|`@G%UXuvIEHFlx)qy#+%Vp(Z^H~#TW@-S(~O+JaVQJsO=x>^)H!`=XUSL; z1J$%J&@IgmHB~irKaQxQplgB}vTi-F!=~vNrsKz!(e%l>2MLr*N5(teNDz(2t$$xS z5{{nU(i&ky4NcRD;%38aHYmGq`NN}uH+({8bj&+BYBhCT^r_zDIf{_l~1Z zu%u-ezNMOu+R(fxHY1&YcPP2{lBMIF(XlgIe%y==L-$QTQVl(f2x=1k3`c_%r$i&2 zmK`>lp{6(e(9)W!VUoKgy#TJx($SGtvk^MYKyP@FYFmNllerd5TkOzqglE;PMr7!^ z5!j&>8>UKTO}Kt^MJF0N=EQ$JzGcQyqiF}e76+PP#SOw<2~Ui8r$pn+y&(EuA3wIG zHdN2iA}ee-K_h5dQ+kd^9k09lQmC);3FrrVwlhO8>-*%?8peHMF2y>M&nVZ zv$QiDwY<0)sc{q-q3_#9Xc5e$tUVg67;ibIq3MS1sExp~8=6mqbm25kJEn8WaEgG? zQUg;93@!2~HtoNUjxCGEjvgNMz2Osr(dALgF+;<# zgFrLwI8?1fK>m@89EnZ`tr49TjdYfdEbW9#gH9`s8d~TCL1?L_VW=8a2VBf0BLYCJ zX4{eON1@%Y949gzA|8j39%GR=4kBkqao99XKeF_u;U`>@VDxlv{6oW$Hv)J!H8b`D zKk&m)56MhD?HeqKf@M+IQUfav1J7ydvEgY}OpHN-`P01N6;Ue=W77z1)3l>7XhaTS z%N_|yFC%Dbo~>zts;Q2yn}mdoX@~^+96PdnMJFYa;aH&-cum^~n@!!+38Y=i3L+VW z$Bu;287*6jea$evMr1m1qhXP*(}@N5Ai~_eiQWi3s}bs&syU4?n1YV6$P3Rrq2qO; zmam2lHSi2m*FxQH+N57XqVZ@XZ24j6HDfQZ4a=@xE+7#h&OiTiDxd4TDl$U zL8zOdZQG`2*aWxzlX+e<@D0PX95YtqP$fv~GsRIu(_>2yHOE)ONY$tuuuMXpV0d&q zYFUPEH!Q=n)vyujc1#2#QK`Z3=tzX6)^3J|r@ zwp2ebnzrw#cGyU`I^mlDy1;DXEi*8Tpb-U@?KM?fZ;>e&1U+#5+B}1U*T7hpzW*qCPrmI2hsMHW(@x5fhUKrwD$0sgz%eKv? zrkRG}1>jt;u&~6d7>_#sXn1BTa12ZJ!`Lu1!wzGI zbV}B?#2a7IvNW%$M~)HOnqf9$ldLW6F&4!w%k=D~qcsgbHX|=gdUTD~@TeEInsFHE zs^$l}Zbr5m5@nULT;z=fOIo%bn1Ru3n7*l6mZeRxH_N@w5`yc{Zw7(a2t(5ebZsiG zVfg@(YHPX{84Wdz!bTK^)AXy?^sPwK!&tRc-?9_^nyzYeywfrqBQ#Cb*1^M7%_NXG ze3}@au*3^TPyhJnXr~qHc0+Gkwx;W5(@u3>Iw`=V>#^^tk?r_SpsS8Sme|Jwu@#wm zLsPvt@|?&p2@fP4#-mP43p6`!+PV{aLBrM@;>{+80c1C7dA1$dUTijPP(?ZdNO^peTdi;SM6FqbyUso-oX{cu8XvCEDm@V*@cUFu=t)^#svEGP7 z->|f1WbWN>xi>z(^t7nuM-8Xz!+@BSF+MeaBJ*Ee6x2hPqECOCv)F zqlOo+@O|(fjlggmRgbi0(>J53S~(a!W%=lM6n@O>ENMliug9tnoUEC?ZxXweFkr_U zJ2~pKVhAL3-!N=HvKmgJ7Zc!oe8+Ln!nWyKy06AstZN#vR|$oNM^A2rp&y%mpod22 zMTQYj$Mz|dr6ciZOEUxA(zS-(h=V8${V6?8_r^wAO*Qg0Gi*9mQ&Z!pNqQty4kLfX z$u00*RW-78(}_I8X-w%tBGP8F>1dH=g@$c;o*59KOJ*TmRL5z?nyGm~rg}jmfV{vz!4y+fh3=^h&xsqJ<~1TqP2?zXO}nZhvKzJ& z8xD8_p6MkXbHcodr#{{pYiWL9tA5mU;znc}4U@o>MDD$Q-be^8eakmP&2qd()6?V7 zF=OJ+Cu>|WHr%qCe%RCkBXW$$Y1k@RL2_SW;*RY^r?eo9Fg?{)1KSI|*q$PRCr2IJ zsTl{h;RDW^R@^i_>U~qyIPPS7VQ5CaYIzOE*PSHBO+bSDMc{dX6MJzOTA`_HHUTL? zd+2q%R@3v%M$>LI{2(wQD^O>N z(7jqSXqcWJH)78MLQb)BBhl$2qu$ub9DD-2! z;h9N3BVm-`XyoM1l9uKBcI0SrGqi0@j|?KMiEpxeY_v1lIdge59(4k5c(|p9hS#tH zEedVj(2XWl16(J)`%*YVB++GQM$?O$zM*TjsYYb(=@#ODEgk7NF8F7yrswFk15sR4 z*F!%EGo}Z#xOd{sSs>|J!)!ET3(Ow5O~RcglYH8Lj*dhhjbm&eB0UTPO?MiR9XP&9 z5{F4VmN4^~kvDeA=tyTt=$*M_>=f{cgO;u}jmXhMFY*jMutI8JFVQu!#W8NT-D7JEJFb#vq6Zo!Hdvrq+yNLj|pdQImMf zOUF;};^^3sPIPiK24PI7d9i64jYv})Np2!d2938I-LQNs(5*P~Vq5cwH=RHgjdaGA zM&qr9A2njl^h47$jb<~s-`-H!PKYy4nrFnJp(Y}oumboBOM{jd1kw2T=veFM<3GCC zJ-&6~F~^?JidD}r)TXAIPSepGgTl%21b0|cG~Lit&kIajjpI1BNidcqLH3^dgrVb) zYBigt-_Q&%vK%drn@uuj!uorUNPuyg4J~#WYS0KG9dce6j(v>z_hUcu;g9}%D+nXq zX{v_Z3@qD>yeY7EmP8}1sL?Q0HH_j&vmC7%6WEj0;U2!Od$z5Ic0>1KPmf4kn9yJ> z8Xp}#EovF6X$Dq9_ku9AJS~Z``uNx|oyf5b-_U){@f#+&PtpNI)i8D4F#RC(9MyN4 z9(6QGTq4=0`%6c{lcSMw%wbqAV$JfbFbu;e)@>_^{}Qv3c3(Qu3T;n|B25Jq(+EwI za8SaGX}`{rvC-38hN(q?<~fGd4DHCbNX|M*|D|06KO7rf-imxp)m6u|EK_Uv&eR;$ zM^>ETL*&_X{K(UFKXmLsj}qmR7!jg1Bh8L%+xEObQ_V&*F}8`0O>en$eAI78L8qmw zwrA>r<%dl>_T%KH(|QvmwL&BIntIcAnz5?tX{5FnLPs#D*xv)<1h&~Qy+AdC#M4NU z*eNLf=qM!CpuZkRR%{s!Nc7vbk;KG%^ZM0)`O|3#dJV>{4{TPcyx3;icW1c{U~sPrVm+YKMFNM z>%DG)9mWJj&1MugOxx4LF!XezKZ{8Ct%ZG@=!{M@HUc3_$Mc6HiUQ8WZeh|Z@WwkW z%?WhFiB+@dIBKXRCVE=8sNtKicjj22_4?L4X)}@vtb)1>}(}m zI}J8f^$p8w7`CHErssS6noUz9yJ-hnFY_>AmFIau ztn!K=^1R5hB6Ke+yd>gpa1=yEmIc1bi(;7<6c{P7f*_Vfxm;x>frlx0ej#7r(|hr} zAj`5M@PZ^s2Xmyk%!)iOKz|Wd!1JOk2*N_1uLy#`iu@d2bNiRDFJ znkVz3z>5-}WkrD#MS+$1vLXtiEDKdh23(1P#7Vr2haD>LS&$vs`4zXOp;iZ z6M2q>J6BmLt8jc)lEkb~5QQwyXS1x(cjWU5%W4=(F`H$x**QGViV9zqXF6CxkY%0~ z=apriuZpl5mY3(u<^{kEMh~8f7g$M=L{?P<9u}V*_~Mj90;0nwAV7c>@FHp9cu^2$ zi7d~vvMkNxC6R?iivnLQ2qG`aWtQiwFr~zc99t-)G!aFy%5(GJHWbhD9M4M_$AZiY z<>?17B_+r}QXrcQ$Q2}+W_eZ;;dZ>tQX;HXD#x>cR-s5`Q3ABF z0xQWNB}6PivIMpS6Y?ciU|Ep^;q4wgE6%5R5H*>@3Pq}k|c2{IK4x{YXrq5@sb35C9y0>_a2_WQomZKDQF3Xh_rCe4N&{BXZKo%tk6icxz$8o#>AHXuQECBn`A`8e( z$O!!fxmJTwB2NP|%0yQsIz}jnd}Ydd_IdC!%c4V+lA;_|;#rxSFAKa-k}8-bvFXEd zPY#YHB9Hl$;Dp2Khvfu8k_1U8;BoKtF@vJU2W|(EBodI=JC?(U1CTk615_&TL9i*{ z267}cf+H~sq9`dkAQr4BAip9=f}jWjt;jM>D+*1&UA2X$osI}WC}2kD!Vkdr0U`(j z;E^=JMNWoUfTJZ&;6zD;1&DY7aFqi!PFBfrJWENUD2Z@jzk+<*`v4ljfhS15V<@l~ zb{o3=@R3*+Y;Sl0JPfQM-umcYZtr{VNbUy>0tb4Bhi(apIF5z&X1Gk+z-I)Or9qoy zG8rH+FeN#re!;&oFpi9!K?G>%!}D;nEPNHH1SOon36vnr&jOBUnx?5lOS1gCL|)`1 zW;y-)?C-Oq)Fho@X{yW@nF-pRoZLuBaHb{Ur)-HoB|2qv>`aE@PVttGP)`&FV3#Bb z6rwXmT2Ox!QBRf+YV93Zv>=oTs8{&Plp)JU$2zSBP0#8dfTPgy;iW-DO^U_7{_$88 zQID2NeNCs3dG{2`eT`!gY5iJphP&A`H3v4SLvY zld(;E+Qr99A2{6`Kc$soq!o;goED9BT6iOW#aJ}nf@A5(X`{=cR%?mVXf_SaZW@7O zTX7UpuNTwV9lNpjta)g{EN~i>4*Gt(%sTmGA~GXNo)9DOLs^=;&(}R zO6&Ot<*zHh%U`8DAYZC%lP^;qk^ftHNdB7gsJvErSiVxZLj0z(RsM$Z7gCd{)h|llt6m}fxVlQ(Q2nxW zM|F*KbM-f_x~+PN^uy}K(hsU%m2RoNP`oYw72)Q}HI;7^?`Jkk*C^|h zJCy5`8S1UhKZdNuacPZB@>y?el4a)bG4a)7xoyrx(JzJ46Z!yma>zG%B z?=aUeH!#l%*E25*-(_AEKF55U`ETYW;acVj=GVfN%r4<-=0)Ku<^^Fr^Stm)<{Qkd z%5BQ}!Vi=iamBn=fmlR(t{xH8rSYP?6_+9aHrRxhDD;p}e zRdyD?n7=uDZRKU@7r6`h>ndLm?^Ql4Zc{!dZc$c=4=Il-7YPq47l`*MKUW@6J}+)p zz9{}wxlr7yTqHiAY*y}99#&S1_b3;OKU039JYD*cyrb}Z;fd^Hg<;n7$@~^XBYPuT-DRK3;e#^R@C{OW&7& zk$p6CdHMCykL72xUoD?g{+|4^><{>_m;X|_OWv9N9e-*0v*nHQFSBdPZ=(;_F5MzOn!T)iLHRf0*X8dF+)(-Uz!&njNLQ5asC={hAUi2+;(nQX zyt<>hS$wc`edQO$b;WB3zF2&$dfmWRit7iyT)ckZTgC4V{CDx{fvbww41B5hQgLJc z65+C61}*&A}}gg2zu=`Urr(XSMLlD|~AwetDW4TV*u9rDGQmoiruKbK!w_*~&j z;>G#L<(I@83-@qWWxgn1%)KU^pW7mRN&d00zW5FCH_~^DuZlMpzAS%%`<-;3w2Hf? z_&f2g!gq?_$=|?!H-97h?c59HU(!#Mc9ecDua+NW9+R)lZp+=xt;>8h_hR`a`r6{E z;#I;=q>GC`5U&%z%wAXgzIZ|Y+xd0*tMbq0ZWZqnx641v+{wQp-c)$0{8i=&`BTET zvrq7w_*aWt@|Oues;m+&7GBT3k^M&D%EA?eE6cC*w+wt)ypwsdbbaxrfv2h$m%drJ zao~Z0n+NV4_+IgW{DZlx%Ugs$b2k?s%zrh1UHN`t54SacNq&9#C&KT!TZ#|m|14Zn z-YT4v`9bmF{13Trm47Pyj(a43S^nDc!@^&=+lt%r*9kY2?-t(RewzPU{;Ki=!er*r z{F?l_@`J)|?xy0;@=xY&EI%UrhP$!2J%5+*o$^D%AGx3BzmmVce2?%tx1so0{?_bG z<@0rcJ(S&(Uz6K7aBkt@?B;==WH$_K$=)__fA*e%N3ypMY|DOs z;DPL219xZd9=JDq=fI}y4+geo?-;l-kFxPs&eMe_Q=s^}))oGA}7tajz(AGA}C|%fGL_R(&qJvoOiu zQT}219{CrA7Yfg3pDetQxwHJE@{h~AvQHI$E8Jebt^DKS1JZAm-zcvsKPvuCxRH5H zSk3%iSj(I%zN&1Nf3Lh)_?_}cX{)p$vs-#lx|IK1?$63j`47q)x!uZB@*kDI=KiGo zfq6)}TDq(H%jz}x-xYtE|GMySWou6gXrmHXs#<(rtB^SknYsNR%c zQ`%BJr}UHRebsxbmy{kY-d{bp^my^^;?~>))$>ZfEZtSyS$eAUNac@(-NjGJHwr(m zJXYCK{z>`O@~_L+@*DU+R(DmOtNyzBtLk5>f2uxP{d4uf>h9_@)kg-tUc9yNSMf=4 zbKy_L4fNxcXNpf({wS<0eN+Cle5L#?`M>4!<T>c8-*OhyVKN3GDZB@^Z9QGyDDETelP!6=9c{9nGM-3g6GPOX2hR&lg^hx0W9)-(UDz;ad6|`KQFoi*@9M6Xi#xr^`>3cNH#F))pQv ze5Q1P@{97$@@JKw7r&K%toYY~SMuKy{!;m6d5`=|`Sr@S;$7kf;riU=g+~gz#q&#_ zE=>;nwQ`a21^H&-jmodemvEPf=MAhJc(L?s`7_+*^0@@_r7UIuG4AZP ztF#g29^M{gD2t&;Qx=-$w-+#!%~FU#)Bb(05)kZwxUFw**b-~?3pX!PuwJeO_>N$7Sypg)-=9kwbXvx;|?&RthcCaIL8RbyU zJ#wU8aE}~bRxh^eN;T~C|-HCR69;~Q#2tb&x z9SWz}wZjnWa;Ld_*i-8Wv954x+ZC4AGN|Alxx8M3nd?Zzw|N)*D4;x&$=ZgO)n#{= zFjAY3WOw7r4~*2_jfyFZ?}6E=+IvwRUvhT|%WH!u5B;HGd2In=T(ym|E$|I8sn4 z9kLKr&_Md*pHLOeN`Jf$9fS@}f2b&TjZ2}!(4j7{&KXD5D|4^@FNDw>_rcGe4)~ip zw~Y>2hUU39OT#X+qKyuLPxr2iPHbPjc=DT>v(KviE6Tf*FRuRPS#6X@<+(Kt)lfaX z!yF`{Li%GalF@v3moU7n)<80PH=ts8SxrYJSb%{B;AEm%aI#Ply(b-Lqk{nhj=SZ_ z+bQ?HCvT@v&i(O2%yIRD=hm9I!QBk42hXh?;cBjmvTp9U`upeBjzpB3Z`VHHKEYhG z7=5b#5yZF`((P;NA6;4d7=mBt)9q_k*8a`?JqsNW)6vMFoKEpHUsao(I3iY9B=Jfzu*{uBm+#$=B3QM2x$gYS(5V z#yzqPAc1rq*><^hEsKzQCdw>x{}W|g{@6M-7dj9D5Ju{GkP`aTy6cJ~^?Ztw#V!Ry z{=A1p)LewxF5epgA_pTr1S4|kh!3NTOSfGLQFC3kQ>WaWkK9hRK@i+kPr|n$l!uiZ zg>rB@8f9FqT{~v+_0Md%;*q;AnvF6p+qvfat7^w0)@4rv=@U+^OYV-$akV;<+%?-^ zl0y*Ze*OXKxZ1xU&Rz8Yb!_c8B)Lyyj;$TfE<(&8_V^b+ioHG!LqjhCk)b9O=&E&I;n&$T@>>P!$rM0B+%6sGa#Y;1w@5O7z~QV4CHHg;qU4$TzID!{*OJN|IaS`AEquG;f2=; z;W&g)S^09#6;~iic{wvAAC|A<4z>Pkb+CJ24B>Nl85keFT_-}B1FOJy@tAuPJn|q_ z8O$Pe3fTUw_$Zg~QLc?LGoo|9=9rm}@`z9MLw>)RDnAvshho&Be$=_oP@{V}4_KN3 zYxyqL_&32CR!M(vSmRMw5C6?rI|O6xFlG^|gF+c(fIITcBA0duwd`NJ`UvHw=%akXNBK6)i!w5W$^OAp-AQ`v2#Q7` z%)e+16jvVcgs3@0VNG#}gw?mZ`{%b)%65su&>osVn}Ap6UH-Hw^xVT8SI_N3lVbav zoBMZ1RIszBwGr=5W{5}iH z=@}F5H1~rbC;MYL{{Jl_2VoQ)d|(WJ>{N8m!gI|&u(^(zIv4S(55hi{%c74W%B7Sq zazpX}fc##UK6OZ*)#d1Sz0(~1&wno*J$EWvD(Tv*-L=1eA13m^$Z+J}%fb(zy6|$k z@PY2aYwtAC=l#8`ea_Uim(sOYx@%Y7>9rewFKb^ob?r*J_A*fgIdo!I6%>IhszY)q zz4Wi$OND$%N|BYGQO-T9?N(6EWsjSS(*c>n01oI&O0gj4D#<}5LMBTvKMV8Mc`v~biq+Qb{=xeT;{mco6foH6mPm0mDNR*c^^f+pQ4cH zGHsM`nf5}8B1p)&EcTyE63V%GclC}w_gO)8nSC>$>bXJY#T{-^AoJ=DH+Azd ze3_oFpV`aT&qy$2h(rCA$`lhc!f8i#WU8x5mE(uZ+Bca%Bb$AZ7t` zhRslD0QLp&6*mjp1@#=>Fj!36%#nz3S(kBXSnOGIQEslqd^pcwLv^A{A1#;AtR9k% zl8FSP91cE@qhvrX$Wg4#%cwWgP^noWF&V)MO1)jw}?vaMhJYVJckA0wAy=6DIG@! z?AgPD0>C2}7(oWU$KBZ-h_A8a8gzM2G6U(EbIYf>%kfQE2^CQeZpTQN)hG$_co`&u zFv22_tmSYcT7O?l;x3a+i(W*}RnMys3(N-^po`(^e4GcK>OLx&9vlQOJuah};w-dte~`PY{UD z=TZ>CD);<=0|W7Yf;}_&YziVn2-QLIkWBxr;4+Jlj;+VLr*h{zB2xe~vj{ct4dze1 z!GTE@QC>G!h6qBifP)HnYhgO!tyKV*7g8JpUJu5xS&tcV%Urt8DP*QtqMlRe-u_h@ zJVG$tVB-gf)!YAhw(d0#ppthd+65L$)Fsfx4Cr8&R$eKCDXxHkP5na|cSXC9g{>@> z1#=1Bh|YVct*uGlsH!)DaZe_agzl`8GOC`5rSwR14!yp1V@9X1I*SngP2# z(^V`{jLYnOtAQDBg_*lLBn#+YWP!M$-NYM7=JosI)L#C0PodTGh)?|SJow{$zdug7 zY`YG7XQ{|g{q&^vqGxYX_v($W~m__IyoW!l?(j;!)6~Pz7J43Mb znt?rFaCI^D`R;}x54S-g*l zDA?=5#U%Tg$t3AevgMc}UP8Gv1mj%^q>1l_U|o{GW7Gy(?GMU&5OW0i`!g6VN-38) zfWdY;m_LBQRytTXfWhxe2WR(xa1UWQG8nzf{UvproZT6Kj`b3UD@cwxU5)m8BaU}SnK zJ~1-;bLXC}JP_l8Hx+;u2Vh)!D*gbBOAqV=F)n6m)(*h9pl(v2m}aNWr|US@fI>E? zbFK5FZWA)0h@TqPO^X{hVKoim#oN!tFc64M)kio_MM3#&oyP^FIHug|=F?)z1Gzb! zhw{DD%1jF^r%m~9Z)s&9s|j&bcBV*)h8!dgyEt5eCPSrRUuAH&CirL>(uO$ys$gTK z{F22*g)UvA06!38)cJ0Lj>mB!Oty+{&!-S2ZU4WSfe8i*#$T=Dg7K-b;@ka&sD;!v zw!l$*nWk{L_a?T^B6bj-$!pg+$Qg66@j@ZiVz#o%FRE_d<&=9Xbr$S73mNz4K_m#VSQd()?r-k3miU3QtHFoy&dn=(DwO12 z2~Cq#3K*Ep3zEy$*gP+}*&3VANG?}n^PJ@7YHXgB+)Ryy?72{5VWWnx!M;oXR?XXG z-u>@~*n*gp4oga6RfMZl?(GS0)D8&jt^p>583*`8$ZAdYiOHYRVV7@7!Y8* zU2r^NiFzRyPV8RzM0x=*a1u0QA3IE%L9tWrPP&a~D?E*tFSQZ(J*$S%#+~NxC9dsADkZFgkKed3_M%#E}04T}4` z`MiYn!ftZWon+d|=PN^``el%Lod$hQ)wyKoZW?hV7SHlJR+KDk7586-maOth8PB?s zN$t-BR`OssSPa-ormg%5Y{vq2QGM3piGP>p5vy=NwhDv5(k|V>Pdg=#u(0mreK)^M zA3GQ8VKi$o{VBw{d+xpYW%{^lR@&^M{A`I?b!TsJ{K_)5mEg0Wx)QkB06U#|m`fXe?u5u2PNsO`iiK7;jsU9y;Mq+us% z$b)d@=VPfPngR4r_xUlxSY4x;K17xX42TEnH4+n=bRL}Aj-Y*GPYiJ9L1^5}bZ-Z; zu@(y$SV4TVRdoOjL_gcEvt9j_0tl?Ws%~Qq3D69->%~NR2D_aSIO|Gs1$89_Uzy#m zLuCqqzAJGso6@dBISX9r6FRt(ZPzQwm9E@TkZ#`&peORT3Op3fVwPZA%N}Dh!-#^% zjIaX*Y8PxUyNa=yGr%FB+o%Hf$8OU3bQ_hszgE$0RO;6uyS$aLSWa;nJ zijm)#t-&y*whJ33P}9^P^9kig*nX^LYDJ=}YaC#3kXgfk6Nfz+I&pM_BPj54fFOtg zqn0rH*YIxRLTWwjaz|rDgRL^$XOLN6?-rZDhzyvgZa#i}omA1J#_sAml+hFso9=dJ z5R~?;2djv6QW2gq#L6hOpahbnih}JL({=UwESp_JyL3$kieMvFK(m0l1&krW0F=e- zr1S5FU1P#F*ofgL^epC>uJ!?23}R5D^9_)Qn^P@>Tlb-bUc{PXiWZ{xQwyy+5N$FG7|_C30vMaHa#`QCN|bvWQ8&bRVdZ=iZdu#cay4!trU48W z?zWC@*PzOP8f31d>s;#CvOGg^*!zQWG1g_VXNA}!sI7_8-i>Ya`>1cz@24Ij_IfMe zZwLO4kweV5#cT)Uq?}s;OHM7Mc4I_k;Kt8jMB%TyFrx6+7rThcV8nf*#zE{ZyL1w} z!!xg$wo5IbuKDC*n}SH2T0pHM-?>3%lCEXoyppbSgG{zoK#VIBbqx}U<5JlI2L_(6 zo@l#goC>0r5QQ6L21-1I25MChVr;1H2Opmx5K(x-$N4MAI< zO9E|!(AMXUK${9}YR^T1HV4|AZX3iDlnq84gP{BwBkq_Qhds>Ntf{#Uc*0j{qgjio z#k+*Xl=6s30()TR#k9?C1%y*aP*am3fU1??Nir7mD$tf$z$*1wh{MUZYtE`4WV1Vy z_SxtlH0#7`&a&BEH2Cm%uVfX21mY<%6cW0ImoOlXaUhXLr!0vVwSl&A@?;RG4z+p^ z)Z0pz{o?h?CuBk)h{6V$V`|{_&+1?j<$1I5z`s7+4f3M0`5*tBE(NXou)g9;3v@rlsk!DhsP5cmp_8q2zd^Owi1GGfU{yT zH({3(5+lgQNs^Sr#Q&_fU3v_hO-vLTKR)Dctha06^50Z%1H0qA9FV!7+=|P^7E)_~ zfkm=m$htUWxs0yQTD*roZ!!08b#`tN9nM;e&c6yWq&TI=p;=cUxV8a%EnK&loZG9I zoOQXQAaBSlU@oKK4FX^~YEz1R5bK`VF0eF(pIL_h<1$$BESp&knBXktN;qG35isrA zx+_i{-k%mjYym1QS&Pe93fvVG(3-lP_g# z);L^HxsbZJ?hdyL96WjtyR2@;!Z|B<&u0OY%aU|^+Pd!&) z_s4N5HV#Kv8J2||c{$5oC;ZhdfQz!c?YFDBLY&`BdGN- zQP+XRg0h$*DG7Y{jg(FD5^MGy5zLf>fEUbQ12|LC;?46C0A*r1As11E?EnQ8v6{x) zE|Aa1p%p1)hJ}()Dj^@C$r`$?`~lNsJqR9qG^uFcfG6M7O9Z;>am#JQ)ZrK1FbkNQ zXq#PEPrW1B-H=J%`?0PL@A{YpdFBW4h8GT_5=~8yxewxUXF{E+gGf|IV4jll*}8Ak z&V;?0(EVzP?l(s*VT2jIX;1?!pb|n9yh)J8&IG(Xwdr2~bEZ%l{rHnNInGH+9AXtGU ze+`=s;5QWEO3I27yx#;f6}6DsLU)5o$TTpEFmt3eZp&;$+ZYIU`FdI_b&1r3YlG2!@+scn5V%c&0zzj0*UZAJb%^Njgu4S)n=h` zjf2O0z%~E4OtFh#*0b6*4naPwHVfxF>zNvhX7vxO_y77gu*m%lpRCP78E~06H0wXF za@mf%Q8;y(yQr-^okO!0Pn?Bj!L5ssq%Pvk+>*<8>MSa?-FvAvak9#Yg&~M@F%NeU zMaa`*i^3pt27H|Lrj8*t0ElyQghjSt&gx}y!SumKiGpJTc!1)I={t}%!+VcGnDy|TOOm?|CY`I6MzdKzyn_PMv~a0+b9q2M7V5Qe_qcwGh9B-n?Tf>|GI z*C9aO-rbgEP+8gZx zK`)&L!6ts#E>+}9QpJGPVO>e|`|^6J#v&yVa=f*KL&C&}bOS@!eyy>H!}SIr&m~yO zu*)UMT(VKRvp!w*ZmaK2RL0$g`wnVO;}8oHP*o)QG)JZAD&?wTS^cImm2Gvj4X+Bu3r9q?L4Ow2H&gj+=u-QeA07 zeOMaeu3?a}tfxiyG9w5(3q{Zd`_CgqROs%6M0p)Q>v&AMAw8!jZkVL~l>>>$k@mh!7qsJyHmHNXtXLv? zq<>!(0WS1l*VCyZT!2@N%ox^p19*}Z9AqHe-K+ctZyu+)NRpStNn5DJfq)k$G3g{Z zKx%bPBpYELOY^yS%ee~q9m;(XZ%vVmRVK|~5e+vrqH({U?s;VPvEOkM&eQx&`yFfN z{>=$($g9ClC4h^A|4dTLGhfcnyi4j+5roi+Na_f5jW)i9N*zuIs$-WhDst zS22)wm}2+(+;w2%edRXuppo`YZ0<@Dn>+WJ*j$|?HYZ^llv%)1dnGp0glD#!*xXI$ zi=d0BL1vOk3l5-uAT2nUWI*dvgSZS}?}CH#$wgRIf5E|p42~>_x`3^Grdx1uA(N!N zdIbk?74X|FI9R>Uf`ir53J&tX-v?A^Ko-5Vn;gYP5ATe1)o+p{Cp8>pTqY$U9(E1j z`5o4!Yjl3DYt!%r^=}zc#KuXu-i;-- zYz!%4qe=A|e&`!7dJUwllow^#7zT_axOi%yPD*4+T?EMMGoQSJas}nt#P1>5&Ov5= zolE$fgTfkS5u%gdbn<(u9FV<=Tev&}`BAKkaCW`i-Pr+-Qra%{KI+0xE{3NUK}Eyn z&dR=xp4V66O&>Z@G&BzPY1rriPrAI8}X)LqAqbRAFIo>G;&G}Bvza7Ia3eic$2D7^CqS>XHO!60go`418k zP=m}#sdj|AQd0Krh!uORxNI=HLkqDy!Es%j)cWke}Unhxz#_S^6~X^Z%VQaL#V{ zr#eZV2}*#-;(EKMP}o`r-rY_2m3~2NRfpX>Xzlu`pk|V`u8#`3CTWAmL+}nOg;?0a z+)YE;mUWFbVj*BAXvI#YKzBjsL3N?F_sQ`Sg>58Q+aYv6hs;>>gI`rmG(lo#?6#`X2I^6;DBI(J~W zmH>76Iwk@pOa}0p0mAffjoSdlH6C~Gz8V$tnDSW(AmlBGby418I*3J*#VqgJ;pc{A z5wHl8OGrxS+PhaC<@aubiZRfZI2)0`H_^s)PYBB?ujMiPTnhh0JDF1knsIGqg9tfB z9$1S5&>$Tq0TA2*hO5m(T$1+&PzSoChcWZuUjyLIS;UboD4U_6A4mGhLvkL;kQW32 zq=7!SPp3~dl?54PP_|zdvM8G@8MAVBW?8^F`nOM?BB76xyt6ng=o%JBM8vEDk4IHd*<$9Q3Se|LssJJfPzB&qPzAibJnU?Mlvlc<3U^sc zs;lZWY*ox7=*bWhF@Sw;76zZsV47sw7}qQDFZ_tqBz&E>*OrLQ?gm`2?rNaSTIj+; z4Y39Lh439ee6$7}UMOlKocwcK`*Afqu)#uQN1Z+n0txVuYY=OIUdeX#PiAI~L&F|0 zjWrIgBlv$L#JPvVZW5UYUU5##@FEKiLTC<-lb{-h$S90TyQDGDnHD^{-MQOjghgMUPxtYRm8%RLZBY=@S!M|!b=j^h1521 zHQ7OCJ6%hm`7Jyo2ebA0MP2_T@rrO&;|>f81_;t0%6E8}X$P*H{ofci8gcN#IkHNa z7skI%+pvR|E(Onm$6qSLc$j*Sd68DG&A^)$q2`LPT~8oV{{r`fGRCg>q~;G_Sx470 zeO9PEBo|ScaCjN8okwLrau$`RaQGU!?^fWDBOE2NgCIv)IIp2=xxW>td4x4*4ao|c z1whS4vjC_8Gz)-&#w>t13nVj}RBnL11SEnOE?^F~Np&gs`U(9L90LEqb1llXnc6{r z1Ei&tNO@NtqLrGQ7*GLU7jS7%=$GWK3rXXeSHXx8eaFGMOl(*&2<1SN%|kgr;%t-yBo3e)aSLBft1`eALOds= zn=pO+F?&cZquEfTl0~z7P~ZnfpP>q$-c)V2SApxFPuv#DT!WemN#LK0!c)gI`bx z9D#;&FYH1?v@!Ex0!jyQ?v)99b;k`O&fNluB*f|^h8HyhC|JW_oIprp&(cnB22-dh36ABM6n*LJCe)CF(g zmzQK+YLNQ$8;dLor#-;Q638|b)Z+>us^C!}A*rRM0p$aT22?5JSN`p48cgZg?fM)D zfwC}l5-&`&>jKHU2r`A{D0j;e+;v_WPb47{j(ll%9tnYH&_M{%po8Wi8g$TXLMy!S zj+c@p7=bNhdI6)<=Amp2b`t;+07B?yxfWBkLl)DuLtUySfOkMIV7U4riy`PQo>w~* z9fFn5^7CqkNQhoY&97yl%e>lQh{hCo1^ahumo@;{VKy_L00zJ2*+3!y8qgw(XS9p)0;bpHj+%P}bvRHx3DB}bat&qNH7~*IK2?ZfKpZl_--9RvnzyT7 zvY>2WuN!MLe1iV~MJ-@n{EKTd2Fk#{pQ08pufb1HS)||`=O5m#(9}sJ`gVloRV)}F z!hJ%+g393BM-!DXgV2CLkZnsW5c`swRjG*J|64arXcA>v9FpIKibRzayT}Lprpl5Z zlIO$kWB@%RzZ=nHK#y9`A=Mn2A^ANh15(jJnXdF_QmruzuWtk0mvMI{x-UbF3pNJu zhCZxq@Ja2BQ@}nFYHlIg25#Du{rA3I*@t58dn=&C2a(`DbH_v9<@;nk+mm%HkXY8U zU0KJkM8JwY;aL!Q?6_f73i-M@N!-^hE5a@&Y<2I(0zb&ihMR-M7r^zHXxHZwS)U6E zpeO6S>!1s;Cg{p~77DX=W8IzwuNX84_6y+^gYy%qhgZ^Ish=}V>gUwp&9tf1&zVW; z=e(8FLuLcyZ^4@j{y%`HaRhaEPyVw+O(pU#5c!|8FZl;D_k{f)5#JSdo(MZngq;VM zm4koC2#8389sfF>oIVVvuCVj_5_aBtd%~U>k`G52P+xC{XH#L%^n^V_ggw(0_9-$# zEaVhn&rB2cOkyN^!VdqQ@=b(&;hPJ4c1ZrGK4BMzZH9?U=@V63T}y;Pu-b01mIowfNfV04f!Fwch>b& zj*=~KJ_hPlD1@-FlTw?9==V|88mtu%Kpc@I(L@i)4x(Y^!w`)QdOvjt0r~&s?){_W zxUTcS`q@?8UDZ?FGlTij1K?Hxq8!G=KeW3#4W1l= z#*vu>A|MNtV41ezm_CMW9xuG1mrO$1aLh!sqO%4i(umB`ei+1Dj$uCA8kOFWBlmqq&eb88`9-S`FPK@`B85zeQ%AuL~H5axHdnE z*V6aZ9#~vUzxQ?d5zMVkSZd!cKcYkebvRH>V_4V;h{y7yc#)^C>pV(gPUPV(7aSx z`+E&-l55^cek3#domsG@{bYVIl?{v;*b=-!S7A$wSi6g3 zY{^{y?UEmDAwPmggHFvNBEy1OWHqWo>5a;tX274;#`qJuvk`wf1eT-xX;%5u%zpAG zZ5RA$%NT!}(41=gY0FxAlk_V7)Wd_jq^JC;2MP~wRvYL`uBB5jE!|v)=X9OQp^oUHGXTJr#CXi{2KdUNr zqj)WaXlTH4ip^U>Ze;yx@hqsSGt(w^R9HE zA)U~#_edA=>URBhn{=T~@6vAr>8c^k2Voe8jKucg-=tw2zK%D^T}$6Dt}JX$gF9VgW#ECjpag0=Jm8xNaZaqe3BL2=C!)Cv=EbvI(% z7hzXiV=eswX;dqY7QxtxbJx<_#nlz(Rx56duQb$8`|G61b&hZd?LFdR>1^N#2cIYx zcd(ZJEeUkOHumpeHQuaV)*G=YygAqF6S`QcNuoH~*yrwApL^XYh8^~i&wb=h`9V1U z{}@ay78eQRASgXZLz)iO#R|3AS@!OS&I(7}4E<*hP=(bVVOvd?RJ98Lx3LM#07yFg z4RO5OAAtKLw3`6j1FSX*0*Fo~3<==wz|L*;J;V2kzw;!HYY$k_LnioL(_OIpc*#FO z>JGc3h&-EkG5Tq~<}!fq>W*=DE&XrAmHExFvgh7HR<@xSL!llf^G7Mbq#U!|r8Ts<17+x}O%3FnA$TF36hO*ZtZGt7RQ zTdt?vJZqPmbCb6r^b@t%Ge(m?zw8XNR}ysOIFO$0PT&T2m1l?if%lQC_4oy+daaLM z?H+`yaOoyAzWd9gfJyP)HY{-=}9O1#BAHa>FQW> zfx_X%q@aO$%GE1-8}G6iLjyBY-eqqe-E{4%z=(ZPx_Z>SR@YKl>7MeUYQ|o~=8CiK zw@bF8wVIw?f7iOAQC*`ea0kA=Yr?X7D`kWBRqJ^X%83bh4jC>eb*) z)*f7|!FmVh%h$0@KZ`kM)1#}=oV>ADeB+&n_5DXpkFGY^iL9IqORuAM9bHv)ut8Dv zTd>KhEIo{>digIeI_B->!PhQon1(LA4N|i(L59!6Qg%&pD}ig$F;Bd#GR}eY4KxA^ z+5cepyh^F&SgH0LzVat*@jK9=mvGd@8}4-4Uoqa6lRgeSKkqP=wC1daGpq2k&uZo% zZ@05j1ezCx>9qC~^GtxkBOloEntxd4>q%0Ok{J0@kQ4>y{}CIp+j-Z1$H&z>og3cc z*ue8W#r&#=q=13uItPdz3=*WyhQ#zBF>R_r#u=^pE1Kz;w`5-@fX|yhhYd4#9{E5V z;XC2P8MZbXNDguva)UIq8_zOJrOge(12i*ur`wnru-6-Pv3AZ$?l&f--PKIe8mTX!O-F!P8of>BB!s5(55IA4(Gm1lrQv z5If4B`zm&nsi+`~Sw+R3-~r!0I7WHbUu$Py5n;`{!Lt@oZjwj_k%EPFa^*2s=tqUvI!+P z&&)gfY;tW0m|-VuL@{&8hd8X_nP2(}n%$#Ga%|Z@vSks1yBd1mBety3Hf?6$9{u#Q z_9v#@LBNBv-?>2(*1P+i8yNb;eD#4=b;jObrrbd{?$XFkKxMAqsMIn&GcL;|mFwM@831d&u_?F770 z_K=l_>5x%Qiz@Y+6tS}EIZ1)}oqyP-oI*T{gtw*~V07B%hFalOv=NPc8=P+kqF^J- zG=M5B(Fn>c7-fUn1ENEkjSvJRf%*H)0i`4p?)5$-p3JXeY$O;T8}qNfdeJfM><=1m zVqi3f+Ng3Q+`0`3-85owFv{wRX<~*C@T{-nY$d*DpG%Ch?7#fw17QC70&{91DvYb9 zTB_xu&?Ot0)*+V7ffw*>>%zf6GmtcPI}QYjkKdBKWt^NG20#le{GHDoduWnI-{`PgGQf?TcT;hMhc zqqd^+U$Paw#Y|*71cOZ+H}Ljp5`{egxElYjVjD~yXC)a#7_bYh2vfOn8wHs7k3ojD zak_q^|ERyXp5G7pVZU3KUM>==VksbR9HbXQyUC*bea6pSB#~>Z%NAFcWz66@A-5_;9&0FwAa%fx+M7mNvw@I$#SA_+$8qM;Ox205(Yt;Sj#SavNlwW$(e#}x7+!F{m#48!1};@oEva8@IFK|amdTtiv>7+sX|QHP?YBo z?VkhZpFeo-iDL1f`-2QrYaEh=hmVztt}H&>@f_d<`LaN%c-Fi9m}XY1mjFth+N0V{ z8`*K+IZJ4ps`QF-L)z3L+C(S+78C5O46}a;qlYfklJ;T#F!xHCKOc}LwuTzzF{YT) zj6C4Tn1`f26<#o<^c@LcHknTOC$m8v{uP~HADcmWDEI`tu5(UTe99OgEsxRy61Mdr*rM)DYaBl=$AHcn6-m*8$_Y#z2=9BIMtKpi#M?Ih}qq*|GA z^NaQ&Q=@hz!Vf{wkVqPb`$Yp9Xjd9X^RBd|G0c0Vstc2>0i7_z52fmvNxM`%0~~@t z#5v+yq0BK%h9T(EWk!vKgTV(HrpKe=iv^K+iQhdl*d4tWH}=f?nA2>Y%9PCzP&?v}^|hYG)+yVjo$-z8~! zG|^4S#fY7hg&LniL{>*78}I&O@2Ww;;(C z9H-?QIQeW_wt&@#cjNHTv@mJ=dxfZmP(J36tc7#6!YAjz2KB$vIhs0%Vl!~qg=;C2 z@e}%LUk9d%;S*fj59Nkb!p+arBY7Bfu{+ z(y&r#W+)Aw=qaVrd`_Ocls6z_cn$(06~TCTTk1Wc7~xB(YLB+{-aM3co{=!fzBx^8 z;prfd@mqysga>w?# zO21$@<`*Q!M8!+VSttC0M68(b3nE#2xrp|RIR}rxuV?p#X$oLv)0+=MqW3RS?_UJB zAH91+Y*b(~zvlKsnxe|>7uMZ=k-GhGmL9yn=Jtd0zT8zAx&4r3lN;qk6LQoOIx$`A zHUhnhz(zi9zRrv~+?26~;%Cp0%m&^H+&0)yW(bIb797PHd6An7K;VaE&299^~ zECe;v@eWBhnACg-g|aUP&KJ(?!3~4s15|!ooFPEDveW2pK?x>#p!Fl)zg7+*`n-d4 z4PSVd*FV`{A~*kN5$$x4Q7g`4d~kaSA1$5#YyF?;zlt^)ae_^aro=dnn5W<`uf2w} z8i}-|&BBhfk%CprjSIQw}Q4JjoUV1oiKTXfRc0r~)vD0+D>1Nn; z+W0*vdf1_wSxaN-nSH~28noU+MD+|1d3$CFWdX}#lr=P8{xrt9hyAA>ITJ4NvoAf9 z4D)GZ$W9NXI8!|s=9MsI(wm}J?^CZ6J1y6nZiOx6)kdGX=u;0#$hzoL7k%nN{p_Ki zT_Y$9SeBtIlCH^6=4)BrWuMBrZpS@=baCoE?}GVGqm^mi0Btbic9?fSX0Xpotd{BQ zTTDu*KS_qc&SW<4N=rIGSeGe1Ll+CS&Dw|ihf<#>Ci5*=w20)4#KTdT2x{~^yz)4i z>BC-1j^=atIGn-+iI1c~HN{iXk~vN`2Tjy5 z(is*r<__#x7nzAM_&u319~u^2dnB|6@rL0m5TXjI?;$-~mkIc)doq+{!-C!AJuyn+ zVd2?(B1F<(LE`n4gCS@(pVD4s&wH4MX(?Ns=02fqa2gGkZB3)CvYBb_vDaHb7;?t5 zuXsA|>eoyG;PVVo!b|xK!iAUpY}J1j>-h?|zz0L=%8Vcx!L!~_n%UF#H@pQ6Qy_q3 z7=cJ;_Ijs%iS6_-{CL^B;$fzmAl@e4l56Xx)Jgny+rDmFreyZ08T{S6hbs`$EEi%o z`^Uc0eOG!oU)kfn9~p$F3<6qc2nslqM%9D^UD_`BP@pD)4@}G4_>xC%$)>cRIQa*( znGTjWmppPxtzTXp*PHHyNRwMG2`>3mmse(&7ngh@T`c*`E-x514SZXTMhtj4@W3Z-Gv%5yGrd)4&D#W>^QLlPyX=j5)kDg90di3=57Cjheui9&)bCWXwt=^PiKDd5S0dV0=y8bP_>S@iFD8!QnpB*kT1@VePupL`=uu85TWr1t~L+5XujNOSAFJVAmf9 z!CVtdFZ(itT?eZ^$(#6y^BzcYhDMZkKnUv4F|WCj5#O!JwI@yEf6PR8qE_?)sv3?- zc%#u{&XS+Tnq>8m-^f6a_dwF!VIG6B$#!MOs{c`mq*(PoY?LKAaD+xU7;uL~aCY4; z5mJoYreg%QP;%=63^;F+>*ksCK)*9w#?x509c9{BKs(EmN105UrSeGsj7*!E@{5Wo z3oy?>+G!J%Ke7i`VAyo`dgsB7+#wn0vks03UGaw5m;6PU27<`6CHFX=h5~}Jd>ZO+ z$2c-4;ZfwOler`Pq6=E-N!R?wH=bEIV(FmAoNI8Yb`zIp^Mbr1J&giuuHmdqgh9GT z2kE%>=`M+&{GE_c=8z1oC826KNE#q>P!eaA3q^E|XO(;bS`S2_6@W7m;dng6;=DvS zNRLZ&2gf94!HST`s_0^H18w{q5PxSO8GBaVfGjzp)%OhFtKbR30z+6oAwJzu>)VZkh^aft6DphPX9;#W;>nsn( zclar(bYc8Uo^j=A%bF^gh?$>~ZgvqT+g}(vRtRdp;uRi-2-Ny4u~3USnSrjbU`4l< zBP);0;G>VRfV|}W*|1oW8GLLVE02f8Hgelyds!|syn?(Qc<23m7M~}IE}(2-C-D0N zZqWlTn}KwH)&qramu(h*d8;hhtG+DSs|A@WI|{vv#6OFaljZr0XyDyb2tLlbMSj${ z$E7E2nZ>^&{iCqSMDoL_iw|gXxf$FkVg`2>-J^LA4;}{u(;Y)fd6J!Uvrj?DpiFvL zO_24q_X)tEdRTpJFrHjQ#GENvK5m@Hx`Zaf76hZQ>}PpV&4Z=t3YWH=2U}icOfKia zmRDJmwLC7%D`XGoP2M@6%Ysi7tNulIL@XXOs2-*Q0I=C}(4Q`AqQSIQ1mw*bynI(@V~=HvDMS@TpWFZR%)5(rzlR^I=|X4$w}8s`JB$~ z0;Oey(|L=!r5(Yp+#vs_@p5EzhulW~2q2gmSIJ@~d$E^y`QG>Bi#QaA71Jm9vv)xH zI$-_Lfc5Qw^~VORFa26(9p=@s1ExzwA_PsJ#iz%7vk|PT_lx16(TT z-nfE}m8czG0zF#={SjZONeNWCGAlia%p-m|n$*%SlFEt&y7^>|+egCwJp&bLq2wYJ zIgS;SGqV9bs>oPRlUiP*%V^oV=tBMH3ISbShARhSeow(wdKctV#DFSf?jvXDL4IKe zZP~xf{6jFAs#Rl|6jWAQrl40y3X8>}ucP2tER(WKL9}S8fR8|sW;vjYGb*Va>g5jh zLgr+yrqgu9A|hncp_S5wiXNHK0`#!BKMx-{ZaB ztKbvU%37&HJVrg~Rj;7hbj2&W)*Qm}^z&)Eh&s~ccn!QWK9Ul0eVq1-4%D8w=vgko#-lRdEBxz%cq_v5o1)t)3r?SOZo zc_DY~Io^O{|IC?it*=bt`E zrDx#XPTkX4_AjFd>V6ZdSOkojyd$$z+636gb!f=EklDOPv$!ZRC41)l$FVQc)mG_i zna=TS4UDp=en*7*Nv+K@bF>P)iIf)!= zt}lCdVK`xMwUfRXTwO<(4X&=QI3-;=%brubP4z#h;`2kfe)KIH%5|e}@lbZ+TSp2o zvW^z;iZ}9#74S-i^0xPp;T5Ys^*Cg0hX!)WLtv9{oa{F}*^w90RH8mZJYMq|0%1Yz`m6X1AEC-SBV6v@P_i+nVXEp# zf_E4>4QH(mJLWV57G@5?1$TViW7vgLyk+@vR}iHFKOSY;h8{yl6(=U)8JS2>_`VGd zIbxXjH(Hht-VUjYD#7a%8<`xCsJPt?QE`j!9QVRXtFbD((n@AlNC&D)hpI|bok;JZ z6RAr~#~%6b09jg&(uwpZy|!#YVN14{LB-+C1s{7jfBsHytH!3DZyhayofrk=$}jSR z&IdFh{IVYxMeSQw>?ptOko@4u`+ku3mQK7Q~EzwqRX!Mz7h{qny#|G0MotrU$X?WU${ z9Aps=#LXTE7Lgp8ph$Xs30xo7u&@I25?U1Z=#wbYQwp&;iRAU@etgut_L_gJaI;I^ zs3N`AiY|GhiUepq?lF|%r5>^`^=gb{91pqNmsc&83^*8gFZu<~KRnnf;6-we^oy1m z9O3M@xQ*9>@4RK)V>v%=N?jg3bn=vE^`vD6=F*v`EuU_g_Z_2i71^m@jfbEYbTkKK zK zJ$!eL`{QBWU@&Zs?C+`ZhD8c<0!*Q;6N@oOjd#3o5vMZ@^V@|4uzn&j3L`Ji(N*pf8Nt8io=%Nu1WC(wPj z=NxR^EBT3noPg67NmLdelrz;YF{XIKUy}8|>;PZEg3WVAQ0J~R(AkEa$`sRpNz5CQ z9pR(sNbZ(3j2^8RL+Zc?Ig}#sXlf|=!JzF>+G1tc+;Tvm>1icwXx z5wP^qoM>*A0?9N$@9U^gfBEYjz={~&ASI3uU?9z6daw7Q53gzy!w6Xewq6k@_wlAd zoO&aoS~0RjWIFHWi8S+R%j*juss!e22yPFtVmZE+8OR*$&xqdkcw_x-k2i+K!)@5M z(%UXa6StN8W^PkD`3WJWS2(CHETh$qy$W{z8zy~nMTXm4PVvsQ_^+A5T@mD&??TJC& zc9lV%-Si+gG00mfVU|pAH^zBhw&EX`!t$+YJVwvuI5#&r&Rca$hU1Lu4T!lM=W7x3 z+3>G)oF|F-YU4b!>2YpX#4Jn38)BTXFV>Tao?9EzbE%8f^stxw2|esBr019XztVBu zEIm_jY)1kGG++NyQ)hOHUdt~QJ- z;rAo#hMyryzn>bWn$tbZ<#}MG^*EO#C!|?Mha`Z~fO&!jbYiGRCk`T{%19G@AcE)w zYy}*Qu@>M+Ik+_q^u#pI&>+Ga;)+aT1LG+f*Zp^FXgslWOl93snMlEUL&#bKZ^(G! zGqAn#9UB@?_T=R{%({6>}%Y>djzSUwC7f^l%}yymQO8QLd{!#p)7^M>?c=wp?dlkoHa?HX~c zCBry5EE2E`BrN(K8WJ8{MiKldE&?EcIS6@|zyamT;*qqcL8ZuIWmcr|YFo4W0i%Nl z9l%#SY?rJ^pMKFr@o!CglA0A%WKF$3^q9pqengdy#P4wtC9|lh44JMsFy~vtoz7I- z{L?c}J7!T|6M1?JSXb?}H@abLTsFGlb!z|`Smg#Z5SjJwgYw&Dq(4PMyxOnG$ZMYa z#it$pb^P9IeVeSul|@-JS3XlZBLUI$LRGKB@2}uH&!=9y=Ct0!iF@fq8hhKZ_nEl+ z=YH&I$Luywp<&L)3+JA8%&Iy4U|I0!&p+*$z2K?DA;NqstPXu zEbn-rEV#Jp&8qYNtjoldn={Y96L-P0JI{18DjBf_F?XA${>gaUmmxu#6D($ig}{7t zh*)!M7|%%v!Pm$`nH$?Mu7Bf(G0}68--_YA^`Gy{YY7a1q%eog&ACrv*A`y&IlKGm z1Dn#EME->wz?}E;D#pQN^YJ0jUNiB`C1;2p3seOl-y<$Uacud5-flYky@7X&1UEQN z_SGo_t1~OOO?KXZ{;>|LQj-9jacz_-06tG4-W7R|e}nNlr`;kn&tK5grG!rdt{owg zJ$#&DDk|iS_?UUkKZZE9V?z_&h2YNjr;cglq4|klf6~c)$ej=(#2B_-LW$!wkoXB3TYkB*Wh+89stOi`v*O`U6ZYpro;5Q$6A0K>P6%AVz^tkS z>ApSWpSC3)&NJZ+93E%$bl=O8&!dl_>087*c>dI>Q=L`sHoP^a33=!FzS@iI-_E3V zN(+lg2C>H>I_(0rk>R#87z6C}#86K>^OxRZ2z2yJHhk>#st4E|sZ7(2 zT@3i~8<;f&sud0Oz(FkI2iN`(Bbt2RWmxS#a`s!0nidWvw~(N723{>J`W7Z1focS{ zYE=LRZ*9YEu!XiZ+}4KM+HhMNZjU#t`8~>aD12&%*jS^V93bTHDIOu+AtfJd+&Q62%iXNWN8wiR+j67JI%|l-! zg;YsF!%^4$5a&d}wFJ;W%w0q0p@Ab2nPNyJ2zf?$_wBc9FvMEiA!9DgvoOf%B(Z^i)$Y?jCz%!Znn36<6jbrgA z*F-fJF2Z~rz&r(rYN~RNKlj*^j#(AY>>HY=aDD%;KIvp%YausFP^N5Oe*vlK)$XWr zlGoml$7guXlZasf|ZQyZVNN-^rw_Z%Fu^Sh}M(EXiyJBV?6{ zX|Stlg;traZp96kEK+uJEe&c9^bnY_A-K^MiR>MjKd=!jyZSfNrxLs4b_Q8pe?Q1!ZOeP@3@T-H@1~< zEk!PdSxkPYO5Qk>%%~>p5hAlMb`P(fc zsM-wpAJn||XdhN=AI<`E?Ihq(h&~*TU~A8@j=K66tflFCtQ$=3OrGIm9%d$jCT6c9 z)6bm0mP~I5p1b4>vro*VosrU`!n6XYy^8Mhqs=ndtbxE_oH7C}lz=vkwRB2xE^kzJ zcwiH-gOBPMFf|G^qnokch2d{hn$Z~QAfkDgG)#}=)o5{cEzM+BX>oQVTFlncE~E=+ zF%wc>M(SfSeRJXIC!Kr?^vf~o^O0g?#7dOBVf|B~wI0EPqQ?S!U+NIwHaI3;|z~7)z`>I7k133)?#NRuikWJ{v!CJaSGhxB@ zcswa;tugAw)U*9Xp=4=m>5G-|iW^5CCqTAlB$m5%!@QyT+GPaD8K~qsdyj zAc<0YGDdAB60g6OF4i8%*3$lZRz0bu7jxr!x~qEnIa-zzdb*7CbY>w1W7=8JP8eig zqEVPAyNaO^;%C7sMF{%rh<%KB_!2O_u{uKpzW}CP@!84I@hasUG}h9sBh=hiIdXT6 z^9dq~H_Ul<{1yfG1zRGUo@G3T7y3iVeqry@EW((^0GkYD3iy_x^nh>4 z@kFPX#(x*gN#&bbc>=0HmJdXV!X&6bcf%5NH#C=?hD6CE#Hls9G@N3#?9+A$fwr3> z4oi^VAjs!YG?!;cUOAg@k&vS{2D%%rrMZN%1!$I`q(HMQ+nLvPW+X&f7LdX$xYkIV zOK4WmW2(_N9P00Pwu3Y*Ab4vnEf7-+Yt9G5xkW#26u&~f^zkCQ#8=cyAJi4-U3{hj zxb(*XE@`yF2Ll#Q?&rM@_Y2q39TMWO*k%C1U$hK>Q%WB}s9YwjxJ*S=cS^Vs_ftIZ zx{n}S$Ndx!yyhdQ@rYzC-Fa=M(ppQet38mdrPpu7RIWnuk8i|AUM{(K_D!T4@CNWb z;o~05L;__Zsv3F&@2-NIEIv+-l{$!JBK}(XHcTa$h!4ua#FB|{nkShEP{2b~Ha27; zF?79#`TUz=B2)w_*zfgB#9vF7#aHG*QcaXqXl7%2Ni6rR58J*W`b2%rYI5JiJ92%W z;+ba~tKh5u3R*Uh?8p^-Vob65p&Ks&L~)+g?j|!MlM)+tNkLj~k^`E!q|u*oD)y z$VN%8OQ3i0nQGCtHdwSs8Qo&GZaj@lfa*ZnH>s{P*3#V?%eEQSwOp{s>Zc2~p$oQA zE!Z*Dbpv%p0khT9SH;{boO|7`rs*ho_j#Q z?NMr389kTjDg_}wqrz62Acu#Lo=D1t z0?bvujbI}Z@0rT!nYe;Z4&8j9irgo+Sz37lfysidv*2oJzjFsMGCfO8%GO&C)m4d zek;tL3$PJ&!N%~vRXcX-28MI0K+wo*uSEz^2)XG^)eITXMvnB-!wwx34_Oom+yxj9 z!tPPAh0~LITBt^1V0BQ{-LTvtPl9DHS@n?OJOq9w(DkxUw*e3P2qR_w&}Om*a~XJ# zSUU{LvXAVogQ4DO2DA`;TP$U975&b;=gZIeV13i6Kr7&??_}5EpI2PCJOWD{pWtYkL|2U?GL)&h({0Q~w$_4rCrfML6{iMPtSZ@Q2HisN_!j*5qw2T$h?)-{ z#%&hv_)Z;-^~8LDb5?$aY=5t3pqHiNt>Ke zQbYi9W4M8W`5=N$7wjiVZt-3uAfnsr0enWxxZz5eooVC&24;Ta(SyIU!Qb;pd~>eB zjamX&I?TiaT^Cp98kR3$eP;g~xWokyt8|zB_6W1F6xaY0p9W|Bw?Fc^cZ3a))MLiEgW}mf}@ih9P){e>s#;XIIVa%cF@- z^+nR(vvt?;19fA*p1kMtCcbf^bS`1pi6~4g?IX-RnjlG$Y+nEEdf$`$Ks|_mf0Bp zNSY>aD*!)r z8GORs>phFl|Ld18+U?@!z0<3R-lw1JDf{_^XT2Dw2CGo9eRKXtQP*?jrEWE!#j~GR z@pcJ`?;+~US>;^bF#Cs7$sDZA(yqH$A+g8ias^j!G3J93-yHM|Kzi-cMO5kT^&ZFP z{hvlJ(4m9DDtk%3^uVXT;ACfz_SJ{C27^EWhtqsundYTWts9BJj)cQx2Yma{Tet07 zZ!}ET9*MEH=drng_b7mwC>k!2fnkr^#fcGeon_~otEZ{X)MY)*3^M&oAxsb|zxN|1 zk^+v5aioWZX32iL65_X!crmAe2VmY?u}kw(IMTdoJk%SkdM}3%bIabIRS%LHDj4*x z7ufhCZegW|%VU|ejQGm~ZqB1VXWb$eBvxK`$D?lTTt;bCSs6>Lpm5;bQx~EzK|^ze zG8PKBGt667INR-;JL|VY7Y)rzdi%K01)n072xZT*|6vs-5NHDxCNDbGK(MBkieMFa zkh@l_lc}plTkiH){bi-PtA=Nib{M{QnLGCOh(vvQuZU5$3NuKZ>H zOk>qQ?|BEziw*^jxg6j|y!wj{(}6$%c-}Wz_OGUkAoWaUp7)gna(P*FQp*r8xZ;9LMrrSU$g?GT5<-uXp3o1TK{0JKYdKL+))4krK_>A{@kKi-e>pg@|mzjil zi0L_eZ|(Ii;j_8ddkUZ4Uhg74{bm2Ww~D-XfqBs9=vB1LU(b50{ssK{1b$ui&v{ry zfw^$%3r_Y&(DvvsqeqCtZLKCkJ-F)PcPpc)W>x`jdi}8>+)z61L-J;9f8b!#tCYES zjqC^PCvwL;H0SQeMAZ&91$wv{C*65~gC8rSXEWmhMhD^#TlS~<{8-}wTuIeYj?1?3 z`neY9k~ixK5u9dmd74F=qiRbufKErC`Y&mka`;+6dx#Tv{CE&4S;RGtt;XMj1$|3q0Oly1`0cs026%&mLjW#(I?7 z9;xK93oWS5z9UKcuz<1QeHcyAyih~BYM%ComZ{;(`^a!%a96Lv(+7H=8oca!Z4G0{ zbiqy>9}01LkT%d}wqqVq%A*AX{@~p>+CeXguCkcR9dsYos~umpcYO0it>kMCx^}Tv zf+P06xm1y9D^b8Y@W?+cFnE@dX?(r2=Nof=;$_%vwu9DRhGY2Z4M!4{@eYn|VFx_~ zB_ON3Z{~;D6D>V*9G5g>%@HDEA>@w-_Xv}P{X$i_Jm50VfPA0us21QiWpw<21MJxb zQpEkmJ3ToWV2=q=VvU^$pi71TQuDDjjwHR=XOXkKvD=X%HZ5?P#Rt&0?mGZ^Q3A$eUN&zmiz7ZX56RcIDTj z136&gvGx8TX%OEQ8yeRm^rZRN>HPZFMKz2&O`sZ11tIcBNdpNz?=h|-8aCv5!WrH} zkWRpD>Cb-d;tYFK2QuVol6$0Ke(5V0oxR?1AUsuNihO?@8Sfj|LC1ZHyLcQxBvqLr zaUCyF4I4Pkatx`}8Zg_BF^I#*w?OMqRKw#4ZfF3B3-#Ww?ORl-29A*9e4HTf8_wG_ z5JqI4`0_<3d!eP!-1yaGrB3KTF0rU$*_>ZdlEDNg2^Jx&#sYR@IqTSOcK}k>03K;e zTqLRE9+zw8hsf5l?7#fw1I61w3OP>T2oyGEXZy4}WNfqTpL=)S(cj&>bL0`&jz|>O z{Wi(_4E(9R~1#ydU@;S4T&zqHe0f`&e|Hou?&~}@M8L?DJ6|NkR@~3yBx_4YrYyi?2O!Q<#w$Ubx!1C5ulEsLEqgmxLBBY~ zcZb9#)VN~K*kxy!ecdI(EHG?6#QrQh0vyRU<|!FRki?R#5G0Gmy^PChwfTIG)G>|y z2tdyJ^%0S{69vBKIzbq;O*8K&e%pk3A6&-I`^cT)<$WYt=*!{|d$aDloxXH$aGZlH zpOWldj&o2xb^3IEy}0jm7VgJ)-dLlWGgV{WB@qERx;Jb)dy1`(^s!+oP4`1F?C4aIC+kC`=}G1)T$H4 z$@|95w~8PuO&`kpR&<5gz{9pI@F3O7p%jo)>%b1Bfx&ax)2-&-AzEaDo3hVHv!v_i zcfWMeG0p6AZBWh4`2tq$jYVvb{)#K!IlStG)#8?g{SFSC&@Jzn1Uv%EFrlM}RJA=} zMCZKrkYa(%<{M}!vMqfmpGQk~jJ5Q4##)+R-x7G%L`yQWRuY&dAa20Rfjp1a{BB4A zJ-z|7E8#+er+**~Szh(`$&Nf$d{CK#0Amp774)=~{d5yuyhow!jzh%Y=wV-nrm^gu z7!!4rt-4F?U_T9`M7idJOEMShmb@=J^X)qLh&KJv=Po*CD*KNF&$}nzjuwvReQjtF z4Y^lqXgi#`Yyk}|!YGNEU>=zOvOnpK8u<@+n>NP1;?NmJ2pyPY_Zk9gwPEu6yH?>R z%eMoD5(U1%WOXn*knjupofUD=n_b$QffC0~9Rv{vjux``%FW?u`;<0zlE$PBcVe)3 z=GHJI*vb852ZGl{JLD02y+k?DHgcl;F|eS#Y)hgS^*q zy?4Ch9q~KJXf0RW4tb$u=+t;GvM^0>=ags22Y`UL$olp>Yhw(nm@Z#7!mIZkU!xk%ptx)DsJZ~p$U z<9WVn%p)SiEF|!!G|X2BID4bS+=zj`qWUlqRmbNN6?R%3$Mu%|<>jfMgIO7=zHy=j z(2OBLQ{=!xBdluIaLz833*a=roi%7jY7J<>LB>i}+UHP_G-8N#&f?00H`qRx_^8vl^h! zTBuvDVJGkFie6H+IV-kH45X*+5<}Bil6VM+8#I2<{Xj~N4s~luV#id6OF^aHKUNX(_8mdKLC3X%)yN|0QV7gSsb!!bfd(LLtx4LeOYbbK!i!yrVKQ>(;$ zD`6U5(oJ0I8{bM&A8HSXCN72Hx02L@;s*v1m+~HHh-{k>*H$)v3ptUYL{b}$$klO-)5pZBC(i!MQ2z;Lf%$*S%h0@1UN%OLMdn*&X{Ho3%cvjm*~i zo{aj=OYJ)^weP$P%1AmCxV*%{`a@}i?FLg3_sguD=B}`sM=FiF+Vv;LMn|woFw)lp;Y>#e8%-74u($Nha+lMV{Dg8E5 zY4YFBd&4-}j&}zoh@1TzA9}z}HOa_Ckc}KVxO1HvO0>RYWD->he%(rAttlj$wa8%D zk=U$3_U-hUX2C>%Y1rBRhMVkf&DLXo;XTq(_-#)b7T2UNiFHQ#M0$mp;%8v7J9*NW zycW=@rFjZ-B}0yZ%JAWcsUf0fjdAiBZ7m*3zcLy5AX-`W_vOnH=Y{&;I5AHW%6P=q z;jF|-XLO{X@wThj0Z_#_pHp382l4FYBt{}r7-x_$xRxE+Z}y5gNGREneWnXdP8+#M z2#QL25M_ORGds1JEvT?>=I?|^mz|VYTi60ZxXRW7*=gqQESAvZmee4wgoU5v=Yn%v6o2bm*jA>}~KoBN1MMzPRg5aHxp-unph?SVRa}Llyy5 zbzH8yTcSSPWIOp*^eJObqmhKdAS7ziGMnC*Ya$xTqM82~vhX>wXyT8(#|c5jZ44J- zSlqVkghsk0k7Z{b5k&?EPzstAv4U7w+JJsA5347FX%=C4ws7J&msrPhsA@a@w*&v1 zlO1;BV`dHBvmd@Yb)>*Ag%rj;Zkhy&i3t?LgZMKN9|gWJQDUf)ReSdh4IyfO`Ubak za))D1eP>g|Q4d9SB3uO6%UPz@$?WLiF2^Z+bMh8$j3Bj;<|c!p^1aAH2EK&59nXC4vAgpI@45?tD>ww79G|$$$6XSc-f?s4)XUDXyOHfI zlwep_K*cv79(Ed$=XsvPENRI4i0m(FNnrM^>wR)q{T?Y=i|rNh)wUnY zTN0uFuC&nQ=G}_a%uva^Y1}-*0&d#ZVMnnyB9XpMQ(Al-;7(U}1$>>>=yi&wId$qO z=MYG-X->Jf(uR(p&N4mRhc$uMhmcgnG+-}e{r%1z$qERrX-;LgrjGIQ2yS3-4pawV z>quc}e2FjtzC?#oH-Q^KqTw#b!5Hk;Z0P+g>Ozh?;J`) z*sx6rL1wzsAdMobkuSn7NU#+ZN8?nCoOzatNd=%{<^t8ERV3zULt@t1$IVC+PUi|p zCE9Iix<&-ND;VYtOe#jLXqmYqkWJD$ZvN*}r-EatXHgr*M^eYJrQ;Zue{OkU|2!UI zJGJ|!G|<7R#t;MM!`R}0-IRJDY2RFTQ|e;GTjdI`M%-%yj_jy3fc4O*!O~lF5E4!x zO;BARO;8=qh)I)F_gg1#foA5xr*KC_**LHBVcvr{G@#r2$?mrK$3O8!$80l~e&UNZ z>85K5E+7XmI4=A0kA2a}{s`h3N13pjl~~4E_$I;TR!MQ}m=FJ1s}s5K;{~CMuHdA# zk8q~nV?M$gHKzT5u5KThpLiNBK!nR~$IqMiz?QGS+kyG&qY^}|)+)J0E4f)0^7#Eg zp|3NqdIu-3*+$`;6GJmCzVVOrF?F4pY3+X_ikq!=l6I!DZf_d9LUGb-n?@ev$Z*7M zE)(Z*GKGyJIEqY*9wIt^lD0|I4V2OiWIA~aug_E-Bdu0Odz}uGM%(mglbh*0#`foo z+TF9XyUiBexA9>^I|yBYD7K#V=6=V=X7_%_gZj7MamA6=e#c3^OJ~uMrn!tM#w^;^ z>Q}4PFD%cduwgb|tSGEjuskT@lsPB_$0qxw%;9SF@8$-yH&oH%V*xhG)rw7W%d366 zTDe<2akEOG`f9~p!7%6kL1cLxgq%Re0L<>N0@0J?A}~5#pl+l5^U4eR2Tx%u4fV~c zwZ?@Rk^gaB^1by}@0c#o2z>4)U6qZa;$v0%W2^G&>ym2voFk)}TvmS8+=@OIaFkENA1fxr177=Ps7!NY0jb>7+F` zBWF2FkgL=YOoIX&goq#l@v%=9P&k6%wCrdRNpP5{8=K;%^UN~`y~7Guu(>&8$c(_) zn1S;{2y}|e^Mfl6{=Um`cHwik zvI3QE6kva~?yVZKRL zzRAt#jHi7*^W&3!M(ym)O_O!)L|un!Z*uEE0zok8irT0_tO zWZBCXoS}K{C%@=q|4+zHnu%vImdOFW?^5}`-^;H_`SpGL8kb-H2HHtn^dOK%- zYShkqC)zoU(M;Zhsys^%)%fn8y!U$C`#qDTpsZxyWGQ-`tk&!0gn&Nx)=M$nEPeN6 z4IsK?PgT0tyAw(CI8`6j?tUbB7smi|!aBYiUmg1%)j-{Vkzs~g*F5rL^^tiHI+2}$ zmHM-Tvc`8#wEusOxBrg%LyP4@yK7VaTt!=B9U^QhV|?luV)|YVgBv+R`v93J=3gbrW$Ld z!AE`qGz1!S_B$U*3JyBf2Jg;c_Wft)P}NF_DHLEccg6KS~&? zP?a#n)J5~ z!%pP6uJ5`qnPc+}=a7yA4k@pfZaXonEz%aq_8yzIuSQ}qr`eluNza=XEV0x_Z zMF-Z+EPtBWxNmcBrf=B(8!-XwrCq&mR1`t{;Lum;TX*BW&Ageu!67#48_rN%y>C!e z*|({y_pMVJa*;U$nM|(=ObmodoGVScs^rYNk}DMxE}wdFUCHHjC70HfJW-W+=00dr z(trgIUVm>XHRwbN?ORD(oizCp@HJ0eWJ{=;yY2nloZ!q`J6_m$5Gd+F2p%8o6lmWb`?JBU; z0kI1|uht91XCQ@R1rW9ryC1|EH-A|J5+}k|fQaZE(H!k}d(P=1KX~eaKl++~swe;g z?qZ^} z48^+9DMq7Hj7F!B{FKEwmjdKmAC=LM_NTlM_bQ`-I`cwBMtwXA9S_NMEW&~J`9=+5 z9tDrO1^nX)F&9%}Hv<-(gOGwBr9jW@;Nzy02j8(Ngh&H`w%72oBn6!26i*0pG??=y z(OtI|(LxAe+~kfS=mh%fu*h&8nqc!dS*YlsU2eG|H%wcahb5Et;k$=LndPPT4=}1~aYBsM9si`!Bo&Zvl%Uk;t%E4P$_tg$CIJ>@We?A)>UCp|pmQ6Kpd9Jt4y$qS+rMf_cxlc_z`5g)706 zMdRjTI!z^#;OLXg`UU^~;eHXX0rb{9Sg6>x0O6cx@GZi*J&%w5Y@FIqtau>E)`5fp!=3OJB~yL>l1i}3Q+Aff z?GRjGeoS0K=BL>*3ItJ*2lBQS5P}Z_#=YWyE!htK*E)Q6-eT;`i2rR1h7p&oK$PDKMEPy_SCV#fL(=YUe!#coOVxnmnghO64)_Qz`}HaOIapzo z?SCy4evJX2-SmKyf5=GbubN zDID13iBfn{QaD`BNP7p#ryRIG;K6#9vc1x$EKAw8j->>LW&0RQ*>*LSvIKo+SfnLO z84dUdpWLz(HBYEnk$1V*WGi$nP|PXD^j5@6__xw>?hj?F#hB;tE1(aOA~E6o&^quGCl+ zQQ$!42w^=5s}d##o>c&G4d1u0;jy?!5v|#f`2DGm6EFy4s?e>> z#V~2jDO2zyM!MN*<-2=vhR{)*^3YsFDw3)44W26B;8))6&7bs`o5W*o5?xeK7iNkG z9~t8PU_U0X6c|PeZ$V2U%tq0M|0coNN6)yD95+9MvyXTMmo_mHkk3dg5k-^+3BKyW zhzBatg+voOR}zpOCQSQ`9y4_E3Ol;jdj-|7o8}dFnEf%1$2N95 zueuDfL%&aXxkV_>Ta519?feCQMa+eL!B^buH!X+>Yy*8rgB@OVi%4Jjrqto{1Mjq# zBYDSovl}(snHU^&O&iBv`>64M&LkP9JR|}cpvkE+p(1}c?d4f{|21Bd(SKD7lo=dMf{prZ+=@kd4ka0hMC_>l7>IN zIY!b5l>VmRjTpR~+haAVds4&S1iZ!zaFk74$w?TXxI5|zY& zp@XZpWp-gZr&hVX&#iHX&YydYjteELCj@$a=b5->b~Y; z#9`}i!M1kG6!7IVkP;W12kFKp=IIijd#3grgQsKr08&YgPwb0);3a*4vC<$Oot&Fe z$NUP0DdsTQ#VOs?F^_%yNvAxN*aI=m<%!JXtt4%m&+<2ji58!mq{VWvG8xabcR*(7 z!JEM=&dH4KFdh09dHJrfIo7t_#X^A zjUY)HiIYIp$2*x85A-x8;cM8hF0+?Z&-h8=Brcv=cASHM`i-CcnLl{!^1t|f=Yu-g zV>QL~nqYGG)_6`~OIiP)wetkpaZ*ww4ivd~|5^!RK`s3rf_NIyFCT~9IN6o3T@AFQ zcsrGRLRW{l**|F(NyS~k)-AUy2X?e-;Fa1^u3GM#Th5-?h&H(JChNNzr^dqSi;aM&xRIjTJkiLaD7u3GrYv=XGB@DD)4I-1W)WI|?0yPBZ4p&^Mx zh`jg*l`7J?&UNG1jo1CTabr~0blTE3zjAWe$s1Ai7uYM0pT2%;M9POwa4n%@V3|V` zLQwaZNhN~GkzlDM62spHzV&hX?7;irQHSn{5L`#vxC#H@yf}nx1`=WOEXMOK^Kssa zAZe(Y)eQ)fz|Z&EpATWnff>rk(aw`W{fA0jfX5b-_>g5#)8#vCqML|1-()xSjjr0w z-**o2a0t>%u$vdwb@Kwd`MB+7?+tVl;q{yB<_4o#4!4dcBBJZVtz&(XV~v-$hwvt`m^kHUEMy*UO!-a z-6@BDuQ$^cH~U-w083xvc|%*txpl98j+H!UDeWv6i9J0!=!QOk@=JFYM zL7B`W;UwiP{8rC)M|M*hJ)NDd8%1u#J*vNY5q7xS=64+^AZ=&j2F;O0kHR7=m2vz&Y zi`66LfZT)_9CVecBDGNPcks?185V6Qi-@mlTN@J*6i^lGR-0XKiB9+UWMio{2cDBB z3>qF)-T7|E@qNc%_qRcj{R<|Bzh>Y1cJPoIa$IS=3oQBgNH=AEf`+~Q#dWuT6t~|w zx_xSF#z8tGl@=#8#~Zr?Pk)F{LsO{J$_AaqiKp@BKaA%;qR+Pwk~T&eK#m{3|2Euz zyWSr|ZCJ8ImjrG2b7sdU<8bOEjdp3yw2U)uj3wjj;mW$^?m=@Wv^mvM)M*d1g(sOS zZU5PIMEop?_&FtFs3__QoV7E79P#7t_BhNxB9CW zH72NgcI3S&Ul$>mE|T+OJHuzk>GnX!{$ut3tfaU-MjfcHHMD`_8l?OSP$jfFd=QQujb#f7ef_pX*}rYIB>`8B#LZr9ZRGR>hd=A# z=;rSXyx6*FHH9>#V<6!ncvVW}=D*fY33fY9Ckh%N0}=7sz~B}?J59qn$?2nrb1(Vt z+U7T-JYuHV&qa9?kGh@Ng}HEkJhXadcFRJWzj8~+OiObVj4gSwuyf}kf*E)3-u?fv z_cl;=U00dlz31Nd-hF?iC#hc5d-bYR`(Bl#SBZrM?NkX_By|dvEEBPCf@#cj*5K)3 zt?@jG#xfeC#VApQC?IIhYR$9(;TSM0=_L;x(++V5)3_Tsn6$$f5RIV?ZMvP{fI>|0 zWI43Jp5*I=AopY$t=`)F2M8mDS!tw7UxQ2bjh{fTW|veUM}btoojY<_FbcvNfb|AV2ZQDR z5egho`=@d!aQ@AqezO;w#`hE}@=e#O$a~&cMZPDm$irzx?5|bmD7R1Gw^g_Q7QdV7 z_TQoD5kWsux4(|EX5C)EZ=-IX#BaTBKZ)O3-TnrCt9AQSdQVihznLCa>h@DOM)t#U z-Tr%ATdLcq@f+6dr|}!q?Qh}N)b0O+YY`6b*X=VnKE;G_G<&qkbozNuQf0!PT4Rk) zj5`QVGOJ!Z0q3ZggGsHq%8sgw86*wZmbVQO=A%$3uAv!RYuo}U#4I-<6RYp|vDMnD z*ZO_zGu4pE=n(!{Nj9y%5EXHEu|)`K=9Gmj>b}5P!TPCT=uV>-M)RakVa0My(@Ei~~Wxa6b^PHjGW< z?aouH<$Jlml^FY7g9&7w_6d)?rD=HWJD~IozSMB>0r9j!Y#7%Er?t*q;#uzjmma)rZZF^HPtM&H2MbN5>ivmQahp<4*cET z!%%yS9H_#0Q$N){?_r1`8bxXn*pJ@tG!Jr^(3>0}OxR#le8VkG%hV=J!(&`<23Po4 z7Gh_UK^d)AnZj$`PmHED-tC?CnbV2Nv~i&LaGO6IavKakoSDjo9&UryKP#al_;}2w zqmTdA;^Psg?CSoGjgRM6&G6&P#m6_tJbtzKc*H%s$G?5!$B>`_d)M@14ch3yK3tg)LtARo|m%A za82Y|@F{alkKp&sA>Fj}`{uAzZ$Z`{AL(2UW6ONW96}Iw{<1$+&o*DSIPPVOZ|G%< zqc7W6eAx%e*~e54Hg~39p#tDWrOI}svK`?Ai0`jbw)Yk0a0nqZP&&r7;AVs(n_HXP z(Urax=6~XFXV=O-_UBIxCR*N(q5u3H7|U?0{iSzHbAeIQ%>I-XZAYjUWW`5TRi93Y zzB!5N(f3+KoG9D(1YZ_Fb9xw71~E^JdNdrw447){~on$Lm(~S2$#|l^v7aw z#!n_zU;pP{cs{tp34kViJ)H``#QC)A&$$h2ALKTu9MGhw+=GC8_~4XoyiH$?7hS&A zi{^$q|0*w<+xQ~H%%=fcKb{#{5O+uJt0ss$SoVrZ>Lm zMhG(;IXYvzVN~urSB~|-W!3u2Oku7yCvoQ ztKinrtG0~0YBP39d|(ahfb=zq{p0#A!1@hyE|eoZnsuoj#Qu~g%^0jLFps4=NH~Yz zhIm4^1?EY$X}GrFc2jHPa?W7F>ENH1Th3LH;eXt6u1ZrXsoGP(vLS;MUk|W2)plL8 zQ4ok=>a3A2?Y<4#8{buxy1o39>2kkLR{&O3-gm8fGVxw6AP>TfP8|^*WUW=#CP9{y zQ-iq4=J0jhK_qbXU;_UYYt)F1rYNo#8>Fzntzu%)HX-wsT%k?+XcKX5Vy?8rHGC;d zOf0?O(J~Gt!DN@G2GYcGw+3*A!FQzD%h)F9aA}e)N}7e1iPT9_%UeQMXcKjT69|bF z0sMrY8|(PAmHC1QX9~|6UbA9d2}UUH{N3P%TwCHPkqsrXm$J@@#2kqOK0Y>Z=caw4 zHK~pkMEp3c{|fJ};!7mDwTHfws@AuW)fexrVy#$sZ&e!l-o_xNPkcfun-{!9&Cdv! z#;hh)NC!ZkPF#?sFGR0~z#WGIj6xk_je+3`1;xaAmf_$(vuNa08PHE;rhTKdbabFD znY|e`U8H`_Xo$h9QlO^8@mEPrhaK&!QPXj6Q%B>*f5%eO^_dhFD^JJI(PwH_OxK_$ z=wnM1a_DcMrUToWa&s(j2E$%9%9NUJLAMXeTBg)=3lJj`ci=jurdv>IIzVf@eO^qY zBW9`C0w~4-8tOBYnr=ZI-Bm49YPtoaeAMl^eV$-~!Jr)TtVE0 z|J1}?*mPa#5TSB)=D99Jo0xBssc@PjCY;%}ed$2)&tlsHaV)0>$(+)rq!eupnNiPH z>E3u=ndiFWndiD0^W4_0TO;J4y^(G3AUFR>E&!MOe99qxn}W85o{_m z3@7b^fDW3XyU#npkQ7$~>&0E`$35AGyy;yqO7~C?624%6gUKHlnB`#K2a_3?GjuuI z3rd;>A~`Uiq!+Iw6~`r47_)fFZMxx9QMi1>{2(s>dz9q|0RGWYr}1+~vdvWtf8C|ESzHdV?=`La zUfXov3$RsurzaiIQZo_#euemBCV2};2t0D%h$pemD2YB{`;xgyJXu&WU`gvLOWGnR zTKE#^y|*q0*oK?LyO0bF!|IPv?NBM($klee+$h+0`0M|0!Lz&UL%)B)pc7NqNTn=5Nggl=eV7@2H3oJKl=92r(u zW;sshQ(m?omNGT$C@tFwNHSU3e&7nMY~7o^?^gjmshkXYpPb2mH61UA)W|)Y@Km@Y}-;kww>uPoL6NyBN2m)F${q=EuI!% zwm~1w=)fi)8>sHo58s78>PZ)TY}7~KW1AcPj8r3ezIp3g-x|>);k3;hv<=MJGU(V+ zjYLYgA*}`X7?68EBr~d!W}uN~WEL6;Tx{D48fk`jW5Bh#SX+Ra&S|AcwiT(^cJd}i z#dborK@ewhCN@5SmP4wRvT8WBv`uEQeb&W5+=j}eJZx!WWugb}t4Y}+y^Mzqb2}w3 z<6-;Zw|hUJG;AkSzUKCAkS{EGoovMj{K#c%Cf+99jD@W`#KM*f9a_49)Q~9)+tKS} zVe2Xj+sGa&dkz#4|8jeu(08@8gqKO$intL z#6!cN`yRUHVWq*K!#!%y={+e68_LzF)AH+MVJo%^?NB^M?NEKp^|7!GKc=j;RMS-- z16Yt_VPj~R7k4w`K+S?VWnr5Gh1?w!M5b4OvNpmV`>kgbKAtG>bP z3a+3IJV(>b5>`-?%?LOEH)rOYYNG{G&Y0CYtTuN@@@C{7Fd8KU7ayWbFp*;8?PpI7 zCN`H*SojZ7C|&I3fJBXlhTw1>Dz6m}!~BAjWURZ}E9a#ZM^o0_?M2+@;cZn%Q#MUz zF)wX%GCid$Cz@7UdAZV_RkcQ-J>#L_TX+}{j?P1+QL6$o%f${talEvrH@;xAdjUA+ zD*6I|;CZM#Z9EJd!Pn#(vX^?P0W|tN*erAInZErJ(a4U0OZ?WKa4+(PcsshekI5gs z4FEQIl)7r}mHTE7a7(bwV6ZtCK$`|z);en5!LI8rktu2}UE8TY$1Rn~X7rN*riZ>- zmkVlLX8c#_>&85J*w_T4GCwcpzWQ6R{|0;Fx8Nx^#KeR3;~0M}#7X*HWV|Xq{w>N? zBx;GqYKbQLcx^$X=>)UYTQT~&ASwVio{z(T{lh~QJ|33x3&5D?uC0)vg%?C5O5#~BgMqoQK8jc72>KX zM_ko`!s)5JO-N8qP9)bykcdvXB*00h&{P-vNL zczylEEyO%CITxb5VUUld%+gGiKlv8ZIOWqdX^tep0w8t1{js3+J0Vgs9U8XOzgB-K z*sp|;lCr|D;jqOPpbuIaWaDcj#6uu=fM%pC1HoFtDfs5ot3Zl_i+O?sPSKILER^_x(8B{P0**jIFiyTX1&(3@o-(J*M;zvgrZGj7Y5c_ zH21%1m+{H4!EVx@8zivLeep>TxZ42lo&=-+=n}6B_M9xZ~aA>iwN4`kdAFE z#{;_;t~b3jS7(6)i{=nW?SsC#J+9&Bju<#his2uI=)6Ph_Jk18OkipfW&%SQ*eEby zOu|i0U~pB;?1YU%kFq^OX24{RL0~Yi;g41v;->+Bw;9qIgr*OliBRu4Z!udzXVlNWL2&Cw(BBmV-OB zZ{DM|xkD>+d)6(NS*r+g9bkdSRBvI^FNjTJt=W{us<&(+X$;BBWq5Tyy)~(>H75!; zglo-B66y`%=nat@MaX?;z%Ed-k3R+>x?4)Ax<4u(X3nZk49ir8!g=SJ?<)lt?d#hAy~_NcK-}#pkq@ zz~Z?0_E}cwZt?TV`Usf6O?>;uuCl&X)`zM<21!Pr>M2dsRwI0Ec9J&JKuWy&}H{V>2$${+TyKWP1N6#|&nJzQ%}O9;IGiuK~= zRr*M471~GH?;u~J(lG}l#9NO`XwN$F91@9V$Xxa`vq8ID(4l=cD{SS3&u4|5yb$TL zS$!*MVSw*IoJfGA3a&hWUO{;)E!T%+j8XDVU4wk?^{xXKh3+Rt<$vlr!W(jE@sP>=1Z7<@F)}ZyD476F8 zYBM+AX47jp;5=7Uci;L($tOJpl_b{W77GZN&7=P#nxde;B!~Sw`2HCC(YSPDO zAFG<2ItVe?ucb$)uAxV3sz=W}K1PpnY|xmwx-K0aR#zJr7`KOXxE;8*f=mbBE25BrPD7ftu?n@qak-_ zLq0`CQJ9c830y}bx=wAZHRrE5o2EKml*|e`KAn(;bUZuNw_k8|$#lF^coWys^QyaV zP&M6`NYyQsHWZF=>Naxf)+}9J-TG_ISTU?un_;xK{Y=&RnX2_wr2I_P4t=bu+KXPQ zD1E1ApDUE8l6|32q8j#6S^@_m6)WTmw#S!0@uX*4s!vpnJH?wTQkIWXytw{K`s9#P zClf_=!k4QSacW;lyE8S;x8Sj@Ol>$V;;xUfa;TF-)b2ytB!XOxwHsem{=9IqREhD>7 zz8tFJ{nt_>+Y2`|)|v}fAG)Qr<_@({4{648SgaV7S7{fmcFDfPYXg&%3J30W1L2%cabbxLgoo0S;qTdb_3sJSn!8kuACeF;l~C&Zo-13u zsZzhcU{PWIGl#EXQt9{Pb0@4Z_dWSU%R>Dm9Z#5L4HO#fN2;)~3JvxN6k2Mpz<$Aq z(@{TSKbF>-eK6}@U(Y>V=s9zU%ap5jT+wz+d}lqD##xVPf2zXCt{iJUKI0EsAFo6E zT=aoEg8|K6f=2h35NrP#IFEzAd4@L6vwjjHNFu;@c-cjZ_WAaZuC%9-^d*I0E1o)-<8yQ+yEgi4#y$!&AM$5qvmd5hfj+syHJ7pm~TDq}OASGMQ=;{^}8Vi!4A9yuNFvb8jgclwCoU#U%05hT7T zES2Hs#$I9|){n`=QI=h+r#^@R6Z;C{h;Nfue#@KTf}~bMIOv0L=MIJVLUu#Tt<}$fHs6940Rp zm~s?3kC;6O9peMy*|gqb@bVw5Bz;H$cI51TQDEnUl+Q6k8p{Tis!0kY%lGYsHw!aN2q?*qFQH0G`8rui4kRkxbTtS?RMT9{;5UW^f zfLQfX$R{(vXHV^Akk4MP7xf(E^G+MZJsXn4NC8%N+A!|fAO-Y#H+z8Z)bz91{NF3{ z(gWmkUV2C3c@gOi;#rx9=XA7s`@B14o{-NP+OGgDnRS4U#ntd#%__oN7FWY}!_%36 zDPW#58w+q|)&s3oS$g}tJCO|l$F+Ul_wt+{&xypdb?IRnV-EF5A)iS+D^ut>aoHd> zX2VIs|M@K89iQj6`*GcNzdN3VZao_J@N-uR{w((m(g$+#f}{c+ zU8zeuuE;_>Z;+jp%7DtB!uL~nWz_ntd*u$*0~`Z;T`-+R@S_t~DIkpTiq#gtbBwb>kV#LyhDum>J-z6O0wVE*++>>kRC} z*&S8IAj~E+F@klBB)j6b;;s(vV)hyjuoA!!W;j`4)4o_CY&UbeViNmdfy_JPB~VR( zjxw!FN7K5zMbo-;HLc4IZBxoQn-(wGt}mJ8OVIjWqmzMOih$8s0!HtYIpFl>K@Bp9 zX8})#AYvkLJ##RwKy0?kEEoYm7f4)8I=UPtuP56$hT{|t`j4GnF2F%|fspr3NO@Uy zz1{n6*($qM_ng`9c{0gaUa@<)@!;<(* zH)?TOeBIKXRsB?hegd9LYS2$T=%+d9W%>ya(D~u&ry9!h&F-iCYB9pY=l6Nvi*AL6nuUg%m2J>aHJON|prK|70iCCYLON7+KLD6s6JcJz zhHD1igb(qd*#x3BOLjGi6`!CGP^YG{YB)6|vJI+>D1Jd@QV3|;SedxR6t}H1M+hkL zqQeRphJgNK2w9m@r!qCaZ-Yz~P z>>tuxC&@4acF`CGAP+DFn11^!pA1sy5;w%pnQ^-L)JX;{4LA%j{SP=%LI` zJYYA+HHCoIG^nr)w{r>s)zgH4g8s?d=h+MbYRSx(LO^kknuB^z3IRpAnuJc7i{0!j}jQs8Be7K4L;I(-ND`w#?lmSAMc|GS#CF%ZyMtp{zR zaW&~7ONu}&hH5g46KPFmrI$lMT}@!pU|44m&|Y4XA_TO?fucEsW~J78hHI`qvYRUu zvxY!lMqgxtia!rAp|%$UeqaK)1)MGLr3Qm5YZ&Ua(KOXa#$MAtt)=tom%zXSnGW$3 zH+8ZQrW0YH;DyvB(;+;-*)A(;gcK)%Y`sCtqsDm|BlxHikAbKotWq5UFC>zT#XEQtq0#I0X_!xh*{^_SvY15@*$q4AxUi6iX+T=;T&7&vq( z>w%ojRU9g~kcVYfpN9%Ana+Pt3GT>nTh#U``cn$ceht;zU)WzVk1J&D8}J zzjh|4=;Q32&Rkv4ceaP#SsS(vIi8rpN8h7B)VtNjJPMl=CU^}W6=I3qHz(98e5=}= z9ew!7Q=!4wZHfu)<(N=*8xYHW-fcWgF`>QP878y`Kr*1dyg<9nNB9O35*7^W;cjEn zYW*06g5IS)QuGg8)0dEY5D3K_ZX050kH+0X+jxxZ&l<Dy3%2oAC=*^WJ3HG7WXG3c)ft?(*{+-(dyxZ*oww3{lvu7T{R@;6F zRv%hlU!Pb;D6O35sk>7F z0!j;xb=P|-P#jx;X${I?FJ(agaai^4{w&n|sFbm>21Ax8uQK+PV5<=2#h*R-)u1jS z%ByT&;FHkJWz>S`p}Qz$eY4W~!y20*g=-)gaA9AvL`K!CcRYH0q~nX96|Oa_62f=} zg6s6SW+?;D5!#RP+~FM5ca2`yfRih)HL=PdPOfY({f+j(SKor?v;_<85;0g+KYJJ+ z=mtb-t=SkqV$$vof#tlecDXp(F6{U#OXr4mDXldD2VlFDvUVx%V5?*iI)i<30u-+d zq*2K#*(bDJq=FjVAQgyWUn+`$=3frNfC6jA)B-}-F= z+xHR|oX|a1N+IYIkbDP0FONr+Z&J^6iYUfaSB9W(8ik;TKonOLhYV&j-PhbZXq^V2 z7y;oW{hTKp?(T8?mY2+9WL!<#mHRw+H*v2_HVydVJ{~waA3PvD+dJjT>)382K~|mzG6Rsb*?Vp=R=H1gncq# z_?ef4lMmtTbmL^7f}G8m-M6H-`}DaP^0M*s>Q)&>fhSc;^YS|1?xV#F8T~#k9 z1hpYmy?hv07FZwf+Yp%8(3*kuc6*S?A8Uwo?EGZ(tpCR(QsC6rQ_>6>>sjfq_k~wiu+LG!@t^8(xM*52($e6W8W(Uw_Vk{F_JyZ0EA}OXb+#a(z5JUf5D5W< zn6(C(o>B9T&Q+7(+=k`NcSj>oZx>5YTWij0M|f^7UMb*l_7=LLj4Q_~^;TBRISK7K z)~X>P6vpUV9n`e~IA6tH{E}{MR?w`Y^TYf#^dNE6p?#FI?S}aQsOp=v@rOa*s-{Bw zpqr&B{ff)jpJe^(aLs^C6`G*3))c9zg0GAd*D`>1W80{p;FIh7u;<2qn9l6{8UC;h z3ckDsFQO{=>zeqeIIe9vJf$tC=F^HAVtW;+vKJ5+>cjmGmZEy!dT}|^{V=FVLPG-{ zddY?{Eg(i*dy)*aX8ul7zEyunZ?hddFgMhO8X@7(XZf7S4$d= zD+zM_G7UvPE+frLKQ7}>$^gv20>EZP`Gv?(3dJZDplmR()C(Mdxnr=Tnia-9v;xL0 zM$v`T4y8d|G(-0;2Nz(5?#D!j%d(j+vt6H3NF)t&a8?DtBc(<;Kvm#6E|h>UDgX|v z_@4bRce$m{?Q%{yqgwwlf8f;q<3tl}(EGlWIXyhCu$ypaM|oe`Ce4^ z!no)cvho1E8vRk%4gg-7l z^rY8%zUI{n2(%&=Z3EUVduV=Dew3Ze4)SyP(GWH;g9MHq_%>+$#AXjHy+#j0+evYN zeLe7PD?N2Xddfiyvl@i9m7a1C!@MSii#8w&i&weVZM-}y$*<0jfE^|9F)Mn0r>Ur$ z?a|;!Vip{&wNA@l+kcUY#7hGE-oZowWZIB-Ay{j^6?2QT4So2;hC=~|<6eDdE9Q&p z()dMn{=oA12dZ-=dthp#`Q(YS&(ZKW40>#MSbUh)fVp#_edRzs9k;%H;&ZTDKnm^< z^dDux-Qp8j#{W(&2Y2bC?$odjIAplQ2<+vT)b8w^ssVI53khB{uc>Wh@C`2;WQ<-iFB$#&5;z`0&=p+5!buDOy&ji1jkk>U zRDZaqqVWx@?wzb*^PWP08{I;~4#T{s>f;|+hUa8#Pc_B2=NRSu_oJsiI?_{*xn6j) zdunmCr*;naRC9d8hVTN7>#0rG>M6vejtNdL!<{jet0!WpMFxPp11BVzONac!-Si^z*XJ)6Y`DINh6CWr4f4<4UvOQ(oJ0rCG!jOTij7 zlovk^S=5TE^A*~i>*fr5e!T7pZagnKR-n3*MH?&`xaxX=4$DT%-6 z`ODs-1|O(SNgdl#vfnrm-&O~Uo(KO&$zBHC{TCXo&$RJA=Y$F1#tAa%VnzWUp%}Oe z%e5As61k_~MmIy0;MFNXxuIdsK%Fg`7hkj5P~M_>9>?p(o_pDmjN@}~OW||$JMe?A zVsk+;7Cs`cw9{O`V}l(={IzCx{J1EsHD}N|Lsfg~)x2s?;CS8G$G@0X&BrZc2U!Ub zmZJ|l{r}|;doBIWzrw>tRYPxBHO!8GNqMa~R~X4oiHC6Aj178y&INb+h;$ngB?_Dv zx8tKSA%g@0$IUBeJL?I^GLmXnAzWH?g9@d+Vff0)Op?amul9lWmd7?9rQgO87;ugvZV;yA? z%CyeZ6=$`~w>PCO1;a89sQtrb9SpME8=)5>!BN2>p@n@EKAU+U404=!%fSU08a{d? zIE!wefT(BlgF2qY^RZIYrqKvZ_P|0~rqP@% zqbzCLI;rvDjnNOu0`>UeS=(eUL1dU-S$HCrSZU*AS7McA?BmA0WLQTfZtSA8V03Or z8!>nv6C@+GGov$vQ~ymgIyJ%0u+e$n$OL)6n;_NamKvSTu(^iOd1=JxeEG^oC-T+< z`%Jf*>2s{;+S2sRB#QeuLLO9ZjdMN)wX7+4!HiNt6+C4|xl)FNmpm{<8ONaBzZ~3U zy}mhf|H0<=#sXr-t`ZJ5dMaC9{hi;oKV4a73)5`%nVlM~?YK|NSJ@k{&ep}xxv;b6 zfB8wT^^+P<_d*tm=3bn&1;$4}B&vZ=>5>1DHyGH=PehDD60iy9gXFEp1aZ1xpC3sV6P_1+8KY0e3_>nuDx z590jO6rM|F(E7hN5wf9{j)CVBDm1lNphDHY2_E{Pd5QPFn#lqY5fuR6?vQ~fR}L-H2|HW z87u*Gd|6x~Pvu^V!jjS(Z{CEOXl$c5!CY(Qa|QQ=!dj53WzqfF!FU?q<-jTvRSl1G{H^cAB_0a{Y3ko}6EbwDP?=kL#=OmUrp?e}X` z2zPeU(1QI#QKsLVMVWr{P?Ra2pVz4@g5g8Q;g8@_kIF!JovJrj?iJEcmnCZbxkw{JF8NH;qTFMk*HU|dO1 zmu+!R+VK>^Fc}QFcVK@Rp^eSfUo*AxipF^ESMWSkW*G(+RptQ&n7jDSDUCM-lB&Ud zKBO$BJpDQz*vcNrK+gR!2`2ZZv7_xZmy0)j>O2NA88d)tXO_<%fKF2gMvO_i!*mu& zC)+SXya3QWA(nsWcme||wvQ~e(~ya2z`&=ZXZuG98&JMC7d|>U#%+&u5#!dA4#FqF?gPFJ3U(@iE@Exk1v$^90g~UODya}386#3{kIGN{c5jz# zme|EdZowqs;v=VT_I9X*El@*JPib_dV2)`e(}<3&Ko3kNF{2~50*)|?Sk>L$=6npL zQh&8yncff^8FB2zvuSMP)VSEl*`}vbo1{`Zr@EsfQ9MJ*^pu&z4PTrVUuMx&9UTXx z$3V!H(ql{`HnJhg%MQr3y(7DM5u;-gyyLLspTx=u;XU`gHAVLPR0nAueKp?U~ z&H&XO25?6Qa0dgp1CT#bSu|poYr#W&eTOkmJ@z_M2IPY{l37QO!NHqoY-Hr*W)^bO z$>}lp1dWY!qd2RE8^yCSgONQAF`q?c6cytm#sf+trN@|Nk@Mij(a^|m zf_yPFa*v8rZ{LVG6+~%nSd=>PtW0Ntk<&wgk-3byz(`PvX<+1ntU!S9h^vO(vj&rFw)foA?Yx;ve|SxuSqd55>PUj;jIC_ zEsKk6rE!r_qYG9tPK1-Lnh5N-KRB2Oy)g8{x;565>2%KgQll3~Fm#OdWjdYsw3P9U z6x*EU0=A~Ja@E#Mlc|*ZI@cnys=V9Vk6};h&?EvscSE8H;~Q9%fDccB-L%~-L2M_R zWh}F<8RMwmg`MfWQkG=d?3d(xJO$PO7wX8?Ve(pjZn zHte6LFK&`Yfu$4qwVU`&0g~}EX3p74zg9=YH-*D*eUh}?w7u{Vh}>nmbo6~fnzIAR zws$r?iQ+a!`?T#Jg|vd7%7$@UA}DLD(F4$WP1{hm+5XX_)B4pdNxNxmC>>&G#=ej& z*c)FsuP>a0TxTzw=L;wE7n<~i^Vth0oBoCuY8c>N+Lnyd!`3LXRFM*baZ_&JfC;JG zGR2{*CYx2pyDyskaXe(2#!NOun-o)XTPB+o>h`N%+NdD>Zz>J{OX`xGSK{7SKyz?! zyj2p0|4pIE0&7GN^H=F1jsU}HiYr^0lC6jdlzXJo!@6ld0|Ds>Kp!#?FjgblWh|N6 z=fT`%I06YArn2b2DMtU59BsoqY=Fr)l6gnVfD9tZbZ!gNNQj&*Jnd}Z2(~bY-GEAk zEj-DNQ3$Q-C2}Q@4PhHz(T*e8_Eo*2O<{8=U8)w?bW4U|n-{&of>;0j1yfZ_RO?9M z4@08FvtRaaB^u7N&%FM>e>>TPJ>VfU(j)J48Cb;7o;a3NB>;tQRe~c)RSbw4%5g=iu>pyJ^}y>K zvy6TcY_3!V*Ow)-bNAZt*r0D(N%@u@N_#Pu@BVR2LTgO}c9GOf!Y{u2nFkIgW!qwN z*vkPvuYPMU32bn0V(v{m8!$f9v!{L#A8$ZH9UM;r`_#Eld4mM)^9+t4K->bVfS08r zp00-=nHa}x<7Xc@`0dR|JR|_n7Wd%eV{)iM<7rc{W%2QBp$fjr!vYPTi~~%iigJJ- z2=POn5O7K8b$l*b*cH-qC0fW9uZa!97@;8wmyp17Abyqoh&M+|r(yy2pS!q~ZIgU$FmVSEZzey*kD)@scB}y3$A~6CnwY@uCsc5Mz1=?@+L!Z#r=-DMKj8jSk_i_Tmy6?^gPQD$sz4g!8Bq zF?5hquUrS*K_U!<3OEyb@TxLk*jfp@&^gsoQr!t~=%A<;>oGYHPDjw#DR4NB-wv=3QcSHx`O$Frxkb6P- zAe^SCe8M5+172=ak;(_0uc`8(`Xz9j(%sU_I&2Ig%1Ong0eB#KUYx*V zT2%R|K;XFrN^#=ohQMPd$*voW4(w6>mvX~!(4_KS&W3iR@?MrG8`_usd~73l2zUZN zAKc}U!Oc&HD7m?-tP+pG&Aw6{m`Z$QRN~Q_5bmbGVUop=^(6R?RIr}YzhPbgD`YP} z@F{4!f3+SC?E3o2W3B(pZ8hYMQ&R#?QC;qqRF%B=z(M>SCDlRVE#XfnU$n|4XhJmB zJ9|s`LnnNkc_G!2kDdFJ2g?IrOwuHdrX(61Y#JO!m|z=$8Vk7dWz-i_Pgy*S0o8FY zKX4F=?e+O3^9tWzS~3^Tp(52K^EeL>Op62Rm?d+O$55zC=D9-oGdzBlouo&tmXId_u5f%mkMC#sLxtl9dHf*DA1)k!gvTFY`J;v7kMj7VEPuRk{1}fP zWBG-`@e@3Lg5^&aj-TT3Q!Ky8<7asMT%r6K9zVme(a%Cjd1iCMzxe_q-`q-!Y_3U=q=T48XHkegm2n>?St@KME)SlFaqm2@|MnUz48Y0w&h!A(0 z*%uocf(>;i+88a&8N#*(xAv0AV#^)i;m6J$jB65MBiLIsPn0xc7Kc)~T!_WjB?1g{ce{JL%Xlm8oLI4waW1ZyuHqn6)qqU=A~| z!|(%(4*qCP;%F~)lT-&9AWvyUOXkyZloz5`F-ISX3FG2)0%ljP<(_}w;K3$xEEvvN zHaJEvD8!UTTI({+vH|Xu@&GHvQ0=g?YckA#>D(U-2nPo~JDd9hG+244!QdvvIyGxB zlQmdSXs{qQXfPI~>(&?xo6N8eFrH}b2I<_-cJpZMH@MD+`G-OL90#$RO}Q|sP>9jw z`3Iy67p@3s|EsNT(Bb;5irw^1n7-Jv z?&8V_=d~i~dJbDiT>YTO)sTQu;5kKQ*!k(0^u!#&he9J&2MJNgcpLskew(zn%*KHU zCpJfqsyz1)EFksvth4ol@)qc`1@uC+MRp;MR4UZWiorgEMZJ4?VkDq*2Os^Fb`*U6 zt-*pPUj56l*?uYn6zEZ(fp+5C#sJI802V2r=Ygi5H^?U&Di+8rngj6;^dGWVc(Nk} z1tB+_FFVf5juaFW7E;gSn5pMO-4(+qI+Xf0R6nQxN~n+^^EPuh-hr1}j>iDOWX3^) z`grk=O6if)@s4Xkg2G`)kdYn88tM|y8`(if5R!^A@w_|jAVEPf@w@^2=a3k;Z*~BR zCM$C(JK>Zt*k;0YF8?NkGAq+fwF4<6$Y7JyVwGYLvVu&bOgvAFBc9t_g$|o`ATE=pL)lOX5<)5vrjp-D zkkBp_42*gB4Zh@IQElvb;4G08muO}{hVV5PJRTybV15uIA}$`p6JqRxKH)=~++k%9 zx9px6TZzOGjX@5TT@F>pqk3u(m#{XNj3=$1u6wQ`u!%}(Fe0AuBz@CiFAlM3T9<}{ z4%Go2YUI!%193e}c1|K&4=kILVkF$>osdwo$LoOM_X9vw$pAzZF^ir{s{%gc;k@w} zS~+xRQn&xhb>1H%`IpNZ??6>LMkE~08;?y5TZ-EX9cn{un3yR!+cKF$hbA0!sF^{B zb|`eH4Vfi$h`X9p;LICOAGt4+fDUyOdq9{-cZu8SDWs?&Q-BVIz#bqa%>1#WokE8S z{H;u7e%D|k3XSh=*|H_tQWpbM!Nb0d;x+>I;YS5<8bx8;wm}U2iK3fPWa3c2jBS73 zm#(w{AL>f`NZgefX%FHlsm0Se;Jkg_!@hKh9}2C{CQ0!_Q!-8b&@ROfHS0KfcN1I+ z+2;a%AyY(Rw1FkU9NNY+t%r<6t`gWc0k%PAu-$KY*H zyK0NZM7D35<9rM{-)Bot1F+GRDFA%{=}X%jStJ3!zy>&WPutR=RQ3q;F>mvJ5g=_S zkpk3bhnO3^huLXHcD&vDd0#fk4hQyWao#~PbR+GXy`KeAJly9!i05d`#e=>B{48LM zo$-@45I-U2ulxLD2O&RO(9ZY!afnNP+|Q*yoru>5Jbw%}d(8kM3MNRj5tq6F~~@Z05sFRzLld^6I)h~(bf3@VfYf6_+F zB(F!w+a%Kj{}%Ln;|WlcCNG)1~eDU%@GEanlfjpDKVwdmSM`B5GrnJ6bMA)oSIRsB1Fn?IQ}8BX}SAo8&%yI zHDcTuLV|V-L4xr4$&T|$NJ!9_R?2IywwHSpVL@;BQR#Q8$>ttafCkavz!rHrQR)=g zl@OlWu7sF@rX(E1ljtDXq0k`4bF^_H1?03jTRLcv(~N*tGBJ8OMy4FR)lE;8I&xKX zkj&fFV@m5myI@>R+NjCQhMG*_L|T(6Y3I-&R}*G$FG7Rbc}?EkL_P4fNeMZQRNGET zsMsLWH)s45927PtVTXh$z0Y?w)i|X04kkiB3_S-AYNxXzfIwji4{E3LkCwtRfZ=`? z3Dncs_Y5RV4c<)cXBZ*VM;_oDgo#*38d|ZPQTHYc|#fr}}<+4|UcSN(7s3v4PT%*9=_mjP+HGT4A=wVAZ=Bq zoW>#!5dzwXe(O?6TWY)dIoN!uZQ`vhdsW>l)^J4)miJ(4zz>52A&nYP5?ggXLBBAB z3!1d`q_6E9vtQx_Z`kb}OE%j**jeI=1@^HsUb163a0U+ElPHdQ2XP_T zT;iq9LgBac8L9@4n7e!U@hI$T;Bf>FIH}sunLgOH;mterJUI$QFD}%@NVV_Nn?jLn z;gjx+1wY>x&*SH=cpH9>#&h_}yJPZ(rLFt~n_?wH^O!}mqO4zx9lw}`ER!M3ASPUq zJeqfVG6ml3tjo^x2}L?a(z)o~c#G^L@MaQ{I*G;Nq-+7kX5k)L00t*4u6pWtH5b`f zjgw7hhZ>;V{Pkoq?^;c^J({A1T-PL8A%-PO( zER8{at_83DpJFqoZjTqnML;3`K4;xKl!ic+(N5dNv&b!Sg4>6(ec1J}{k&{XT_1>n zVzwG<7!SpTP2^l3<-WOXd^}Vk8tQfg_ zrLK>%Y^Uqvw$$}e*3(yvhPo|-3?IgnL{KiuboxDv>Aj4J6lFS(9)@w3m8lJJICXuH zWaZW@8tT^6^+C=(JVR}V!HABdEiACOot2C-h*-b9ZFaOO8* zl@o7OLDGOJn8z^uH#$Bzf7hJzqly`z3g<_aGY*3(G~w;l#5Pemt&9k0+{xpnT6LL_ zP0llckSWsV6`AvHM?Oo&O&wll4%%p+*UICjFlx{aV`8Tc6=J7A%^GcF&O4NQK;UIi zZZ?Eq#gWug56IA(W;A%Js~(W9dO)yvu?DLIxCV5s>A%hE$!6yPX=NUe?dk#PW}DA6 znb_>~fRJX%&w`||80$gX%;{om2A&ZzQ_W<-Q}Y@;)lEGhLlA!HW*(5q$;k*LELdc% z*eLD}1y8NmFzyZoPa$S8($8Y>)H`HOy6}F?N%u%RC)=buh-ai3_jJs8@CnXk!Bc3B z)ViE;aPJ*(e$=qu-+@)>MDa@zFeNjj=mHrgX{fsUJn(g=!Bg*mg9MaUvJFHJ-L+;3 zEN9ZCfmtG8lHn%YwWIOzyKpHObt$B(w9#@5A~GqHT6!=cVr2@5z96&0a;HNX?M+b13O%v08m|2eE1}?g}I)U78wM zMbk_u_oOJ&hKS404^xaT7+5GuU#A-s2m}kfWv?TAIGj6hgDB@Lph7(BsU4Y0m0PWL zWtLXRn7DrKmhf|q1F0-{#Xxn$ad!=*~$q@3FEpqdv8;zxrqvrdPoDJ z5==9abk#jlUNj5Ic6vw1%yNSUM8)~Iz}UF<|I*#yA#ov5+fok+;(#{L#cgY1OCfwW zNauCb&8tS3k%)nOkVVEL6;6vU+b}3+bWk!Rirk7324z>>l3jR6I4I#EnH&CubXa=6 z*|B3sv;*Sf-OM33hasl|Y-q#18349gih zN9G`_aE^dE&pAgT+2%r`v>AAl3yE5hZIJevJS2)wP)w5>n^`s7*xV+w7_STh-G<7f zo{_Y%GFh9atZk7VJtN?LO+`&*sQfl>6%xjfs1+5cxqTx7RS>4$urSTU+oYTML%O*? zq}(q^85+JpjJR`#+~h){Fo~U}!84>!({7Zm`a&cSaUoG^+w`F|H6&{La?nphqGm=t zA+%)>aiorrg>fNKIISj(o-T$&#h5|L@VCZ8AyK$T%^1BW4T(aznlf5W|Ht+r{|7!f z**+8!wKoeD!#FM>?|N!|>0{{oc!Q5A>tobl)5jG29%W2~aD>zEF_T6W&uK{1973Yz zWCnpqj60U?g^(z?-Whc`=tg|LjSJyH$=~~z z0DV)A0}ulfZBA3YUkH@~AGMlcqUt^KgK(~kG9tLc#aOA}V6!RFL{P5#kW5UD9R&SO zH7i)lUo%Qd%CfL*4$H#%I14^3wiLso_~}uAhz2w~gL^7C^y#^%AV3D>(7}+6KnF!; zBTTq^LA+Jcdq1BZn!FTj9qt17Q4Tf(v@YKYCrPMx!b!qIy_1K^J{Q8~V8m27NR5Z# ziXfi?8`^K(huqV`Ts#fUeUog5-+(KE2$|&cPiZjmSW6-9MY{tVJ~SCdEe%5Q!6B}x zyY#JakKk{-0%k>PIY8og#KfAF%yi=BZa7E$uwg3F+2uM@%&qq@umgsBECv~GN)MX)!UrIE7sVxh1qagMGO6oT3DZq`A z+#?CxC{c0!#Hb}M*wK&#A8j9^FYBlqW#qHeqteMdDxI9Z4AG46luT;Mrb9Ty--69a zM(vLV3cbKUp-+e@sdHo9Ka!Ld0E7p%1A-6vPqfBCQfr+?V=q%QTo8r{%3yUz5l~kUF+&KYyIT~R{F~eSE_S(U3LDa|LElE`+w>ar@s0s zN7tGB)U~#8;9*?VR}Y+A{c(yyLmC)!{s+Z> zF9+rIjX7V(Txq1LHK`THoIkdLk*i=0c%|_b^lwABfcU6d{ex2f3aShQFE_SBH8fDL-;D z(Ux7kaQa(Tz1Hv7Rz2{9XZWVFDA)88`E1Q$+!i?+d~%J?QI^m*d1df&}>);A=RX0!>e`2Fkmf8qIH zqy-|hfOq8I(2g0C+rp^R_4kXm(C;@VgQz|Sx%&du748YZ976XrdWwjPY?EqJ0styNCFRgiJ?~zzfX7^tBSIc_qg%2mVGs^G$^1{fCIG5k}N=0vc;V(km zSjlhvaB1X5oXc)J_ZGeHzBX#qmL?EaA(aT+&D zeYN)8O>Z@fYf_JWtV}UFSL+{$l?1b8BT&m3Fjl7W0Fwya3i4av$fXRgSY*TFV64M- zDz-PJsxF`s5)mUST+sTAvH?bnQ!MMED-Q5d9pAvXzi*JJ<%J~()*%sZL{jCWu@3>d z3phdLXm;M~ZkD6^D)+`}ywLX_sDB10U)>+0Cr{<{y&JD~+J|7$IOrH+g zo9D~0+Y?_(*kDG^);p26n2&wrbmA`ucSvc~Eb~nUETSd*%EvzGX>~XtSV3k@W;I%$ zCv{@q>`6@O+4TgWw)m=>0Bxbkjf!Ip##;-C*UqF_U;Owdz1Epch@F449=i>g(31Tm`}@C@+J59~TwBpbc;U@?>^eLCYuC0rw6+g@ zEgx$mN8*IIbw>8K(sgji49{McOqV|o%#J{%? ztAMBikR3nDB-`->3F{E>unFfvZ0aM}Z?l$%gLn(rMVS;k-YTUyuzqZq3e`uR4K_`1 z1ChF?4l~(`4|r=E8xV^14d4iU$FUeLruk!VZA;sJFM=MswtQSV_r%j+IT^%Ln2|du z3jiQ{$FY0hbCDtC|y*L=TIKaiywOfwc_4Sv%V|rCMh^L?}#n{f#q^*3Z z9at2T5*(2!Y&DSy?tWiFxWUfi*8t5)NO2rU#V#PytO5vdPbx@8hUlSqPJ(!wYnW(| z7@181+en!lwvr9XIqJwD7cK|q5bD+$#IxYd11*<9nC2E(EL+{BTO?cz&iM#%+=7`H zmMZ=T8O2uYayEO|H?v6~o6$NgGPNHaB=fLz1LP73tT`TcWgb4x0Er1Td2O(w6)?CF z__a1+!k4_G1DS69b}f-!+?D{X7f440ISR4cnRJ`XRM645z);%2Ow7Y2$W$Gu4xlG( zX?{nuBn@c;VWH{1nOc+FdJ%Y~>$srJa4)Gzfa@FvBm_S+vhjp{(@6sSwBRG#)cP0o zI{unOK-}>`(#A7GX`{QqP)M{|hzP{N60#bEijqs(D#uwyca}$kq$8W?v_|8GizZqI zjUrxfzpt;o&&PX1d!IjOJ*@90m3`+Zx;tD9`sf)XS&@$GCR(5Eyw6yd`+Wdk(_TSb zra2yWT(9Jam_nbRGm)_W=pYgH2zCzG9$gz8Cx$+jE;+dUcQ&iiwy(X;Oh;8VP@G5` zDYoM6){A4sm2S4r{qB=q>$$o|>miI|V7FmlZwISMW|a+=UKZ+=I!Dh)A1Qh^7+l6usa zNjRznvH^=$IE7Fr$%y`>u=bt#J;+#FHX`--rm_wFbV}tZLe88LpDOwSapqIZQ zQI1*+!PKCf?)UjjW2b}8aI}5gXJi1`F|qbRC&C)NNyX#_3GH(i!K?s6ZgwO>g+fw_ zU}(2Kk7CfkgdiTtRB*Ux?p`*xqdw#iPV0l6;Hfx}nRrsBq{=T>4(-#B=E{;esXy!d zQ#*UfoPpRHgeS2M657}J%03QX;NeT&p!KVaYrqFS=BvVoM%j;xF#UG2`q`UMcEL|G z+EFJx?l0p7(EZR&fz!Ky6F3dIS5*}O#-ZIaNR{MGnUW;IOi@Xq-BdB{{Z!84h|I%B`CF#>1_lF)m7@4`j9Fw!tTK|x~j=?K^;(0=^^OrO>- zfd##@WZt6+eNQI!+AL1$!@jvK*`n*=TVTzFm?t^TZ;!E4TS91AfcXnS*rYE=uM%8* zdrSswY#h4jr-N*70m8pjdxIo5U2rQQuI5+UY#T@8mi1x`@n8IdU;G2_olOlZZ!v!& zBcvE#PkQ?>4#bhYGk^DHCdtChu?bc%^TUwf=XWIliJVL$0Go=)&3A4fv@sAkalu+) z*zu_Wh8_p2U{ueFAoW*Ub7qHB2`~=>Y1Neg;NN`vS}6OMTV-dM?#H0)X_&9A{*-c zLF>~^hBcva+Sap?w54*e$3}`pwsP7@x=xQOq+}1i*~3`7DV`5jWX|3&h(+eKiRW(g zKj9}8*am?;1sj>raFE+o6rN@9$!$J4?uwxML;`zKdy)Ork@h?B&#gxo1=8k%MMF00 zK%x6GkEO~y5S7*(AM`;%KF8#7XV7#Y6oO>8;x2v~7+P2hfD#)*C(~{kpaIJ{0MnRG z1L{L^Vzn7!wHb)@X^Jig+Qpt=^u26RG24>Q92~9>LBqC}7#@ahKZn1&OXefKh)z3k zpdD{;!g|u~Apn3kAJBUdT<GIUVyp6qu$1&`$*lf+dK22gKR1$ zak5_P3)LAIkh(%j+6WOp^I5X|rFuK*pm6;|2jQUB!qy<^qVVzq2NBSLv?M!L{gcZm zz)Kf{bvy$T8lJ4P)g`0mX~!9nd|Jc^4H^yU-_bzrN@uPHFiwzJr9Xhm<}+G3A{y~3`&N2;EpaJ}>Z3zap>*5?B z9MV2w?*`#EqaDPwekZ`~DgX3k7%-HpK$NE$S~8zwtZ(=0kPMv>lTkc>EHPVjuOCz{ z!GaP}zF=AxLqyMHED)*U`O1I!AxVkp-Dp-xJvDsM#2-kxP*&Kx(Y&|2L=YqIL;#cG`Lez;@Y`0X#GSTwjYx8Nucw0pitYq z28;+oQIq-|9gE3H==R0(1F zNon;_U4*N&9YFnFhIsLsn4v2XivZ0K*YjWZGDfgcNJ@%vQ zu`ATiPwQ8PC%afbLR{EOq$l;q*RM$tNt=JDOSujkktjN}8u6yl`sIz02@f{OT?6H1 zO=)f@+a#Mdl;z@--HV>vqr&LJUL+sE4NBwu0MAF&NKKeA40uUk}mktY&6SfxoJuRibZVgG9dsYcd zRwaAp-|MqVkhf?&Q}*VyCgKgB`*~a%%4WFpVEK9g*9V!e4!pYQ>r0@}9?QO+GL?mE zP59#s_Kre(@xyrb-4d$dh`o+bLykiGah^M@DW~E-av7Ff>x=51u!MI zK3>P9-Aed%K-MrtWPqjjWTCcOz)QVF8*9r@V?E?+&z9Djn+i9CYt7bpUfT5YA}~`& z!15lK$iC!0FG{O<6o51U&?5W)y3dQS;5&fKVaTE#p{jfJXHR}#OCo+A>eA0NAbgb} zXe`($SQ$8gWg~AG-V&*0xOJ_$Rkp5v`Okjxpa1zI&wb)^phr%%;-pqF3x@D85W@_h z7NXkFd0Qb0{A=XNljEPL>N*Bsh(R_hAqJUa(4h~Ao}EU%JsB>VR@|0Gj1@xKG+VW4 zZUL4eo?7)uKeUz0qeT-YQ>(AP{`%{iJ`hjK6bHrKA3*AmaJRP*H}J$+F51v-Ixje_ z5rX47l+LnQ(2Aj&?Pc^MD(xDjIL;+RqLb5{NUR5iM%;UNu(!{<0ixk%k_M=)8=Ogo zg?IYu!dqQycBHDpTg`;GnhS4Lg|}+|#tCm#g}180%lxi;^=D6hUrVZEgcqKvHzK@s z5LMS#U;gB8f9St{@k77*Vo`Wq4~+`%R%fPX!do9Jymb&=k9~3@*_uN(DUKB0q35EX zsK|$fw+`X0OC3|msR1Puxnnj6Z+=M~!do8}-U$`nO)9+2TzE0#QF!Ycgts1pUo;h7 z7mPJ5y!C4e@71IhjsSn32WO2F-lkU53GXHq-umz)l?!h{Qk$UvZcD$GMrqR(*@al>QLbTA8q$cu)F@liK(WD^`FMleI;)sC5!I{_euhBHb- z%AGe5&Z?~7MP9Mj6`=M=_*}wI1O8<~pFq%k!5JEUrnw5uny6ubwt4y&u52{C|06iJ!Dw(!RTxggMnl>aXL#Rr zwhk*8YM9GN>*SO3c69I;Q5#H~HSO_y`^HV$bgC_y`(CxG)h8*A_v24jnTG4Hw5!k; zHnjcLZ&Z0EF2TLtfKU)dgO2iWChf}-<{)mYfu$X4DwPc|xl8Ew1|a+pYs{_L^@6`8 z{X2A%n2J6ghF~JTPJ%_#ScZS>DnkSFT#G{^?T^h@>W?SBW<#Ts5*%~5z*o*8lzk+f z?^>39s9RCG)nB@}XuZO|U>;DnAQ-tKT_L6@l+^Ad@5iRPJ^OP{dad`j>mJtqjg(3| z+%WKvaL&hUmkMR-Lt#2! zF0Y4HsMqN($?twM+$F4gsFO53Aa91dk5 z_rhILhP#BJ&&Q=~KjJ>GoUb^`y5cO`%kJ~ay5cPBinFYr$Dcj-)O9SwGGp{h4y1kF>yhj@3ExI^DDYb z9@nn8K4;R`-6il8zNzk#S6+qj_q7-rZ-To7=?_TQ`gM27Ru7RKm%Y>j^LObk`J|X$ zjxZ@NIEIi4G5+LU&NF3#eYpmYV@e&ITI2}e0=fHn?BXj)Nc{h^_x4eCU00ppJ?Gy0 z-hJP;*R@UG=X&6h<5+;bK5|!O@ zMg&2-89}>=XiOx6O$;$cO>8VV0u#|S z)#GF)bNCo>^VCJ^`(;Z5ZAC2=z0c_}zjTXLLCqzO*umK-M&X#%^nMZm!-jEn3* zrndCqWWFQE$$Up2PA19_fT=CGqajWv(ga*;OBp9~Q-+i2LaOHoLB(V>Yq0ra*gb*C z#BI62WY&lev;`hBCbQ{bjF1M5w_f|g)-)wd=JlpxZy+{i6Yf5H2$8wTL1Ypa6Y!V` z;4v$9Epah%qFYN`OlNRP14=*;jujpNh5gc{5it>U01mX5rOs5yu{uD9$#?;X*=d-T zX*)p77637UidhE4ycxtyK+G+GpCKY6!fu7IHI<SO{i1`}qS7;nVFj2#wcC&$7}1PgP5XyY_* z%&GxF#3?c4R37yM3YIls&{JZRG6~}w!tPDxSeS1SEX;}Ju`nlcEX##6^wFM~B8_blMfPwaunb?_3nQ1ctx146OM%Iw!PmD)$tagJzQWgA=f|MXeK?z1b2L<_!RF1)iUo25Qg* zOtaRY9RwW<0O3u;lUrcPES@ADptFFgG$xGkS}1H8)dR7hV3`0qBy8pv0AsmEU^AWl ziihjvwzbx~dkK*;0V3tB%uMo5?`>wtBo2{sm>Yqh2~OPPy;bH8$i|Ffzt$mA8mxmj zoyZX>N7ICel*Fc*7DUP+ft$-H^zwhr#HG+Er!zFl@#WAcr&~aI4!*B-ZAJ}mku^DK zB8G(lH850$TNZe2l$pk|m=yXV8YK`t1&wk7Xq0Qr1kfnCEPzHi)!+PVVR%YkfBp5* z^=-u`njhHCPytX(rR9g)vDp@hL!w z!L1s=oH-ihv_qqmVPGbQMmcMyK~$3k8YN2*G)lKR@@BZzF>S7aaL2ep(`byCwJW$I zU@>NBloJHs8-=Yr(I^3&e1ii%&Cw|TDX5ERl(RxiQ?P6*6H|$h)<7^R2x&5zHWN7- zV^N;4s7l-K&#UhB{(MS{pN@+d(}W@wa? z%c4y*`L|BkK85$+hMPQJ0qERM&Xq4!3 zn)IPj0(>$X7pi1YjL0}r4ACgBvKVUcGqFgDS&BwEfgPzy?^l6o7BtE!pixelNnk)S zl$A+JXp|FpL3XTQcaL4lp;0<62VmYlG|EYblkD~epg{JcQBF!bxF0Xqk_ohAnj}$f z$s}H6EtxbEOIm_$6s^n`;zZGs<ndEW>Idd$kw)hot4`uQe$FnvV@_c>BGebBlas9G9fHe{EI%&ev`0{m`m&z*% zqm1^8I^UjO##`@gZC51OXo1sBadhG~?MbUJrhq@k+POVF$Yabl0#^(v!x+ydpxLHJPiR2N)wJ<%U5X{Ef7o&a9tY+`ZA_ zH^P;0H}KYbKhO@m06Z6_SHL?ssJ^%5L$>p}dPnLr8G@uQX3X$)^I*LfpFmV)e068) z+eL-=Q-1uD2xE=@-i0^YS>Ej}g;U_E)9{3Ddky)_8G4GHs<?2&u;0ZLHq|}jFRMS_U;gqERqb`LYgru{z=BOT2L9m zXcA1A1kLN+_|K!zz+pZxXn2S}Q5pc!!zU67rhv3o5mU+duZFSR(`?cN@xL9$J$K*= zbacD`#9W$|GPd>2Xg$gE4pIYYIxs5!Lk0g=kTC*krefLat@jpGJMfZ3(Tv@5ObDJR zG~9=7Ph1qeuD&Dly*bcxzBes{@Y`N5QO)bnte3rB{Ah%4cP#z(I-%1vpG#dYAbinV1hGEM3NLjmmW|?uf}? zkMFY)>4t2Gfmq*X12ROS!7&c&`>alUXhH$V;BWQ-+oPa+35?o_IFLs5l8UJbusOpU zzt05Jy#O1BF|8Ro&<#(;MD!Uvl9+J`#yZ`=)AzNefCqsgMZ8s0N$OC1S}!3Kgxc)A z4=&ZmYz zpNVj`#pvo@QnAW49jq;DHl`Gl{`sV58a$OA-h%*`u256K8V-WLB zU!oMoPxWO1j zHtMrz;G@q&t~tZ&CgZnjO8bEqR=i;)q^M{7lgXTaE&(6J`4-}fe^PWq=Mr8ob(s2g z|77wGB;k$;fn3*nzm_l*y&r@XM#&CEu(HqoHY$BFA^GH~XR_2R^gM(x`){*Uob-ux z>}~e`Ai>=Z1GxSHSgnia8o2Tw%kpq>*IeooE|vF7tmN{;gaJk+5XH!8a63W)&rbGI zxESOzp1Tu4tY+_CT$pHd|6X2-#!g}hd}2{m@x!nq(mSifS7<2 z^TB)4U<#ObT=DnekD0*s{!MrWE*>{{yGw*O#FK>D1Pq<$kOH}f^6!0f{wzM)B|xzp zFy;^6 zH_NjJ-$0Zz?6r_7# z$xu=|lt7Br7=gp^3ZgX4aIuu?Rs0{uZc^C1I8!SA685^ozS{;K_T?lZuY~}FLS-lb zCCjdA*VR|cU0uY1g;8jQrAb%iP3Lw3G z2O6A608=$oAuNR=%7E9^TT?DRIVXI=qr3bqJLJ>maX&cFDg4PW{p9f4091<0GGLCZ{lSZ6s z_ukY2;VfbR2jOm`zdmmVz_eh@rJ{13JjqdIj%m%p^WN1aC4Qyq>S?m5UFmQS$XR!#BhV1t zosQc3cBdimiU>>jq6c`a_BhW?wo){=R1Y3d1$>>{J7<7kFBtIg7 zE0Q10@{hRuW3>E(IBi*J)8#ij?PqV+mfv*CKh~9h%$9#_DF4`0{;{Q(z>V>g2Y@Fy zO&fh{%WDP=M3Vwc6kH3jEjSFQG2lamfOW(;h4QuUPz7JfkOL7%$&7ckhuwBO{$>k5 zf@Gv&M$9P2SnxD4z*KZ{hLR!3Y(u~{<1`KT;O+c_AegRRm-_E+1$gQj%@;fnVq$&3 ze3o+juaaXEUf|5hmmBh2)MnhrdhdggSmC$hURnWr$=W>f4h$4iNLugtb zxL`6TyV&7fu$YKs149&Zc~ac*u z?wmXU@Mrt1NhTi`7m8i4w@6!o6@s4hckb(uf1Xn*%hy!CM8Y zxp`qk={DQFv%{Uk7Ywig1i%->&IoN2wK*t)5|P9BY#24;-w!|c1~l#&G;;%|aYh;> zq=3S8QiqaVhblTmiHsphk!P9?u^F2H?L;VZ;4^Y`+0-#Zb$l~v;7A69wlp?4r*u6eat8Iy zYbiEC4)ie@JJ4-+`pEAyanzJ>A9BR^`)D_?Cv(~bmRv#CMCLjKy{5-gB2m0}ZqtAv zQMh=%-|a1IV*K&wnue*_S=?DGjCaM<2!HCOxb31$mTE}zHOTHYtb5EvQv~}+ROtT< z$fTxW>Y~1`@I3NY!*XBA^9W@ooECUr>5eE4t%3KIOv=$fcxB0?9NNIcB@L5G7oD+7 zlIs~34{(P*s1XmtJc*YIh>mN4XOM#e;OIu<_N5PzJul|&N2YZwQ3+o0cEbL=ShIsq z7#c6F-k?6J)5tb(B}%mZ8vaB{9VeV4TEIghfWJr9yGeaiXMiPj8$x+ow?EcvYd_Ep zQ?&sk9GXJcZF5)JboVf@KJKM069Iv{2K70iGB8bqI~QFFDZT565DfLG6as0mGglm?FkcQ zUqE}FM|)0rNz0z`k|x^NZdNYcq7U@72q6k^MnF@}xTc(8Q#{_9bx=o)I))I1H|Qlz zBK##S!kxp6%qYyA+LpGtg;dQ@Pp*})5hE?a9GR-YqL4YQnhpmAmQbJza8##btC$9F zIyaf7%proX!9Iz!+c0(95+ewgkQI3YQ1lD3A~g;H;I@s~bF|gjmd0#f8^Jd_?y%lZ zl%;a-X2-gmk2R?CccBOAJb+@*3c-m;c8##@)hJ6p@T7;il|-c??Vk)~=%$5fMH*rs+t zT&egQsD^S4Bnz!7dZse&mXs4#hTPLCA;^ZSLdKd@0##r>Y)QaG?ptX^!M zkzgD{3?d#p_{m{i*ufe_Le|2B0XUk}Y>tB7C2rFec_Hnrs}#{teh$sGPScN+DVx4bYxo! ze8AWQJ<~8F8L1(yjkKCeyNa63kku~YnzBc5Aqx}fy&QG0A!rd?3^rw&!aQ9vl+uW% zqH&Mwzq?iCFh@I6^xXQpC5{{XZ&2RDx`z-m^ps0mrh1b)tW66#e5~yN7pPSkxEkca z8ifUI{o7hq)@M}DK9ZGTfp_htHCIe6E9U+znS04$UA&P{2Q?JcW7Sz6SB~}jlWmL^ zfguOIv}Dy+tnCP+ z2Ex!n7+MGeOeSqP>NuoKi|cC%eSpy?Lwc*JVa!KBilf`oG1A8n7VW68)q%oEy4o~* z-0bl=mv<}syoL4FSDDG$0+Twu7pQh%4CZ-iV_K`t%>$pvE&^il+yVdV9Q%V-()P8;XD#MF65Qp4?A1X-kMD~Se~=_`}j zT?m#4rh~&ws=wR~MqLv!s|lG!MnfbMCX|b0eKQXhoReAAG?yW> zT1Gbmg_F!$2F-#CQ43Tw1Paw*R%F+`FXqd-QECp9xNYdLyyJSlQyhBItGnPH)4 zWX7iVky+$Q1Xrs1TV)$*E6;iHhael%1$LY!z^U7SooVvj2?Alt23!$Z zE^oupoDa_;Ki`7Opt8~dG74$}aHKiqjx;oPA|Uh;^hAy}JdAn(S1ogA#3_M(Ho%(3 zoM^_!unV7f&a<=j2}t_`)#m(A~9ah-+1hyhCZI;D!O7 zS2{A4>^9LsUf*4Uyxx%&Yd0_eiH{RBYlo>>WP7?@7!T#vH1d$ab9`sMH_E(yB{; z>gE3YXU)Jv&@UnGP;7kMr0xPSA!MI#-}q(RO5S69_6_=f-wCm}IrwwvoxF{D(v3+B zD|Fu;I)+T|HGXCXd~crr9`xg3C9tE64To|*G)fJ!oT@O0h1g3($#~A+~L`M*3whp6uLY-`qKZyJ2E~$Z#NhsFPKKXIEg$*IK z-!rGTV?HFl?Z0zyqj@$24@C$bPI%s8Y1!Rr9Sz(85uGy|e@c*5-5jP>xn7a*hFPDf zguv=$uXk`lNVgc10f^ZK^c@WtlHsgRv~d2JMf@wde2;OQ<0Xzg!FhyaE&aOLG^AgR zykB{?U8dnMQ_g1|45mTq^bv8&9bp>|L-Rr@MIdGuvVcx5YHP8mDp#?nAYH+L$Z=BN zS)XGiXN$~w@h2)6<`|P*7jRyNtGim7EYb8!qgl|W2vd7ST9k!;Z)u_5BMbe#|9uvE z^pAX@*Ce9W$_96(3!PC(|HobE&41(zod#P`+JsKKg=mLe-K2>-EHpx#b^$fr;bl!y zGp!_s-e<=5<`+Kn;l)Eoj-6UKa4;P%{rWyAz4&S9Zv~dxeu(WMV%QH8zc`JP(3ErZ z=YJ0m7UlO3q{H(E_M72@$%yIT%7H$#JQWUq;5ec(ovQBMnTB=;kH*|{L%W?nAk>Lb zGGwMpw;HC1^(1Vnh7Yig`(P_vmp0d-(+QJ$Uz@Jn=25hH^k6bX{+fR#OUiE+B@r2{(H?NFB*A z;ym%{#fRDO0z&n5aOdI!_x(PpV3+Z6PJ@gwJb&PU5)mCl6nWJ5BH|4nf*De_b;Ms{ z+$hF%}IL65%|_Z3}z zZ(1d0e8q%LM8LA)V$FZY_?_P_;mky^@%+8P@BEGmN+m_4f_s5Sp9jt;1d7g5fnq=e zj1kdlWwPHPCnHhzivh#WxB`1kXn*dPAQmG0yA!P-`w6Zb1q9cD&`C*o4?-s-b6G$1=a40$8hf%5l#xmvKcOJ^jn4J^OZh{+CaC@lQ1SaJ)*@8Hbym z7l}h1Z$|T!;_LkBrD>&Lb!&JEF3z_`+aKw*eNSltO@O=Gt+--_wbfr`kD3nTOclR& zT5lGm$P+RJ_Re0rj^cu_QjKcxt6%Sh_VeDYumywL`=4izRrkCK;<%nLvS zmv%hak+j8H2dg_|9JYT1VjZM)R7b z|MWGbFI(+SyyjB>;9HfC!XzGL6!<8kz{kkmc&j|suvXw=?#4r5JfsxKI)PFoD<7Ga zPs}<|Wc87Ck`1VEiH=KFEKxp2T%vqr-ti*uDDnar3oXX-9xL+lQS$PUdB=*p`N?txPFDzr+Fi#`z zNGb17k(ZB>mygUlROG!Dc>#Hlja6La<)h@~BlE^ZUW2?trM#UYFCQf@ADOpP|EQvr74IK6-YPo@ zODXLnHI%aAo#e(_Wlv!#r9GvAQdYdD+<2?(E-a)35dOM48x zD3{`vcD~AGeY&-Mqg(GRrL@W?P|Au|`HfC?WGSWfz6PbNc)j1~Rz6E9t^6sJvf`D0 zqvHWArNjf?f>Kt@18#KOfTfhU!F4D_xPfpICpcnso!|&g!p9m);S)D^ZFQ zD^Us`Sqh(6N{Ji14W$S-kW!q0iBg<^iBcR7$hZMZDRF}tlp@?fN^znlN^znlO5r2h z!Y7te;s$R=DZ&k;6vqNkiemvN#qod}-4jbGaf9_JMYw^K!gVkE93N#J@sVxe6HCDX z$q6MlpcDeZD5K-ofOgRA;nW|%8V~SFPyY02&(6kQ1Cdch)r8r(yZZ1%S(TpEo#q~F}&876`78bknk-%9Ax=ULyrRC3bxY;o8mgX_dY z!%kekW@`E^*Is9m^!l}L{f@VFXTJ08>(+nQ4S+SmhKValM6*4j<`8WdLjhNWxEKFx z`t<=84gUQc5dEmoBsr!=`Vcrv}bGaH=4~G21-13^(D@t#FtQF9VLF(K#8kp z;|(bBPx3adA1HAZZTv2j_-fw9bps`?qK)fO;$P=&eEUF&t7zjolz1_3<97~}xQaHu z9VI^Wli6I)43xNvHhw2c{ArZPx$X{>xQaH;pu|V=Hok43#8tGhixPh+Z{v3il(>pE zz6~XQGH>Hs2TEK;8@~f3p3K|0cA&&nwDGMd@wvQ>*AJAqiZ-rAiJ!~c2p7n2k@paE z<_mcn=@wJsW~*ppiZ=dH-bUQymrGp5IMOxzeBQ?E21;B-8(|r3|7+gHYX?ePMH{a} ziGP>3@ht--uA+?uFIzm4t?TJ;y+k03*^lNWP7Rd!#MSRJ(e8w{dcy#8tEr_(k?)-o}Z65?9g2NtF0p-p28P5?9g236%Kx zyp3Z6C9a~4MEv?<-p0{^5?9g2F|_e3c^gLtN?b)7M^WOdc^fHJerw!p1SS4W-o~MC zy^X^t@k2kAt(kbB#8r$V{QvD?lt>AnGf?6x#u3<1_Gj`o;-dIl97o_v*S78mHm~xjm?1)S22z)l=xKMM%clXd%cP_Hc{fKyp8pN5?9eiAV%2FpE z!h_m=A#YpER#Dvo1S!z%c;6&}WB$zl;iCw%>${FUozSa}B{p z%IM2{1EmZFYhyuBg!SqdL(SE6`(Qkjn3nQh1sJS$IGPsFnc1 zFQ_!kAf7$zC!y>luMxfQsLsb9e!53A;HUMBKBN=+gD>c$j&8icZU_k5JKBL4hAM1` zZ%37A-_$#LUA-Z#G8t}HaCp#LO_gfF4JEMe*|h4&ty+M6Z$kDii@Uw0fpdHQX$SUg z&pwmEelr6N%Svd+=fyOLsCb3-G@<|Qo%7EtFcE6%2Dn1sSK;aQ@W8+xGcEgky>4S36J4#0BO<-pM0f#G(8-OUC& zTy~faalEpH2ZY2!3ggrS7+8)7jdjmn`Q3m|{7*<#Po%%`soi~TxsZW*`+zIfR z%4Y8r{>rL4p?dLGe01@R1Y|X%7t^F>7s-^J#q5P7tvY~6QzPzrZQdLLF`7CsN9xCu zs`Lqra7OPJZxOL%l2p_Z5cv=#rs6DnkuC%S#P) zWwUoA72w>%X=%u@gnD_~ z>&Fz_ozdkJDs}4wp#zFJ0n~9MpjB1CRsoX(zX^f*8Y_EVm1#+zVF!)=ZhcD4n+KtB z!BoDY@~NEBFQ}v`QwqjBqhD5ZIOQ~E)xc4?wwTl~=TLhC;6Cm1UNTVOij5h`Nrk@MybJ!LWjNl43G`R*bq5bB?ix;ast4t_@)9q7jtu(MA z^i~Vhm=D5RMc+2n_Pv^dq`ux;(BMrGC~8rsA$BUDyM+!0hS(;YW#0rtK5-|2=#i%p zrG#rZv`sNMhQKbRZEJCL9?}jZs9BY^cqRb4Y6$2zqN_%cid57fco5K4A)$Bmf`&mT zMW)5P2#VUWfs2s5r96!?O&b8qJSR8-b9$Xj>smojH!`WyaPNgvm`Eij{vL8MrKI@p z9BX?sq#%)+2-k8MVd#ht=$@QU+%KXKxCmUOD3~68CKF6iCQQc{@cLZFO&sd2BcBlW zcjd4Y_%6)DQeZeg3q($$v_eqLP+IY0EoLFaQ#YGOo=&je9LBg!$Day8WBBAkS#*qF zZNae-;5^y z4&WwE=~0Y+SHG-MhU$1lxlTn{r*v1JQv%t_@CjHrgMICH_*`yMWTZJQyd=%0g&4mv zmQ`2h;alL`0?cpY^DaFGmTogF1tqwU^ag?wpvPTAtvR9W6Q719v0EiC*`xVqbe2F^kdTn#>PpSTr8Juf;ZJS$wm>dO0r?v?zCNLc1ea-crLas-sY}8# zom7LcOiuyef?L9sV3`1VS|imHl&P76GQqEy;Mag&N?X8KXcI(DoYYI`OLC?KRFk;J zSM4ltpMU@WL=eI(Wv=lVQcH%qG;3;bOj!nV=_!gm0g#VMxJyqd;4ZapQcq#aZ56mn zuL9y|G8wX?Nz=aKC2jjvFX;&GQp+~%kqf8FxJyqdhr5Jo25^_AftOMRH%gkOYTp3n z5n-1WfpcU^s7p^NU?mN-2B=FH(3b17>LyfG%F8Lzr# zyvAl^kV{zwa2X2d2!<`MDTqrGf?3B!m(Lq;f`)SRs|Ya506%ibOayCLg1_{XGA&al zjdTQH=_!>eQ~zE%*#O5UjZwi6^5Z+xqI*oo42jcp45A=3N83Rn#n1r686ZbTXeWD_ z;rBqUq0?gSk_uP@z+pTE_?xzgh@)o%d(vT`30hJ<$%DTMUxE?BQ=3msKum$tBB&oC z6g&FHc$SAs$jtQu!zRO&BZ??AN)TDl4Xh_ZDEEz02gL)`SVpPMQEHi3MyZ2Q;^NAd zM+f3S2bDR9vz820_C6b^S;4dKTRz!9nVPH}tVGI-w}|;%4vhe$LBuxp65m9L7JOOw zlR>bo-k_eOknY4XMTkPbgh_Z0Y!S$A z*pVeF38WH_NJYw?RK2umhA7K6fm;x2q?xhXE8Db0j z5Ir)Sp{G>|XQ&B)peL1S3VOsPafS#SQ{W5%bB$O@axAJLdb4n787R(yFVij2fg^$h%;mgoFSQWzl1aNloFhwZ03nG z1R7d)=E1uXKu0(%A-%W25*qFqKSOQdeluR0dBP5jVCE5%7`srM&1V110|BNwF!RH` ztXyAazUpQ^0}bNL7ob6nOM?at^#&(ixrul9JOr4!B4W_eiI-w7ff&SjbQNS1FNi^< zH)SZ7QgSx&eTYF_-4#%vwIxuXnyn-)fC9CMv42^b=w_fmwVWmhH$_mOr<8yK2~AW@ z4Su1Ksa=64s-_0upG(mM7rH~t36-`7}qKU}SM27HF&;${F98Iu|ef%KGXd;LA zY34NHz;spy?*p1x0`J3#bj9?;`;^}-LlaBkeaaaK?*q)G5{gt8!~l)35d@znE}Q~_ z&v{5$8G_GbGJ!8f(|rG7^wAjMsJeQc>^k{wbQz!?4L{TKPRK2QdQK88mfLR`sE17_ zE|0+7!JE?o_4okNSN7=NoB~kK*}rj(wTJNZFGoC}kw+V$Z&b1kDQ-goPV2yWC|b(` zT!P8dMqM72<<%c-;?;AgVk!>o8ZnWf8WJ#1|Sf%lV{JNZ3c~LA-bZezne{nOwBZ>7-)*o z+iy!NQ)wLa^Y|_5b#B3>hMl2D zZmH!^s}x?)01u+Hl=lQKyny}66A+82R?dMNi(0uz#I&fDD@81sTDe(|sUBE_sZ6Ei zVX}`BUbfWSN0?A*?!!#Ty|%SI>=0?Q_Bn)0OuwnZ6TXdWF@L?cE{*WVOPkr`L-hb^ z@kuQ{sij3~L14dTHbK6dJG^RQCL+#6YpP5=m^Hv4bW9V>8B^DqN@FAq8Q^iUqY#$R z>C#|;Y|5hrvMLWJVFF6yO{?S5g!o3LA2>a+shc6wA(cq#ItS&{S0Q}GOY`HCC`vQv zgDCo{+<@OX4fveUx`|1A#k~51Gf#+~{*ni%hhFA=WxMX&Wqd~^O$=mTEufOV_Jd0L z+7Bw}>j0>v+yht3A|jX)UP0rInDDH?_#$p~rijJ_;VLkHKZ)NZnvC(gM3NDH=cA>C z3~L}m4+z}(eBr}#qfk&^s|P7zkW#w%K3nbJ&DEXB5a2F>BTvAHmc%zi)YrEG*u0X| z5VV9!{u)+?FU%1L@iW>>9kQuoUn#^OFffdEnZaSO%M1{$F0&Ezs>DY0Rx^1#trNQg zkmNgn7y>B#*hF0qL70fNkhYC)lirNSyXz29+d9U#Yl@V(mkt}>4iza;4?${dEl)B2 zjHhrx-NFru4-DCe9Kh}<4}IUzeXENQr!>2c*9{WUF|s=VL<&QR69>@Q+W?f0mJldk zB3}ALM49sdxKZnwks04ZC^~e{4Cg=A^h_uJk@QSE|IzK4SVj*x;OhkKrfI6TrKpC8 zHPN<~1_%l(CpYxv^j$$L8Tu(86edZf*+(iPc3l#iR?;T9)WNHBavA;yA(sxxrBWuB zk$!T43r0V=j4dIT@g?Lku{^mz>S{ZZiGbw_*pxSwWSXV{l4%LaG%$nER*`amq*9_B zG)O3?gPX7c%9+SXVyI`v^B-$mxCPQw(lev^n{LmHWRw%5!q~J?ecRNrgWQ(ZKtOeb z*d=sPOBx0A#dW(dC_b9%A^s?0AOR&*ORUT$?wY)`a$8!@^172$UB^ zT!cEW3=_g29(HGwCN7woKnwkd!e7L9Ye-y#MiCbw0#FTbT@jdsfjAgO4k10#rl~>H zuj54NHHk=BGmV{T8z)_YdbOPXy`CYa%eSU&{k;I6gkasY{$5C+4gRe|=>?0%CO~*U zLJfKiO@wNt(4cpd7+UHf=&M_HZPKwOX*a9TrPgf2o_#h8T#ywbfeSw36zINb04x{* z3Szq{8G?#>*uL&1HM=3{*x95FE0iqn2YQ1|fZBXEiIHOn?P%F`Nym1RHg0(?)dbO+ zvnSNzL#NrWVG`TfWC%qKqo`V5l%Hva^WNCN9`4g2=WihAQd8Ulpf8`=CNdp9bxaep zNZ3K@*r{&9*bir#LoNeAg#s9JOZ5n; ztw0D)0ZQOxprrTdwm>vy7?l#`wrPe)08K{-4xZTk#2pNU9~cP)&_+_j{t;-{M@=&s zL*-E(Wnh^xApPjQqGaWGNH0ap%C|*RA_RBH0g@H_FDn7inZ-4f>%ZJ8U9SJJ>wm5R zb{A1a|0CD`Y$4>eb6pJdKf7W0h%!+!X6nf(FZo4BjbMR-=MM`MM4YDV6_`30Omu@f zq~sP2pJU=Vm4UDeT&yL54H9Uz9D=`uo3Amcgy0XxphZmkY zy1-=vXx!i1OX~s$T!#jNg9eQ|i6(%aEYq5gXTa+9Odr}`4*3wrk9RiEUW1X;v)hio zY79zKIC`XYLu4*&t{L?s_$TMsslcH~IgHre2u7E-L}AXxAtoJ=*6Sc@BC+r7!B&l; zd=1REX`-9dA*V3E%haGFb5{w7v~i$^c$*EFT@aWbeFrfA(X0%oFt58}>d+3M7}1f{ zsi0;B`5V!Z;SGTK52^eOnuBBj^OusLBdZxiDF}LLlmYWsp-hTlSOgs@bx?>WFbXuW zs26`Mgz{@N%~k=mqlna3(vE&ar6iwh^6QxVAj3+R$q!`mgM9L-I0p!SeQ@$)Oi++b zet$Wj9G=WRu@l4JSY1#FnRglfS=*&xRWbOrJzmzO< z5A9%~AFV>a*}o66sG2oA_Kmx9UCtrzVrqdcZMalsHB$Bbhvo2UY517d4QKyI;E`$+!whGUfZVdQLK~m}N-Dy;+82 z*%xkrML#cyFU#%dyhyz0s35|L~Wd`rp5_ z@%y&^8~h$S`HShKnf$?)1AP$tQ{P@xX7UZ+dS>!w&;9$~rm`Qe{2yE2I|W!(-+m>7 ze1Fj+<~u-DVR^OJ`1axBuzb5u5&$%+1qFVQ>4K%Yfbj+l{HYB3oG|cRy%lkvXY|bp zoFa{~f2`x@gH&zQ_lN+}|9?4Yz<4gL*o&~PgmNULLIeXAc6BqY(7qpM5F%+*wzZU@ z2^K8wvaclE=JFpGX3D&LRD#0KfO{2ZjxV5_i||UrN-JQ?PA0yVBv*_@wB$t zTW~maqLPijFiM?C6*2!Hdg#3{?0oGLRt{q?f5O7|+f-%n|72kBVQBl+ENw04W2^BI zoW3;rua`#u6wDDZ`n)r682sUSFM@h;y*G)&CdSlx9;hBBz=QE2&E}eE+q7Z9Huxe= zIx?~YuZkJyD{i?MZL{H1XARHn7rn}HOy+3U(>)>;IgfRhO$wol9A zo0P>jDsdHKqW~M+lvw0Z5wIP{cT|loa8j%2n={PoODo!*e}}diX`jYoG-;}6+o&NzKejzKql$w}WU6`e1Qg|fXge^*?MQfqPX2*$NF=wml+`rQvM(P$ z?YI!H9LA2PZ8J7+4jqsGBO!FB5yldGFbvUY8r*hv<_#lM5sc@Ui`q2}>sfEczwmRnq+|1H{~Vr>u<);LNhTQIUT?LtHi|zxl4^!0 zh- zrrO@uOJhX;Mu3aE1sD4+AYpIRJH#*6V>(lQL9<+tQ`3SL4wtwH3Wuu-iP>vn8|=g3 zt%uOA-gd-7gUu~3m}3_(LM5ZH26ohhFqKJ5rWKgtv0#dW4k)i{iJrn)gg9VT{28vM zo0AwbwmoU#+|Q$2jEI{}o+x^vg93AInL4L$J40zGF!DfJPU?YpKa5)qG5v$Lh?wvv zh|JEwbDSbLi>M?p5kt3O%4nt4;B;}Yfl(d_x_1Bobl#Vcs!R)$Et_f!eaL&UT^8ic zN!-BQO%G6$SO++xfabO%|2^1yyZXI6EE9{HsM1?a%f*(#W{sm@xm-AlcTq6zQb3R# zojQ)J(A0@p8b&9|M+a5mOVpLRejXq~w`U?mBaA;sZ|@i?12^L`hP<4@9OdSdjB&D+ z5bf>~9V_+2H8ZlU6=igPK@gX;>-!WkHNsE-j(p14 z!{uEOEZ3D<-9}s83qLQP=4bpPA438RPte`c{zd6P$^NB^{mbv_4MKdIWMA3>rU8bs z-Q)}fy!aCFekiLT&^B_pFh9V)$1Gl&94L<AKsgk+U;Y%`x!4j zJCxvV63>);n8PACLIaMtz4+0%V!WMt!H48McC1Q}|{P8G^tN4g`G7mkD%+aG=cIsYaGfSi7B2tpm7`vMI`JVtXnK}aRi)REtFGjdKia^4{b9GHb2)T6+J7+eC9#g;;_75h<Qvg8*AFIj)0kHWlV(fJ-yXPiCst?=4s3f2GcpzXuG?BrUseQM0j?3g zJ$*jdWrs1y{_Q(ud@D2lYrlFk$BzTt$QlQCi;BJQt7km$8}uIoB7+ZA1yO@!T<_bT z#`t}|iA@KstQvo(soH=4@!$6_!ae)m2rjkRnPeMB(bU5@oXpq zs3V&{p2VhkrwMl_kyS|rsrC5-rtfXzCVYJUzyqefKdE1BOQZ-KHB0~x6YmD^g_mx=i59=QhdY`7@Y2mt z(bnhRb?CVDdr1hLJG7&?zr^5%CZ4Y^q#e`3pZNPpr#{eoOgm}dq8aYb@%&f4g|u#3 z{M-3{k}xoSIwt0qt!BV4QKFAHf^k|uZueo3TgP|avYTR_f*CE))-I~u+jb`v(?*>Q zd}rFnA)7Z~gPgQXN7__(ZOWYAsC#2#+ZA3vzVjBczNFREh;-UMo*=64lByags>P}r ztg4N6vznxBT1mrnT#>b%x3my4zG2$zZR@ywNAN;jH8b@lUl=|%Ne|_;6HB#H9)Q>&?bNnsT3(c`R_cW0N9Ocm-_slRgnOIIG6Az`~s+Zs$sQNraoW${wWM(XezYP&UVP+ zFJfM9=SDxY9W>`-`>)veHXdk$9&8thU&Ih6SdpRq&)#Mab^`U|cD9F=2rx9g2QC^Q z4R3qPH7XzGr{+6)#)vNeDGg+o_c;i=^- zoL*Yt^k5ICQDKY`k7UFj`L!h@4&3c|^`2JiD#zj6^3CclZB}=%SzR=%?drYS;kdAT zy&IO+yJ4{24X78ly6A81D*Jo%2@Ks5LW58`NNIhS!<_l8s2Nz_sJVKTH9xt0&2YpW ztoiw}=7KffftrDph?>KztoeoIYd*J3&4R92ruMr~GqA%^vwxK}zqWkMZ~z|c^Z6xx zz85tExezsjGhEI3KFlSuWS-#zJXrJLG9)8M`>;aQQSRF?$SRB98D9(#wYc60ufP{4 z+%mbV%oooIU%dB9Z1Fry?Z_6drWfN^S!Ew%TwRr8S6O8rYg}EGqgPpFAKP19l_QsD z$gq$D;W`Gj(i!jLi>qrG!bG5E$DmePb0241UCjt5ftnqIT4~LFoN;wEXWO4+P%Evu zk29{W=4=CW3~Hq{_i@J6)l4fgjyKHAH4t!1($;0TN*`}rZQT-05c1!`QfZ`#*HsZ# zUf~`98wCQaK|E}fa-UiH8b%>Dl-wtlzOI!DKeY69gx5|`I!`I1uWrDMBMu^3{`}IG z6Fc0s{CAeV4okV8UHY29@2=&)we&UN<6YfPE`5#I2U*J>TlyMcn%V0|m%N5&*ArAZ zpBM>zSn>b3qJd|zS*`3z;v?2QrE7i^gq5lQ0nhkR8qQDtFLWPO%{2`IjfV3JdPi## ze;0xsE%;O6abY3efivCwrU&u+oBqN1?t_bb^+xsJ{3KHs7A|xS&PNX};ze`_*)DVr zns9y+&u>%@BE5Tv*-_M?#l^)Wv;k{3;qg@2Nm@94)8B2Qy?bz#w$I`hl=}Pj?0MXw zkWS(-HrRm)B%=A~kxCTy=6~Q`pvIN=0)fxp?ni0unKXoncB<{gi|^WKVLG4Kt!=l@GUxE|Y!otEo z4{ql~vVaQ&9t=A+zUJT70xZMA!YOZ0>f0$3 z*wKAyuyY@6k$wB$swUW(2K(Git+u`i_SyqIm}NTyz0SCfJC^(n~F=trGUIa1YNwT+As;2Pu}?8Z+rv2Z}z>9uY@s% zP%wFj%~I=tVc-FSxZZ;W+9WTifwaqjteZU#A7#Hi{zkcCWfLLCySd_dJtc}WWfwFO z)j;9`oo=tRD2Zghe|G}o(P&>1SYK4B%0|Uv-nYkIyy)*v-6tAef1dHBYkIQ>EH4Fp zs?mE)V57ZU_IoyZs&o0~XMOwc+y(zz>w=(1WV1l>$fxG&W&wUt(Y{1mU);7XJqy}u z#x*g4%t9bt(AnV2eC#p)%4XpoLl?r!cR`kTA5}g+fAOM!kotc`-6oj8rN2PX=#0ri z$#>bWLE#~gfVdp7hAUjd*tKa9sCGjO{P_Irg92Bj?8PeBzj{2a%;PG#YAW*!3;G~6 zwybz}s!>1ofC}?L7s(&kF|grY^cHz1hFjP9?|g7Ed+~<6P>mv^hU!?``ab(wwfFe^ zh6g2wsh|Xa&>H`T=m5gCYv0;?{K4X$+ddc>y%V`4gF9Q}Cg?rzT6rpsKK%@y)te_Z zAa3?$W(!CTPp?#{SUOu7#~qkNFT2z=GgK&jDH=b=X9EM z`W_cIN*c(=b7T-u^Xwb6Ax5{1}Odv;fC}M-eyy%6$BN;tc#cjv~Yg>3O3* zh9_78koMv~cRosYi!r_K>U#>eLXs0hEWA)w34)UJopb(C4a!-I|8?oC))(vIsP17g zj1E;iMh}4@7b-V3UP44@^HDf%fcf2TqA7%clLbP9AtqxD(Y#o9^>*Cd(#Sg}?0|%A zKc!G4qsHYUfoqNONGyJ4*^yxE2((q=Nt~BZ5|1dvZtLn}N@B)6$qEch#{}i2D>u%M zluJL$OA}NMXv9+K7!qMCkACK~XX%f7LZuAy@t9%=I$EH}z%PwY2b1|Ts2*bz&oR&x zd{$5&<`^}Tb+}5;Vr$o3eO5_i8sSKJ7%&*L}?8Jr8r2F>6^44(&0ExOX>$o4HOY`_aKp0eTC5atOtu=^sMJk}z8cl6+L<(RUmf zg6@-$YalH=H|X^5)2SL;%UO_oC}aY9Fx|3$2RIy?$t^BefAeld5@D)j`@po`U#|Y8}(!EFX)rJ>&SP^ z3GsaOIjoSU@g9$o_XWKu3rYCVM*TdVzDzwg;RKI}6K%Pk9Oo?}09mx%0#^Xv@b zf=!ED<}e>J5&$J(Yse?E(U#x>n0~3iS-yjuZEEz~@a4etxHjL$4 zS2~ujV9hQW%O(RCay+vpl8I$(Mw;lxlSObmUtGdwWISJ7vOZr_S23R4k9Aj{2dEF( zF{D?$-g{LcdKIJXy{0fFUV^Ljx{F>#7!h)9&s1FWDnNPUY4|117xgT9m1>9=uI}nr zfx45$=+RyMv=Xc(-PNZCUL8iu#MHa)OucniA6Yi_;ek|qxlk0nI8gMX?p4^|n4?PE zKWIL|%_vA9L7Ut$YMBj77|68qSA!GnE?e)}`**`+q}I!~-bvU429`s^lZJGSo=J$r z2_u5WUytfYBvlv@_-oQK0clifqjhGNpd9)J zwdp4BL$Ley0PMj)s=tG4KNzbw2*N>mkDd|q(?T38JOw>LOrbo_UOk88Nd{4IkOIb! zpMlSW4@3hWQ{aZE-fO#swC$3N&ox!7oI1H{h@$p4D z7$fS;%dWoci0=F;F{9iQ6HPwmkb5fITIK0skh)MZ zgn0%re?I}Mdne)?!wiTM@h;?E*B~Hr0widkV z>7*QB?6;Z#joc)EW2KI6CQS8(_M$F)DemhPuAi5xTQl|PC*>;(L;y%4P zWNR(0k~(~V>M{-Wd>Y93i65qIu+LufcN=Z1yL+~JU#e~Ry)^IB_TgVT?Kuz-VB3UU zedZH3(QvbR>=Rb7KQgd}a9gVhHVDN<2oS6cLO>H#2t9{qkruoT7>~TPYurg3F5UbLjO;}>TEL>l4C(ENvxwme^Wn<#?J}Vou4ARm zvovD0ZLPMc$%xhR5yJoWQ?1$)zl&KdfcKUwyuPh9 zWa{~+1OSXmGlzCe=1zmdM%fee><4mA9iyV`E6(>ng9&h80D<_TvxIE8^|scCK(cH# zdftaqIvwc|#)aIUlOXM>-^*#R1V_#uIyB6|xz;MzA0+00^onOA*#~medgc0sFLP*nhAi3-vs7#?6)cV& z^6O40>wuTTcU@Bf^G0wZ=eQrxI)y&OkAfWq!u1?mI;MK@ANH*)y{$DapgSwUNI2#e z6es##nP?yDN!urW5j3#uM8D=`!;(!i?2PhZ$)*~K`LJj=EJ)0U1zykDcIg~`Frkzo zTmVBK(q^&dAESKJ9V{gvl!zcA=)$QVKtc`?p$}jrhZDIZCPHA3Indr9 z`}&Dvr#(AoeEUhY1Sa8f?;?A_%P<&R#ma$}EcY&0rcrq_C#9feiY$`yr&ouxe?Wh5 zrGh2*5VhW`wIf)o%I&pLGoC72yvhxCgaI@iXhk@;${DX#2`8J@NJEo77X3J>q&=u@zo{`tx2f zzopr2jC;7h$U5nx3+11q4O6-Fos3F+)Wk2YY-oV5anTD}tJv!0+ch@OE;OXn%&gW+ z%>`?^igpd9Cg25ckSVBNZdcf&L9K3+0I7V;w zyvE^CT{+;>Sv;Y$_*Kb0-g@umcHmXCqB8$e3P6k6zW(|t!n9D2zlcjb&4}~%$%}Y# zKX2*IF{*qX|C}mvXjpx`g9T*v&|lLoWQ{pKRvIji}wUAB6?^ZI^L~hB?k~(yf1r_0a{u7I81DDdtZD4 z6)i2)6ny+zV~pp6=<{Qu@=g$?aRu%60Lkk?dtn#>2RB`Sb`8XK7EgKldav8AsEX&; z8oa>(N@>D<%iHW(DPf3|31cvjspD6nE$fe-X9BGY{ zbVSi+VMZTPNrd~M1(noL#C{ig(p&FYEWC;W*d1|$>_PRttq{!1>*_7bBMo_WOD{eF zFB5#UsUL?7kZzkjzL`x?-0dwmh}tt3PkHgVw%4#{zkUj5IZarUllZal`YA7dx$ZUW zg>Sg8a!@nBymG|XCbRb_U48kJbN;=wpvDxeCG=eC$A2)^g1Ml#*#kC;zp;N_~=>y+M3bLB(jSjPg=_H2BKmsyb3eXoIh)#d2>0f-se!JlXey#{3ty-(4sBtIv6RlY|AUNfACM2$n7n?56U4t5k*y-k7?7BOMGx~76TOogtf>REh`LbR z`2>B2FW_-NhlAk@q>Qd!>wuROukvu$8N$w&#_lw__2Icp|7cdt)drh}eyf|>9CvW= z161xiiDAaScMf3+*gBXbv7hfmgaodIdkTXQ1f`Yj5^EycFBgUIDR^)(aLeREc&JJg zTJFhx4vA#PcVTzF^qx7eU;cW=Up)Z{;ywt_Vc<5>#ID%HN*X)tpx>UY5R7w@TcNrv z&ldY;sIQMDaNAamQ$xCapaE&n?94(TmjyyzWkO;CwsD04l0hAi)~bwepGMZ-m)2}` z7h>t$HialT`xrS5H-0psF#7hXRNKyNEpCgvj8(S-&je=qdu{cH?SbA8?Mt=&dmvKY z-h$YsdLox2I;RQZpK5{f02LnsDn6j&q`-7Q&`4->4I?~TrF}nw8SMu85bl-)+xnX* ze0NfV9?Rcq8t7AC0$|&W%pZ7QzItf>Lmyr|bmZ8n1$EGj%wPQG-~Zj;{MDDAz346O z2RXnX@~Sd8An+P+3>e=Kp~b)~Sv6VG%BlwLdBk{{1O|+-tQ#iknFd0bdJ<;}1-Fna z_fHMGpK#}JsTrC7%Rl<5um8;RFaPFOy$2A@5`7+<|Hkis{@@oM`_gZI-FskvIzDe6 zN+!(ceCr`I{y;i9KlD&CX~yRN_^bc&>;LK1m!5vrdmvq7M)xPzn34If|Nb9*?)c%C ze*Jatfn>_6d`vY$Ceg6J0f+|#F}4dl$^p_}?@envlMZ4|??mfjT1Zw+=exB>u^0b> z#dOq6J&=yf#}Anivu6JT>Dc_(LuSlO>`%uYNXL;rZbr;C`_qwm^U(Z7h1NfiPUEX- zGiF8~Fe7I2fplblIy!G2Vyq&x{V_ zM2*P97x-YrjO|C$haN&3#@WI{515e$j;BMr(;BzghG7iZ`Gt(w4jfEJ2(D$LWZ2XM zBFGE_!e$uLJ`7YXQ-w*zj5m<)PC=|O4KwnA6sGy2 zRj=y3u73U0YN^}tt%@K|M2$3z>DI_vqT5)q6bmd9F{_>R?s(40IU}BQGH$!^F|&%h z6HB(j8c>1(hd4ojfSn;`yi5o-7%VF$I7=23Ac+I{;{+4D;Mo}PfP)>h=lg!Q>b=)` zQtTv72q-#nzp8ud-@U*4?{~l7_vt0pVr<&>tOu|uL}EeVV`8VZ3tc-}C*%fsvsi8x zlsCgMMvc^-{LLRF{pvn56$UFK!6hKQmc9k2ql0Rljkkq zrqQBw_`#lO1^`*TWJAJLVnQB@lv?dK}8a1h#zb!*oQd|EfbeAc*OOSS9^u%k9Vf?S*4a@#6l^aL0Gb}U`Q%&}rEa;-I!X3a6vG3$;Mog>8>b`g_E%#gT-#fDyTrcCT#i9~b}9klJ$ zSF-C|v+7Db5!Wz*eTbPnBHb(AVTNyb{Fv#uF5;Xf-YL6=h7Zlb2ITD;=oT92Nldy} zjJSr~f|*!YK9bXRO-Fi%xF;8Uh29}f%o;OsYd*owYN#84R-Z}x-2kNW&<&U|XB=tDSQ|nB%!cQ$cCG&%w#c_&`UO9ThxS(Q7vT5=tHnk%%m`Tkv&W735$~V z29^BSI?r1koU(jt{+1>ulcTU_pMWohNQA4VTmQjrGlKmgZMMd;@%BV#&E(ptb?c{R zE_ubJCNEyO;oH9bRo#u>@#;;p-?@3qzxu9!ec5-<&2RlT+b-Y!KYh<@cG!jQy<+FC zD|hdC?Nxif@B6Rbcg+vHZvPMd+yD8%|MKtt*K7Z`|NY-zrx9IG+nH{>M@Of+vikkesjf8scyy|J?x#nmmZ9mRQ{A`{mK8 z?%Lb`WMnP4FM8YPR9Ay{jZSsnd++E}SA+l81ydimVCuu8Q{8hvG&Dh z-8=u;=v4RIzr0}T-;PdoZ}r0HRQKH5{`5k1^kbt_8)DBtIXczV;LnXtb+++eFPQop zqf^~;f9Ha!A03@qwuRBDWm_1XTDFDJsjiN`JUX>3=TBX*oJXg+JOAY9RQJwzk4|-E z^-H5u-COYn@V(W&mv_l-_XrL2B!bgFyq2S=y68vMxURM*G;(dbmim-orh zsqW678J#*N@BHVZQ{5N+-RRV|Tzm90BWt1T`A4UY%eD88PIYDVo1;_Ra~~a@N7eGpp z0`s>xfq5uV!rvL-(UFN>?4#W$i?1s%^_~g(9#qD4!EJ#QI#I31j|}}CCdBi(zl>-0 z{h9%mx;NVT5@O|*i4NKN5}ZE}STcc0dUi)I`?DZ#OI0^a`d|;YoNd%_lT!H~yf(^ufIF}$|89~>#AT*A^fJnKV21-`J*`%Nqz_;tF+9Y&Z$)Lr??!n;Jkk}r!vW(A%CaL-`AwPM%qb)J4f1a&^KY0_8zlb*n~;A?nSaZi+9LV4Apd1${>$dnWs?6gFjfoYh?-rSRFES<5SGN|0I+{>!+xYL2%+A}r8Dscb7 zfI-645X?{>cX8b99~&H-{_zx!r~1bkjHZ^x=(g}pj&&cMB~SLW7g zEL{L=F0ng$c_!ZdRleCaSf7laH%)^6S?@5?r=Y9G9nfXrn^yZ~+pB%EgC~yVZT7kd z-7s0%#RR>gVe3nWvOf#ht%aztf!hr1Y>cB5HRHWJG~;-SaTB8!7e`$q?#njZmjGqO zr879}$pux97O(mS>Cr-{owje~7Dni7o?TSSgy^;Ei#_SGViUS9s|aDyiD{I_jlOY* zFz!a*xI-9sqi@_HjJwe{?hwY^=o@zk<8Jhg8^a%6xXz?Q({R6IXzA z;?RJ@suU@~<$-cnF_Q3cj0#&3eMyUM|b!%?g@>aFwoAeh5F+~tWXMn^#uN*-5T z2D&+g=T&C}&h^;98OWjVi7pSwIfzqm;KwCLp5efccjNCJgel%7kjG~owXU{z=fFTX z%5mM*cjtg$$my;=nG0{md-6UKa<9=w0W|?lRUzrX{SiHnzXFGJ&v~qR&a*;>BGl%( ztC#Y6g}}Hw?+t(=Z!SV)I3l3P{`>t&N8V3hKUV^2h!><(JLgN7C=%yT#)4Md5>n|W zQRxxMuoc3y2(7yd^!x(0Rzb)hA;+j|Bh^%YMXk{-RwQIX%L(!5Rnw& z0Oam2uZRXQcM(~G+^&AC$~?P zs5<+^KbH79+KRviQEdZUB6pQsA~-()L&bT*P;q_$hKloqyx{yW4E64O-oMMU4+1C) zNqS^G@$4yOAIBT5Lj3U~2u6T}ucKc%Ufz5ZuE2gR=B^x zdIj(=s(^nlwLl8jJ!!QK!{y_-fNkE($-=pv4UqS%iC#a{p5JY}=E)c-?+#`FF@185;yh-rX!t8q^rI2<6Ms(bSWY=Qj&gewI1 z6bNCPX2&_Qpbz5V-;jb{1vewG3kO*iHlEiTXg_*JXxpX)lX={m z*P8(Bm~*P9{Ip#ZG;xgvc+|SB5tf?0y-~<$LPj#_rSARmBg!V(U$jur5Poff9V&AD zZN&aoXHPfFE9J86vmG!Rp@GQQYk&10PAMB^Uw{BHz_9QzNL+%uRp6LdhM|?K9t80E zuL^j53u@squ*M7^?yU!s7^3Zo9FA~ULFB1I#%Vv$!%n(vM2{uD8L(O6zw;vqshtb2enSU6;g)I-{^0d_jiK=5i==}f%sb%mXF~ac>YqJd$qsi-}t*p z@CtIlS+&s~?zIpa9Z_4-$Gp|I@8FAEftdhb4(HzG&ap1*lJ8!3uAbOLP+fkR^iwX0 zDsYH4K^z7a^Xz^s8IOG&1#+w7E8xi4AJB)%5P+2oud-j2kol@D8 z4QC-~=$v|xPsd}+=HhCWrd4O-!jhY`NoT#qLOL$%lNz#a0&rxubP#$8&M_N@g+M6i zkPgc!#>i?qcI$$^rs+du5UO$BVv~_-t6l*F3V>Xd?{FnokWhCn$cb|Wu%;pmx2w?8 zc|uFp(>XZsg&ao#or8ceXbqR2OmzR41SIVrlx;E*9H0yoV6(}|7Tw8HfLP$CBMlO9 zVf1n*HpBn-Ocy{9!@YV4x^vJ!Yq6{naVzdIh_LM z424FrT!03t0bc}COtujGKojA4CWS;;3LX0dPfUzoz7roBx5kw>{J#i8|A5G*JC(|xUzw~dr_x;9(2EZE76RfEaW<`^MosZMj)(n`#3UDS3_z=b5PTOc>1( z!g%)o7|zqF@^p;0HM!4!9?r9-$^+&ewmHxK$Z(#?D$gWnf#g0n4;R2%$rEf-YYC@k zIMWn>^&9#cCNg(cvDD9?)K?HpOA5}Jh5ewIj@j}j@7|yloJQ{#>Y9Xw^ zw@+}6HfxV>%j*6!CgOmd*9)w<6!zAkL5{A0zn)Hulmps@_%NTOS`MYV2 zfqHZ|tw(j!`lWQ!8l#Lpr<=~s>83SQ3%{1J9p7+90a*BTo>@Kk^3SY>9`TKuSv~mA zbY^wuJM7@h>an}*h?&)A-wsxwe*!bBPw+*CXI6jW&JE72o^QR?} zaAx(GoV)PM>am}B_4C4ZMQs~7O_i!-Zl@XYFtpMAv5teg!zfR06G*Q;hw z2rhb2GpoCQ7N+yE&8*5Ud2nVWW61E#YN(qYo>>ib(=TFX^%c75^UthSb<wh6e5^*LFeR8So^?D?}o% z5Mn(Rio8N3@(Lm36{=H|R|p}mfKw*y%PWKf@(N)ouMlyne6GAg2ziANQ)%M2`tl0( zzPy5vF*9DQF81GU%~ zC_g2x*@fE>s$;(TT0B0w7B{$pezCQ?YB=A}BumhTk+6P!8$UdYAVW3}|R=>3$w7-R}_bnxV&jTQP z7X!*}b?O}t3<*34r-L++RrdOTM@5*vu)~Npe4jWH9_K|a5U=N#+X%mE1vm%xSrI4rankB&+UhrQG+z|<+(o1e0_js zo*Qs%;Qc*$vRju4mklHkKZ)H9SKkQ&@yKri#$IgUi3O}uAVD_;GNz$E=;=Z0eE{2z z?1O-q5Um%AApm5-oiLJ}-<&-H+9K9DyP?&hAkxR<3b59c`aG98%^AQ}!G>7s^F;i# z4^M!I2)z+(4}?+JZ(f09ADtpe?o6uxHF>6WHPK@U85_u#HAx=NBo!3YPo;BlTz zP&hxZ1&{OGg2(xRE%>U-6=MdPq-28HEn*XWiHsFd#ewb!3LOe5Fye>s_s&OP#HbGu zB9ZaL39~%lFdz6KR{S3R80_KS7$gB_s)LUWO(*9D+g_2E??$F5=uKppjZ7?@hOPe1sG%Kj?F8?XL~5>`CeEJ}hK0Qstp-{XcL zsh1*C&wg|qPF3s@l6Ka3got=arEhSCnyGJVmr7ixyhDYzVHNWlN<)vP-Dwp|73TIj$Hb~Xe1!dpM2vS(`Ch`@;i zSH1AoT_(sLs_kt0?hqmgMkw+CxeDxt(kkg*KL8HrzXY(~aY)|@*@IxCoKehmD&d{s~g>N&lI8fpc1(jao9`Rx0?W10H99)+8LfFL>_|NXHPRHx3s+7IIhmIsd zzwe<-gf)^r+qFeJL+_pUuXi1u2e3eGR>2BbQiG3}0!bUsVk-l+TnF%E3Yrt3a3%_c zs$a0Bpg%Ab1l^131@3`HVU?*vo66hh-|sCvb?mYGKL6*BefWdw7|uN4ExhyC=RW@C zKmVDZs2w{>PXPaTVGL-@!Omur(E*t}Q*il2!vNxgEYZ$pD>0!>nZs>(d%c3# z#<=MbqJ_^?gLh>UJ&=cJ_b`DEPZag0$De1x(F&%dj+EjZv`7v+9vb~o9JA+_naR+7 z*;ySBNe#zrAHezpQRfH{WFDEIBB_^ZGl6~bqo-B&>mh3B=A1~ly|@z561uDR7xi6D zglVk)bUtt2IiC%E0>0!!c-e?uIi)JzkA~vS>HG1QLb#~e>~w@xBe~L*RoTbK@NAz? zYXY~t%*x=tBtUtOfAO@+K2z_%50X9fdBad8*Vbs7*{^WxZYi&U#|h9oY-l+^Q{>Dy zxFLJ4g;&uw?G<5mziZIvm?=l@esPpNe?0J&dgv=p7?%^;|+}rJTw*l02|rd8DYraKw|th&^H7%D&J5JjRm|1px+ZJ($cyz)4(7 z?4-9%T|2_0$kgXdH4;+|pc_J4;)W-1#n=wsra*;I-=_X6YCQy_yk}27h2E8R5I8$v zeaz7oj0Yxll$5>y^QU2sFo)w9i9MnR2b&x=AW_pm6L|!n{Y8VjvnNJi)I!%4pK7Eb z#xF;oe#aM2D|@+p3>L(`wVwUX7$&Fehwc3zIIXh(FI9QDEpT^*TSqWgp>ev$@a+{Z?EwH z3pO4wy#sx&fBn2PH8o^}($u7E;d>b9&W6kOxYsMoc4c+hR*ecP@Lv|0<)atM1n&Ol zskZbrR;e2uvQvcQajw8-pOss%8Kzhq!)|ZkVOdeHMz)Q9l)a_3UgpX`I=I5-yh6Gc zk~w+6IK3Ygf<}(`G=c{>|2$S5xU0WWr%;?}0co>j zT9x8Vb=hIl;)IgrU3!;LC<4bUG8saE&az3bLx~p*lYZ?#`~>mp55H zz@_1Ruj`jD%Hbm)#T%X@sl++zL1>=fp4lIcL)Hl&aRBQF2epz?F2?(>BLFJ3O>LEj zU1t1+<10{|C%DT#cM?zQO5z6Nn=$Ut3s%KP0jDG1@;t&%?k!zy;zb|yn*8|d@;1Ku zS}B7A`2_H6SkokolV3Ts%s zZ`7IDSG0wasg1{@c)U5iAKYM|I+V_`EAycVNI^{iycL)UazTj=?1drhFUGOL^>S^y z`6R$y-Fy;g26A?7q8k(D*!AM-K0+n~lUb9Q<~mAuhe zb&m8=B{yWB{iqX2Larxq@V-BM#D&;g=nmCm27XkEN0n65>K_-nWB;Adx-e}YIMq)a z@#}w#c^S9x)S)62PnPj)4%KqFO*ACBvQHtx!f3m{=K@jb)sbY2HQ5Sv4lrjWhwS_H zVU##w!BYmOB>d1nVy6FuP%j>*5WYw?DDrG>9dNrJczQGEW^Do698_#Y!Tx7jsJa3w@yv-2a*eKJs zn-2GiiK_vGG1@fk{$9~EVC&?~_7pAfIU-M^>>X&tChmVJ;#5uCkFrFZs)^k<(&z#F z?Ds#Q8f4(H>!T8|5dcoQ3Br^UdmMhWEfa9}N-y_I;OTj6yc`~83#(Z;xmp0_Q- zfM=3Jj34$)g4t0AL>6mMj=g-+DnO5sWWAoG-m;ian8;*3l0LM|WF8CUqWg4|BFoba zgeXOc`_&3XhflxZm=4Q_qZ>mhfrZ$ck%LX_xg(vme)<614al6yBt1@hxJ$*0Q|P%k=pP zu+iuXlB=8AgqT0laQ0>B4aOs7}0 z^Q3AmW5cZ_L2F6aP}pRyMr&!l%&o<7cdTwLV{Wz>PXTMs^@M32DiSoCadgVP9AyqpZI8D^mZWSp9ceZxYUJf_Hf@s*Hk;O9 zvjI~|b-cZ2TC1B)Yjv|}t!_503pJY*%_e2D(L2nz6kqBZ4qoi#ZaAK4%79TbNsb;Y zzuL)waOi+vzZ!pQ2^LJovv&ZZ1{gZ%GEBQ?uy>FBPz+(Fo;~CBZw9&$vXr|~9KL(O zM1OsT{j&&hy*TV&9QI$@+~eY~e{tBqIPAZON&3ZM|KhO!B8UCIeo@2z+sC~StNkaG z0CpiHM==YExCPiN;x1EE)DA)W#Ul+2wgNvCBQeUU5($z*0S-Yx#?-98)WZ}*)@uxB zgq%ArKscw6l|uCeAw~oexkr8VPq8Y8o~45JTmMO*uPnEi;G~epImm1X$Qd5Lw}8kB zC&-YQDG;U~f=(;1!5iUz`a4Vwjs|es={r0I3orMOIZ3e3u!qZcrXl@&|IblAH}{Gf zuM0MNKT7YuhD&_2(eO+|vp$%kyO+?#E!Z>P+{<3@v1zqKHqowtx*gtrpIz?F>3#6W z&8p3^kr!bHOW6A7^j?H6;&niafXHkrI)?TkV6LEK#EPtQrxt)Z94o?FvR_S@3Y~U; zsaGgSxKno$el)UKV26+{o38Fs(o=Qyrm{Ng&S*e_HfS{55T(&jdyq!MCzzV?2aIM@ zzbXYZr3lBs%)DM!-T~sDS$Sbud3AV$r1IQP|3Z}qeWPzuQNgyly6P0G&X=n5#l?xhIe+!tloasRzFk+HVNgCQ zDj)T=K7|lH*X5GOx9R}5OJ`lRp&j4SZRiR%lq*)ZA#{(@hJYie+7Ng%zV2-ZO=4-F z1ufyk;j#rC9@T=bFZdR06lg*8lbyc>DQQ7US`hKa11%_%XKOG>_^vNN3la&Rfo=hQ zRM&#)cG=ViTM*$q3WyJO$N|VJAbsuq+2=!*_W2DPdMX^?SoC*@PW zeOlSvt~`8N0=d5OiT{@AR>ikmD>1crwNG6KTOe0<{GMjbOx#m6?9HHOZVanWMfBY7VS-bis%4*B11CJt zk4e+(Yfm*+Yfm+(hK(h4sUB6S!&x%rt?k(L2u3hQg*o(OAXZ`69KUB48}6Dk(vAuZR!9 z_m=&4pCW6)ITWOof>N7g)ottnRl;h4i55p)b3O&7peGkp6r`i|)q(*9rC?A&2|9Q; z;~tfeT2T561MDv}O{(XjmyXpP(`4n8ZUciGwm&yEcKiGK8do zNgULKp<@ycaX!FdROTm>IP*uypO*Q_B+mRP@@Hj!GKn*PhWwo}Kbgdtzk~c!WqvY= zGyfFw&y@MeB+mRZ$ZyL0WD;k7gZvxH{A3bm{td|AE%TE}ocX)1X_3(z_9MlaAUKc3 z2@TXn#psRm?72;&r0#YLwJMKe^w#Knz-(NWE_xg=8@qmklVLC$SH~IBE5>eGJGK(a zbQ8K?2||nmbhLX4QLh6*5(i>LE>(=(n&S?&Wz)Qlsk$ESkVtDdLfsKevFDLZB*B%_ zjBCi$9=ylN@o^nH)?6XjulOCM}V=uv(9DIo;*0d+Ds@#MgXE>1i> zaAFHiJlj73Owd+dj9>df`U93OxCl1ty*bcyz$d=Dp8Z@<=sCT$oQn+qb#o|8r0SfF zgn(Tz7K=dKn#_Fwb;n|-1m1&g9~W^N3`%{JGwzi_fx>0xM6L!zoeRiV=F$T=z&ga4 zIf2U%=Xn&dqP#kCA$BzqM{Vt8cVKss{k(?oJ;AfG%;vgstMN@bueY1@o+9S@zL#rg zE%2gL2*>^%M-wS={&sW2uv1garZJzZO?dDyFiW-6g;UTJ3mjFEE<&>Vr#Hq2f zNx@StUGZf#x78`A^Vq~L)Iq~WG(Tf|FZ;b_Vrus-nA=R_zN2}{Z{jQZ=(ysRuRM+2 z=&nw)r`q5bgDi4C;z91Vvq=nOgwe$nvU`jsq25=znwa2ouin`t1m--CU(WqT) zFV=t+)d2e;D41F;T)9ARoUuO|;x99(t;gIA5SE6<4F6mW@gcCh8Y6q^0IQ2ss$0V| z_^5$|&OqswQAtdgDuX=+!j;6%>X1JVn(QC@bw-iO1c1?cSDPGUhIs#dV!0@eP>Q1g z=(G>O7?9)juHHZ}si|+&(L79?G~?)2vVTN40n`r=yrLM)XM*fA>=wxyh7XbMBtvK^ z3Yw>;P$5|vzs6IUJ0-zuJjITQ9hAEeZMpD(>X+{-0z4Bv+XEg}7&SXnVpx2{I~1X* z*-jbr=YysjH?7&UI%jGdbujOPAXcjCi*3}}nSQO+q5O_TVXcprt>N=ddO-ORGY2^g zf1~aII*lh*&njQs&h)4wgAc1A`W-Ds`t8fyhs!%LeY-m)ug+6I#jwa`N(exWz!;v} z;JzAf?gGjJprWJ!!w8`V!k&>XE+QH?>L=d2P^9y^D*>x& zqkihW3q=#}fm%lirZP}$Ma*Fln5G;)uArLW@Uq~{&QJr|!sG3r3LIY?oi=4KBuJRd zWJQ92L18>awJ0zd3v%9|eQIfpQb8Z-w@UFIaC{ zpnBP(ME0s%ou&Apr5{nKqciVafH^AL>EZBk9D=Q# zRn9*%0J1w^=Uu-DKg1enx8DezU$P0(YnKAox%lP&~YR|OsdwCt2D2j11$bc~V zz^d;jQX6+Q!TT1TRJTB8{rEkmb5D`jOMm!Ec_`dxyP*>f_fWF?#+^+%N4z|O+jn;p z&_wS>v@83hdP9-yx#TW0-7|IdMZNt7chNoVhkvmDNO5R**keyUm12d&QWU*nMLYpNWe&iD^l3wNWV0 zfkJUjl*NVb9Y+c^v&-TlHa01X3j`*E|73lN_&l+v!8Eb1-Nl64AYv4IS0BW%T(@sp zxxQ!LymH+hgbsG~;UckbePhqQ?Tt8**kH-j?Fs)s(GKhhe-Zju_doDKh56bIMPi?O z&7%F>?A6T>I5Gt7e}9uuAdj1CHodAzlV2))dntbNZh1WPWJE&+OD3}M(hVlIm&$|U z{)39>hQhc0O`Fu2-~3*{+X9lB_)CWh+^M;Q1J$$o9tPCv8c(WUSz`_dKl~P zna1`(2*?3Kjl(w-p}j3Ku^n5y$$E?SvKvger--NX5U^zQ=_maEl*gE{-WFjo?@kqi zFZtYir8L|fKpr%ZT*UT-e|6IbLh-rxes5j}ud}H^k14z!22Ctvuw)vxv2=rN{BRM` z#^`h~5ly2(BgkuTIdDM^Q*W8*$|eper^A+jrr#*7sHXuUUl0_of@<#-Opj7up-7O^r-~(^$@AC!=OVLYM1&!AxEd zkt`{kivCUcxJm3^%wE;>&G@W3@%Hb{+a>Kn&D5`Kf_oXU9EP2pNfD{!dXEe*9+}wq zrX?>PB_?hn0($wi%`h?JaQI<$z_1z^8c0fSlABg7VF{rtH`z-UaUP)5(onM7YlyLT z-w~zQlH|*HUA+$_TYdJGuBjYodho<@LCjsM{U);Y>@y+yEDTn&Dw1+k_#JOkjDII_ zMq2pU`@-^pgO3J}FnYXxAtP1-$UVHtwI;Ia!jDL~qQ+uR9#P{r;SuudWYi4dCWZyt zI;^<1PCyS_9q{CKF|E4$05LN8>xOIZOkQ z9-XMb{sRM;uh-Q(q`1(g?b&d#i0!9qS2wX@SJ9xi{Jot{SRT}5{{%gEeLq(oW zeK6A#23In5JDP{KfgbEa|L|p=R=x^q^;YNsndY)0U2$_U&K32pa%;<+>gEvz8X`z8snle ze)bzWrKaBb(%+%eamo3BPBZ!S|9I(G0{8p9-hz5vvne;Kr!Dl<0lJx!V15F`i67UL z%bu*m2Jp}?)lm7o0Vqr=n`gfP`2uVNf-kA+O`?I`B>k#;6Fd~pNVcih;n!vrU#_kZ zCu2ttAbO)ti)fy^+#U*dxR;ReF8l4&gpe5tAu|F3i~24T-Loh?FiX3ol}CD*h@Qj~ zdjDe6LwDv4oWYPn4ik1N=k2Oc8VrKv%VbYu3FLZMxHgR@wFJ7p!sBiP``jX&SMT>w z%Gc$QQHU&Msxslc0%j)?zIRrURL4Qo2J>UggVF;!Y=}rc6s8Q;2p5)r5GN5|{V-Or zxLTI10dAs9w6J^(*^Xtu8Djp1`o7P{m*dw1zO-t7PWE|Bi7;LX6~4lI?-L1v4vOQ6 ziYtS!PmU)SRN+jEr8j}R&M7YZfbeUxXO+$y2%;F7s+|HQsD!oUP6G#g=xa!Q`}Xm_ ze?-~9zQ8}(hd43XQ3kntdWU^XlzA|s@*4Y?a{gTV2TX#0P%6&;fh1X-W85D>6pK=i z20nbMbd9<1E*)*qOhQ4DNtWJZUzob8ih!>{dbV^_*RZPF(P)KV!|=?P@v~oIxzS&d zJU#ZU0fp!eK_NgH3OUkmCG5k2e?r)Y?%`hc7s0nM_Mv;YSJ3_Kun#z9gldUp_(ozK zx`*xNi&%$${POdE|HaQfd{!MjGVi~9SO*aGgo1VGuEIJTfKmU;!8)KM`d9}*97;?8 z@jt`_0G&;&12GU(O(!M*;8bEAh=Cy1f%zlk2iAf4iFIIp@ahrk!2HBIFn@;pz&bEL zu@1}+30Ptsn4ee&=AS}-U>%sBSO?~xL4IHzn4ee&<~PU>tON5C>%jaQu$Wc^4q=k` z^~5y%bH*_IcvdPmgE=dJnzLw{8b3PGHDaG?>)NDoX%5ylk)7t%X{IG7avcE8)*}Qi5+fw+1XN9vvE2E z$zeDJj{o!rRrXiooSE0Qse5s5S*#w4(V%B|9J_Z$XGh(8Vp{Dtl?_Pri`|E=J^*e^ zW%q%o3kZPt`gF)b(4a|ZgouqbP}O`c=@$JR3e}8?Q=g> zzF)G?xW&l5j^vm+*5P}?HMLDj^D@9KAP4B%r^?HO^#)`F3(H3qE(Lx81UAV%Ieq2V zW5vPU>m?KJqKCdLDUFh%>}M#`Z@ih z0d_qTlPtXE_JziR%KoSU0ZeRqZpDAL6zRfiZvTO10OZJ7@75w&P_HwoNsfSg;B_~0 z`@-uLzFkHHxj-bHE&=!sjgMlEjK8btVKIT10_<+bZZxjQ_=hOA%MXtL61=4cHB5~+ zdb)Ka2gxOE@VoXSIv?lww%>nb;k))vGub2yXU2}?NmU*u;X?W5Bm8syerfZtT%xhE zs%kq%4_hux1(Jl=zwJoXW?AlJxNP(!Z- z6b2tNbek!hnyFq+Zgk$}RO=Tu-m^#+E{8}eUtXG10>7u%)yKW6xbN^rHl-TMyEaGC zTXYr25!3>tKiiTCz+r_uXZTNN;6o2e{7l&o1YLc&djGO0`d=W(E5Cf-?IYe--18^+ z#>5}q>6x1BgWv_h6O9)^u} zKQpxY9~}shT-X^9eNBN75dtAF0uuNg*t4EVUZBSuTedGI5Q5R=I6JNJk4c7N<|bLT$5 zrX=X(+xM7uxpQ9|*ty4VE+vEhp7Zrw3kNm^U6=lDy_C1Hh4n++{_`PLukBr*fE4u> zJmxl2zwcEt>#fdZ(@~QByoSxG zko&FJhv#N+4NG3_l!p(?Zjd`C%EO1NO=jd1f%wCiMsiOY=R_I)uxvadd|Pc(KU8fz z|BzLAt=f1-eo=-$OveHCdvQ*b;SXcu8MlU`;$XS6imIYEO|$ z0P(;(Bfb|A)*zn*skq7!sIjsFR)m!mZ_l&^|AMzTjVTFqT#mnE7yTCYxu5+IgdYAX zUY}TCSN-RHc306}@Q%#m7f!6aV;6X!F;{IW`_v~+DY#Q}%o63S9m9%inK2eNe1l!? z{YS>BB8P=&M6}4wUK{M0&I5!^;9l5{shPmmmx>UhF@sMV-0h5d*0Yg`vyY8&*$Y6C z@Ju)ojD`t&Q0bFcix88m8Yfrye%{r;$%co4YUU#mWH#@2!P+?Q18uEq(Wo4pY`UK*<~D*q@oval?yPr%aB*V!FaKEd@Ojk% zT7rH%mt&-=;7!lhI16c!wV|dMOy{A6TPT>$0Xp*G_Gp>0%}QOa6!{j-nAHPnYF)h~ zm>Fya9(IVDfQXs^Lgv`?7Q4f~{^vcioLWHQ4E7JzLF~F>{^P!|!pG3lM10Ia;$xoq z#15xs%zazj)61U13Ql)5x*aN_>y6Sq02)e_uER7aF0AydI?QIpYvE_Xzw8n2&mM#k z%&ND;&9()8uE4I`vWS(@h&y5%wJlQV#JnifFZRiaiH9HathZ?V8?cx{s5;|!tW8v#1pWJvHY68ePWk3RNh=R)<+x%RR9&{Su^KQci12Q!9gk;e68MA)#`H zhC>7Kz9f**U45rl5Rj_7P$U`81Cy2f9f(>XCNK~gyh?2gE*R3`pa((4jGN3(9Trt6 zu)q(a}*wR)t6lo=o>gb}lUJ6sSHURPgH)a}hZ zi>YFG)pX0(%F~IB#lH-JL49RYFR1(yK+z@WjsVFeaOI*&i(4JQZApgvv(ETQ#@NLG znm6%a6VnHX$V!B2Ae0WOkP=GQLLHMev|;LwHPpn?uRsC7LljQ-JpB9QpZKJrSpoql zdXi7b35OR^*Fawjpc-`P8};t|5?BX#i^yUWrjzi&*YII@cYf%uX2*Ent@q`ZK!I+t z*+$A<;-zcpMB>u;DM%;M6d3cq9!(kOHO2V~wA!j0B<7NG9&||}7%o=9pcc$PT;&?> zgfQMfd`(eNm$0(_)0zlxY3^*U!JSe;k|f(y20)2S>gp1(0_Z0{psO&VgU2UN%sE^nE*c+i&l`xsarbK{S-^nw^7Y{NgP=fpO)J6yq(8fdOd}|X; zBEWnGJEnwH?g$i&&!%ks~PrnLAQEl7ve?&&gkm2uym3zuUP-GUZeDF7li z4y>{zDoP{xtb?f<3!9-eQO@S)R_rS8aJR>)y^Y&oDPLp88K|rf)Un3CaQ5uk(8YT6 zud;7iSy{OmMq}1+Kc~(6fIV)K0b_aHtdTI&HmnfgJEU_P&)51p%oXH`=|6*?Ae5?ddf>gT-kxJisf-NgcT6F& z30cuA1pkIZ5yCzZAWJYt)c*uBA1x} znh#q{Ai_I=8Aq=gm^PYgU?wn?44_5JPlFgc};ZH34%o5r$~>)A%T~< zn{cOKo0^r)g(*x>Q2vCw2H#rE-il^~jeD%L0jZE-_^4NwF)ir`M_tU$ zBhCu3Uh3+DqOguvooxlGR`Y63Gp|lfQ|{=4!>=4kohF*&3R1S)%kGUZK@eqRs_!YP z@3~Ldgp?WH?y9E7Oy$(0kErbNmP+hnzvX_(1&o@0Groqd3%~z)#gSWk!@6#96t%7$`GsgS-Z(!b`f!v$fK-z(#y-Nq1!(G+5Gy zbGLB9Vp+{913_rk|IDhgB@2_XGiAxvMwUqzWiwbNU6ctT8tsa~{D&4}m0dAzvqR14 z=M2QSPl|T=QwDgP@6pfj?}9o0J^ESvJbIJ_2n;MhI9`W@KzKsJS{J80pGy_M#176QP9%VrC=eO)GzOl6Z%ll7E*Xs z*`f3yi5OES9eg9$|6Wzlu5#jgN{-H~5Upe7w2T7;aR5&K9#moEtfet8)>9KR$)0Xv zVh0Bfcw@59b}*MhX!=`y;iuE~Nz((70(Gt7dGqGK+FS^B3e4uOQGv}!t5sqpT|lxck9d2t}r=u**s)3H6Hn< zmi+|cdC^ss1>i9Y=G_6jg6v(bM^yQ6p};x?FF)8I<9U1u#<7Fq*5W5_^bgGIBT|q{ z_`_Crv$(3|LAW|QSO85T;N(PN|0S&e_ub-CI$zo#blpz_d@+~2FI8boXV~W=J zfb~La{CJKJWS_(JC75CC%|gT^g^uv^O4QiYD7g^!ELb2oS-WbwrNM!MvC%@s;}-bp z^&U(w0}t}fv+6K9HZsLrUx1l{Tdy^zbWhGAS@fIGDcy6eRi48UJSC``R95`(7jxgA zTq9k*1Sk@mDH6VI;W&6Be2q1OWpZ8lzUO;BT+YiqVtIIj!|=(l55B&<0Yi{rW}iUx z1ZI!JD!7=WV=^T=M%e?5v8ZiR5L`Q%_ckcwjV1Q+-=Mscl>TElIPsfK-sxSLPAalO zy+PTigx{eAG3B3E)qN%0#Al5Bzt{g>}al&Z=7% z-t^|9$4{I*wc_29w-A-=KvXs3V+L4^nbxtQi2#)5!dZtNzU9cRLk_m)KEYC$&@^Qe z+2}8L~tz|?wA={@NOHr(?0hdKG<2X1zd19I``=f0;_D} zkoA@vQ4qj2(?TOBs$+c7K)=$q|@`_7MUc7R{w|)Dox*Naa z)thEFV88Z`d78dDu|b}u-;vl_o~9cUThG(9o7gZ<(^n-n%G31Q;XO*z zZ%b?=Pty&FP4YB-Wn$AjO^d`f^EAy9+sf0_Bz7!M(@PVZ~x-{6N#P4 z)3lw~OY$@wPwXr5G|duwX`ZHIi8Xnewi27?Y1&L|k*8^z*jMIhnk05Zo~Dh&ep{ZV zabmwcPtz!|ugX)X8F%v(3-pb7iq-#jW@Hc?@f) z=P|4y%wt$Xl*h1!IFDfsjXZ`mBzX*LNb?xh(9C04Lo1JA4P$u>Ysm5#)-ayOu!eRX z!x|>?7}n6qV_3tQJccz)<}s{cZ63oKrt%opur7~b4eRq5)-avNu!fmDhBaK0$FPQ1 z~p{Ti0EvizUXV45if@i zEA+8`Stozi8s8oZE>~-Wo0yQhvPb?i}LIHF%*y5>0UyNkTM{wi70~<(_*S!d^L0`Vc*zLIG~W zci@@e<>1?r?xr)V)HbzVa;zf=PF=Z8O`?n6rq+-k$@tmBcjrvp1+d(FwCvmun zNeHpl1C9nz4^l01CObQkC~ygFD4BtTBIt8tx*?kjCo5h;pujbPK5vI}D_BtCR_%{7 zoc9(r@pI|#){*nO)|}&;(_zQvH^74CTaWv|Oea}ukeDVM-}=6zIT+-yK|+#4#Pe6e zh&)YZGMui&5qX;IWH?<3B=R&F%7hdEWe;{M@PO?j0iy9hc=!$y9`3`-M3@yuKw!g7 zcr~Xq7?e=~a5|QgGS4v+((Xjd!BHF1HOZ;n=*;I(8*+6b)P}<6Mxu=RoZb!}1WBmC zRq$hdUPE{!eAC3#oScSNNRtF9VmWC)0=}+yf{6+u!*0%g0G|#us)pku)YA34`U)&cpM9tk3U2n*_CE`C|6Ooq!$)-|)p>WaXE7y@GUsF?v=K5?(7k2uiayr}sNY z@rCaxVD=IBgv?ol7si@z98G#Q7`)#f25$`f*%|lGPRPl((S6cg)gKKP?>@B1Lf{(#YeeJ z)dR()3pzcrTY}FGJNNi}tmoM&ledwyY5=%LaNU5Q)F)%y*O8}?81U?~dg$)wkQox% z?m8DoB`1*l{w6Qo%Iv5H=@a1%C~8=I1}xwjdfbZ8%|7?e)5^{p-~OD}vrpmR{&$^r zBD@vH8$2#S-o(hvnv=3li^!EV9??J%VIu;F55$^~xa-tA9VMLc?Yrm@*j&Os$P6jV z@~u^WXzyaCQu}<=)+n+iweL{xnD_>GU9JFvL_+EV4J{iD_V`h;}A7uOitw zDrUmF!WK(zKv?1+KOh}+G=u(lN`An780Iv#D}ftGDL8}8flUI_0d^-8>cHkau{+N7 z<8Suv_AXc7ZL}~6$^cOMAnZKI1K;J9r6T-*EQczK=*bT=5SEOETL%VfGLi?vA;`9= zVD3ZYfLnXn2U=)E+p!#UTOg}5Z7&G~pCJe202L4E2}vM$YM4OqvC#yACo5&>)s%mq zXzGq20?+6}MIC|#V1n7x6yO;CcS;%WzGD4KF>Ti0!qG&|{=j|tdiEcleUqUZAp3t? z;u&QS!%c^Z$ese6?3CIw4QrS->yPB?jRILeh=`#4+Q4=`SF{SM%urFao)g1OuPVkc z%qZ$v7FjPJmj{~kP|-HvLgR6pAy=lIPdKO<&yLTkO+^QP)Sd!ccsidzR=}7V(AAy9 z8GncAFm7zEnS@Mp$E@Ac^vxtReJ4#Dy7#?e;!4>w!v)-#<82_taDm%ENcP;@BnjR# zF%x)w4WV0*cuYvpn3qpr?3l3LP5D$}VlzPk_DQ3-r??i(b-sXya&Aj<)R%lxYV?tIBi|<~nKC z!Xnn1DKyh52G~phfCM}rt&T%k+l2W4o@whX@jPq6n6@>0ri(U5UQA_bP&#Xu*C(cB zy_-zhyU(Qe71Kw|`dbjAXT6&a-Dh}s>__g&o3f1>v2~hQ+C;mTuM-XFHU17$w?D3X zbRZRL(UTb{v!XG`KaoUPYxNR3wW4jkn~DyfQ%v@XaS8Too8$&g)k*1*nsMq`-{v*EUdv0`}$Hk^F$3&(BJ2sQ}elvNVtmt&mu<*w>lct0J z?dcNZisZ!U)B%4OxmsSUE7PqdcC%aiwk@VR%paD!mc5&y&7LZv<08$z*2YYJ7Ro zF_VZ&Zks6{w#^#XqnLHzQS^71#Izv^-J!V^lhPRty=~jQ4fprajH~0U$0k`FPvN+F zTf8U?u%F(=aiumtDKC|y#H$x>n+V=p$W-SEDoz{>m?P`FgEO5&0NJo!Od^F3vp|DL z-~eo!wRvRLTJI`{H;8gaBDsc`SOj3ozY9!Ov1qXDb+J|GPE>g z@OA>YxHbSR4~vKt&}yjU5?@^x=F_;$5C3LSzufy#E^-4xC7}T0FWP|n#DK0IC@2)$ z>c-t7`w+JCW`^RDH0z|5wi&B`~)y)yST)l)ZzhNM}OQ24=|41?vcQq z;YL01fTVl4RdHF*df7XDcy@U2E#d&%Bu8Dj=?ph*5o!&61wLR3e=yO;JoyejW&_s6 zxPK9q53C*q&*T&y^?O1?BABh30isOUvbk3W7ZG!2x05b5gU}A751T;Z)=VAQ#pz}* zD>FrsDb1VQUPfWSkxNPz-#+@=@aG;j{z5QM(&(pE&wk{$Ppj7@2Jd^!;0)2ek{`K*Ut^u|)*47zYO| z9|P5u*o;?ZK__iyB0i=wXn61~)l7CM`#m4AgOp*C6YnHDZAV@(>*W(tOz;9lW`b?W zJ)&r!5rcVL3cCPm8LhaERy?^AI9}6WJ8rNYPfELtaH?pS4yV;^toc2wmk2J-a4Gc! z8fFT?U+4weavdHEwdBS|t@3qzY$=c3kO&|rjE#jDl(N^&bH<)k*&^dHVXVxFTOu-n zeNx-r;q|yZ#}_wkd&29vmj=e#)FIWq2J6jRxP-&0L)Kp`#)b3(VjV@>)Gzmrd!~(g zKVTX*09K+7E3Bh@dc`=`=99vZ1crUR)Pp;dl70;=0crgP{@3P-VmDHk1~ z%%rC9Ln;97BI6w@)=;c$Q9AUw#&Z62H)3IX^>zv#5eR1Zd+mRniA4c;oCD``k=CL_I9$q(AR+dX%OWg zJEOxGz9Upr5)*QT#6|6pO{UB2GQm**=z}{WG4mvT@NHBq)4$3<+HaS|%juXV1|*xmw1QPDV6BqUNp zpK|FU!3TV1Y~NUBNUIEElEK9G2oi0$XzNQRwXa#c0TdfCj*_7x=rd4W0^7jilQN-Q z@j#WeOkFjgKkZ6}6Ss)a+8gZ=oLWINa1H4-d<0^P5mfBdQ6S_eUw&nij9WurF5eB% z1c*U|V9nmbgNK)2yIx3zF!P~n3rt3csKHjW`%Q|QRn_EW?}ipY{~xL&aMh2E#Rj4g zBPU~w`eK*>DcgJ#poS3B*RLTFl%R4KP+kVyUI71@fTg>S#Aaas@=O3fdax7y1oMaB z=kg8Y9vFRY!t&#qz&j!d!_SvWGCAmt=K+9eE^dn0xS{`lOKbnRMqrxH@n*;XG>SPTGX`Ei`T^nqXIGLW3T4#k&E=W19Cs znJcRV%1g9b3uu5eZpYcs>C2d^qzqd!%YZQf@*77 zYP_3oqJdKL%QqrW3b;v>T4drqO~Nr5Q`dl}8zCxS5ok~V00&ZXa*RJ@|11qp+b=!; zL1nkt_v5YJg!m8%eC%5|A-aKh(Lpl7(gtB9cF9?tB2O&8jh{W(Ca8-btByd3+}@#& zollCq!MqrV9zayZ)Tc3$!93-6YCOy~LAN=UfH<;@CF~H&!yW+KkVnh1b!GckG}a)p~U=+*0%<8cW02hYgoJdn@HJ(>4&gNBascJTtVFe%o%Aj2yfwBw7*wCpcyCUq64N!DN zqbRx(%ndmkfHci{DY`m`?es;8u5S=USEookv$V)xHp(qW zu~lh*M+oDoTI@eoGY7@7dftF%dPjOA9O&#m(r#$;O?%$R7vX9~5#0MP0P3SwSr&UXa&~iBxb(OOJ z{q#paSSQ`@i~q7hzU=4mu;N93Syq0TTsQD#9r>~hOIVCHM?I`jVi%n^Tx9mqUpp;| zIiErJi-)g6e#QK#ABM;p&jq9VaLRW9Ri?+mQN!@m6i!tHGCXB)N~D>~3%fYgtu92V zZvZt0@6?6KY!Ow`%Y-X*hfq^&72byJd4}b+soM>`>~47a!G4ZsffE-e-y%MUCYRsi z_#n|iV=9zDv)`plTX%>I4?Q6^w@ z2t^KF3z0T+UEQ3@zH0(cWqR7&i!Fy#TLmvnW? zt`Pw#2(Cqo*4a-a%#Fpc2TGR~R%r>gJ5sRFU^U0vg6f8jYtlaKhe{Rz*(3_sYZUyH zyNv>|#1%$iQ(_0eUAT(^zz?isTVVp=9;n*7LY%*xtGWbGAGmW>&!Nz5NWKB?DR$(- zW#GzMnK~kYebNCz_HV&E3ezQt%n_h5xyz#Lv+N>JG4c!soIG8fEVZhPVkmG~wRj4N zFX|%peJ#Up1<@>G@qN&^CtZd_PkW4>Mm0)5BFs30Nb=Ab)k#2r#u9t{bEj3dvPLDp zKBhb3)`dES2F&%P{Nq%IBw2MvLWbv%WQAWNN!H|7MUqt$lB^Wpat=ur5=)XSUfd#)-NU{zLl4MPy z?1o9QCNDseCD6U|kYttYOl#p$fgKEzWKEVNS(6~iVx&LPWna9j)A72(JI+Adva6^1 zF7=s`4XRJIl%l6fcY@Um2zQ7Tq7U96wh#J_0I?;dpga1Vl+jm?Hwy@J&vqQ*E(HM& z-(_g*8{q5$McAy$`tLM?v#Wfk3EatXcGX@CXBT(@Dyp^7oL%W4rxqyRN^Y)WT0U}s z04rrTBn(n*gp&<$bBzz)XONrgm~nL~&d<&D6-c_sD(UDX2T8g@@j&)J zu4MHB%gd+>Ag?e?(p9zsM9kHaLAys$?$0s5aT3*-^l`q{L~9}Q4w<{2jnD=0^osoO#BbVNAm*HBYTq=?$}9_LHE+!e>pm8Cm&F_3{`!-?j4~d+F)}vdib*AGDtR zj|%c}&RlV7YcatJ=`&z;%!HY6#ZH7iLIRkzV!$#NX29Ay$bhwZH3ODG{0+w3J_8oH zW85$t2m{t*s(*qMSZAuxp8&Bo;J}(3#etOy2Ucek2Ub%!uX+-q*>@*#)Sim z_ypm=O3B(>@nDIJ#4nENwK8y@s2HmQ$5{R1M{pFUDuPy|>NO1DtHy6{=Q-myLx>UP zcwUlA#y(agm+J<{Zy#zO43#TMF8$FYmtU9h8=R>=NiJ_I$!P4Gygte0YcPHvmlGw) z<&Vt!TM(#qvy9)@=j&j^B-ADAR-fc@UG@e2%?gCv(D2TW+P50YHI)B)4q z*+ld@8a%3i-8cqJ2A*=ZTv0A^z=Ul%GRxHiW*rJkNWN{=fEktp=56N=n7#~{GB^$t zRyl6+p~C~Fd$m;qCN-OVuyc-aM5sncpWANen9m(O2hzUE(X(H@z5-_=BMlCL?3z(1}vQIO=8Z{YqmcNUvT{ zGFIwme#woM&ng)!^;7OlHCBQhOM0HHm;E@#N__?p9V>@Io{xG3SR1yK!y(y4!P6cg+=lU< zeOH_?xM#g$txKsE%#t$IE2dmZ71xUSfWHMSa{RS>-alwO8T>pM{5&k|!M@MI&vW2B z8D2f$>Gq10)^6hgm2?Gmo-n+6GQ4_d3tNqcarH9e!O5@%kuV$mgO~w;Hq}hJVI7>Q zW^Hw_sb{8~$HapJV##>Ir0Kx{aoBiVp-;G-FpuP!Yuu!PPng0Kgj~4fs-$#{1`bTP zDlZPx6TsnJXqnv~rf; z#skRMx66AO`vFm2&fvUR<=NLPBBBKlV=(gi_TK}*S_5D>xWNf*;=r3#nvh{2p?!P( z)x`MLY`U~6mycYgX4^}4W#t*Qcth@U@ko%TuLCe!+qXTcb~PcJyt4ABBJQzNcd@}X z6^uFmE_Ny)_&SF9zqhLi^kRUo@roL;&%oFM9E@a#xP`6+{(tJNCB(MM|5|YTxa2cc za`j|+l5?+V2OAWnUCI+zO1s1*`@)RlA0p>xg*+c!nG}9$`Px$vV2WDru*NDBsw(RC zVONdo_e`7m4fdUg;Q;ni=zW6(M0SA_Dn+@d3Nz)Z=Q^!0YPrMc&1+C&2`tAr77ljE zgcr-P6ETUI;blmMOh_#L{De&$VuOwIcp1e}Y$YKticK6QCf2KOt$ohDef!E5##lhw zl(qZrz0W!OXYIZAUh7+Hxhf2Oc|rNOv+{AkcmGyhks#DlRZkDD_k!Ayusg(_ssmbt zSN?;#g2%sl{<8nM z@@)C3Gj{Td1dh^=eh7L)_y9bc@10Qak#0M2#y9Us+^VN%X!tkP6$$R-XVXkrC;dQM zS38^5>9cCx4)$1hR#okazW~Tg5XU|4b}#Lvp6s;hk)nJ$;}Zv{%r~F;5Q?b zx4sGmo0OLU&tRVn;BBU6enM7;yA!zSvaE4+(hax{2amuKd+aPwu*ZtyV7GuW>KY^H zmAhtH-R`O^3v>l1;A~VrECSf8h&KO6A;ve3@eAl0;1mV$c?t`&TiUn{Vc8nHD5!D{ zAsnka2O|nZ8N@&u7s5}lqNNX48?bT8%v0sI`xGF}ty?Zq=Bd(^Avx(kIM~fs?x7HM z?ah4&e5ct(aVY^?%xmn@LNt0yPH!DNcEHI)4o)u>5I-AE(d8wma0j4Rm+oX1+u#v$ z5QhreGn+6*<9Teh!3;*R+D6Y(Y_{PYz?8`(d&Sj48Z!aV-LYl}~HmOkO% zLjHZEKXvnBKKu^$sZ{k%!3j^tS$xMbl64TjT4F0O0m31u$BWx4aUoAE*DMw~21R1L zKz3*~Yyp_ncJk%{V8SS2`jLf!>scUJRHexhKVzI7w<@5@JcFmBF=JD0tWMi%pt&hLNYx0d!UvgB^}wTYsU zBj)$N@s=X}IE3aa8VM?pcP;Wu)lZG*!`swD*hN3>6f}G!ubHu%*zG=chocZV2h;jN zq%{-XbgB9So;+59ZEz1eg3Eokg#FqjUauDgOSJ?TBCi?&r5$uc4|syWgwF(gyjdL&!2^N`GD<4CT|CXgUr zm$SjWF1rB94cUc|;%`#-I$PEK=*@)?;kk6dj0>aS^JiQb0#CqmolE18Wx90Uj0@AI z^-u%4GzPVbOY0Cq(xtTkNw^Tva55FkINRNe~8)!Yg1x#=a=gM1Yy@W@MFX9^(!6L8s_AMy223lYCo0 z#+Lpr@&RV!YF%U(`&fO<$%kg#2OSzZBAeOL#~xMYVsr1u9u=p*!vjP+BLig$2GD>-14o%$1 zSOJ7V3Cz(yf$t76!TvSBe4j>$g@vNp2E?K&>228oFc#aiCB}`R@lBZbapOJM!FQ`1 z#7?~JM)94nO+w_dC!~~m8Vtg~EU>w}OhH(r|A5!Ko77_tjxTL}Og>zdf8Cc-%(>=` z{Begd6eVl7`wW=;27Sz#;Y|;k7(T)9p0-utK#P5nT{=SQ8~sx<$Vf2xHsi>gkG(|NCr;#Z-V`I1BDG(UXk88o@<1RFm3$Q#;s=NwA+rI(XLUsfIGfCWgVYP=r z;Tt%%2X684C&FI_4_IPBY> zk8o&I6XKMTHQ{f9f+A}&!WifdYEpeZZ?1gq8aptWMkItovyhsVQISSG)}C*1wTy#C zHYu8;21Rr4q56C|Jk27H;9NbRh!V5@rkov>F@6AU`u5`eyuES0re--3K;WKs;N|Vr zw#N{Xh50Mbi!?I=L*`~`s#C-4Eu@*q$3#a6{d$_Cio}1`9RC?%QJ|YcIAw1E27Ps66X?2mQ3CcM-XlAx;fT<<>G{y3dNv|7 zmj0-GBF*^Ip*41eKYFal(+)Lk^eK3V@3Y%$@m2x#h~fbO ze@Ad_r63C_#%=+R4Q23O^eMvvLf86e6KA(-RdCGT-i+HahDCU6w>MN0ye{&l@fPON zk9tS2$m%N=$!NK_hTU1J(=d#Q;XV+dhpGNUG1}`cq?BOn!bW?%fUMD;x4@CT3yP}+ zl{dR4KXqza)nsKCfJ^jpBfS;{a{y{f+{T6+W58~_1+%U&yXSM=4HF!bu3`jZc_4ao zMVPTrO_*^+9WB=Y4h`V5*Zfu9x61pzEAKnD+!k?__mOTZ4>9?`9KC6Upi6a5+A4&9 z1yl&96$j$uq^;tzemt#WsUNTMzE$2gfcG6+<$XUi-uG*XZte3RNu6Q`NfKODiFYI~ z=co^WXT$e6!ZWawkTD$N5j%nXr*JHU(6EPLpR}3mT5}-;1RHTdoCZ(*_6H7L9CxPt z%~2!l4+b&8`&d|{cR`Nc#=VmjlM$&70#X9rE#Yj-5O;9bk>X}09iZGt&RDMJO#4Q- z@jxs>!0hsH4mVSHaq$@T{~3n%h8YKz)o^>m72%+xy{q7x6Ha;Xqn0v|5PuCZ3Jre^ z12?X+5eZ(QyN;PTki;pxCr;6g4Y; zLpP_g814f_oWy7bg~(e)?pgX^nl$b7GwcJYQRFSt-o^29>ZZL*Y=3yHebNQ_GT`Ki z`#rYygTGClFOOO!RdH=Zd_yZiUNRAw0m2=b9ga27jdC*FGfW0n#t&^W5}AyqOh)4@ zCnGl3fyP$M3E!vUGEzHi(c$S#B4lNn5Q_7O5%?pA9s`DdTHsL8Qp`j?|!bMUZUEk{|HvMSkWRE^-ls9ogv9wc_vVq`Ppeec1fDr$jP z^c<@h5mOaTw@P|pQUTV1Nrgq7AQd<~3&}4iBrSA;regI{i)wRhUdj|EP@^0Ql8SKP zKMb`wlnT?1rU?E6Fg7_yi?N$9N8G^*hC4c0i0Ccie393UTE>x6yzZuq70prA?LG|h zVuKP3HC?vc>;|D(?IbG>%PN8}wOwQ!oGu`?){byF^9!s%h@o_Pr)=uHQep4OkHJM0 zoC87&IK?@t0>5(sA0)=I0 z;IotUn^)!jcvj;Q$sm6`^ATw=Ff~-V@2j4zbM(N!=ATj{hU7LdC-4=c4IH_itl63; zlsQ=|tC@y@qmNrBUk88bab?ao_x@6u@gOoL%+poIr+)cy zWv0!EUoLB$xchNsX3RZR#xK49ab-4{6V)Rx;2oRHC-1h8h>x!;4Y(dm&OBIjdyJt! z`F}pH(#M+W?CO9F%-tV(T&2%SL_ePbbNGXS?fjw7EBxZ_BOK4j{w$_7w01F@pc*-I zke?%N#k!kmd=WD?geolr85Y6*@_*rKl>8fE>O>C0J$n#+Ux zh>1U5%#)vHk$#P=!%P^>cbqJ7XQ`E?l)(6p+^ZqbC#RqoKJj9Z4ql63*QFQJp-$tL zETI$?S`^dB{ye@8n{SKaoAWg^d~Fs`LgO@X^DTLklErKks|$;A9qwwpobzYaYNPJ%b5AYs5$3FimtCx6pZ=#w|C~&@GGEL`PA4bJpax z(D2RKI7|IvXlWA~VXZ4Q7iogx#dlh@d<}kK;igXdG)~RMJT2Qi^3J42O}wc|Nfr|d zk{SmT9^&>x+ugi9Z(f`E+`+unaTc@lvCVY$E#~MLjZpL2MALaRaWkd7S>2pX(0Mev zh#78CbMfYmUd+ZRrZtPSc9GWKOk+1wx|pRMmBrkJ1kGyU>xx?sj&8f)L(|fLe*`<* zZ|*(kS*o3I1Rn!|;Mw8K(1e^()C*SjFd4>pBQ_ z`IwFt=P{j+wwzC`n<=LAZ@#vx!e;d)yij*EsFS%G>R9EQi5-dF8h}CKRVPIy@isWhNBby;B~hw`yxOx)fcD5cmmP8 zu$+&>Z(sEBrcT7d@u;>Js@_$GL-=eC!&X+*08(bdzTtcgrYfO8)6erky_k%0J#xp&)Q5n#9kw)K-A z-jN4D43)nS>C4r#2zmM9ojY=mqrih5dfOAvoVxQfDm~=`LV^}~5#Dj?&K=~X5Bb{x z?Bky}y%9p+I_993GgmcuYFZyc!AtK$l-Oqxg58l2pHFjKHbxMDS?h@zcL@+x&rB4I zFF^T{E~Yg+!@#p7mdFzRIt*u0D0PbT0pJA8v+sQvzBRyRj=k?;WpeZU`)uT3a?pqe z@tmI4_X59)2Qh*Crmjm8$xqAt%F0UeLtM(_2{vKQn=+-0Dw%PYa267DS=qFMO;&C# z0ySceG7ce!VBi$nd6h#1e+|25+@rR; z4er`VJLXgTiaf?VTH?nW+eMC>A)ae@pK~_oCHD8j8Z+~pvd%^mWjynovaUi+Tx2eW zl0E9+3f@sOIL*OF{}%a$ldQABJ?bFTEDr9JREFeKurf^UNn-`os}h9Ms(yq8>#n65 zj0VH92v^4I_{J`)TkO_(lVB2Ip8}}NSxik^mJt)5eYbFQ;IbCG#o{fd%9^sTpQ^IZ zr7bhAAUyywfSmcDW08w6p3Z%t$@G0qDTC=Z_Fo^*E;;G@o97YxY!`^11fFI@9Pb%| zxPj~UB7L9{k((|-dZV_g>m^|2b+VJcjkI~}16a6M!c8m(!jJ|_Yax@8K8gDu{@vpZ zjDPny4CCKCc$GIE4lx0-h#htpJ&^kzHaaUF0TO3h!FNjqGx$EQT^xzpg*1sR&%X{$ z8IG^cav+WJ~Sqg^8) zw6_Tc?MhMfUM{{UX2qq$HUYD30S>LLHwz4HO1#``1n>+oP{)u=0(b^d+j&SP06c@+ znF%DL0G`2`_yQzxb|I25BP3pyAyHW_+o+x|0AjF+u9Dm%}pY}|O+gi+b~Mr9WmFT2pFjEu?vd%=IC zHmOCkuV`we86>E;szqUzaefgL=n8FiU?YO&a)cD);qIU3_~%WiGf8h6asff198$(I z55GctcMsuz>>`lDMHbD$-u8Kh@d=J9QTl&F&RF&N(O2v9Y4v&7)pp&_;q#N#=jqk@ z{6zJ6TJia*>hl|4t&N5q;WC;K4?+`2j?6r90@{&$3^;ESZ2A9``hwK zMoFRaq`Vp5nM7y_{;K`XHSk}6_`{C<&b3(%j32&}%Xb|44*P}cey6Wr*PUg*uJ7;H z4KJ@>?>ftVy}Q3(yUwOxvWK+w?%WX^CI%Gh1|FZDadi5}aiRZvd(Y;3U>qDco*i%O z6=RD9@y4-R97yaEM|IP8FDzC=9pH4&4FrSmW}C1I{QU+XeEYhxWtfoRA)h5LLRh$jE94x^n@Dod9ng~He3QU z9U2yZW>QGa3ZRL@XAkVn0yJ4FoKSs^LaNWbhZ+{3=}=PSbpSMhU5f$Gj3E)^*b8+^ z04{3?@{#i$O3IPIJy!slep>oZ7&>xXze zF6%Q$h3m(bWEr4|d68z;t7baXps)gHA|G^Khv}05H0wMq-8wd#sQ^H=(oF~X_OCja zObtUqX3BR>Ecq^&az7u35k3b9V{t|- zG>zk{96=EjAje&__qlwy=NCgVdoym!;FB2GB+?Mk3W+;Ko-icyagUc(W5u$l@XkXn z;*Jbq%7)O2A*w;AJU{3eUP{F3m{I89JFjEdD11m1|^pGI7(i?Dmiv;3!5p9sl^5lz0@V5GjNs) zk{L22vj&%U5wUp}t_6%rfa1QS#1KU1GWe35=)d+dG+!7RE+Ks;2auEUjp}B1CJ11@r%#`T0fO!`KmacT7<(Xq`MyqkOFnAj`HUXPBeNG#9;4;KN@56m z>M+oZ$`u5^B8VRXwRVy~Ghva<5!O#Hve|?FVz9k~2bpU^^@2Gi`z?k~Y>K;}XB>BB zg~hzW8Wf24L6tQjydI2;Wy85TY+zbgnOJiSJ#Qi_p(Y5hZ~fsaDv;==4U8qYWaxMC z27oXi@9U%8e6)v>dHwZf+?KIxRqXqUMrHNsA|INAePSNr7CH>a%pMJo=ff1w=PPXw z)|9Mmgrl&J0BbRV7L5QLeTHXbEsjDpx)yAo*2u@BLLR8N8)RTTJ+Nyr;sEOVvr&8k z!PwW|ln;YHz-jbeyrUrg-J-}WpetC22@UZN>=c%9MKokr;WA(}N48@}Pt4nvfx|oi zqa6lD$Ggl(PxKPNC#VVCI|z?gA#7!E_u(79pfLKaWPn*2WF-SQN`%?4MlYi)4`HJ# z4q-wAP#mkXdjM#T40fqKRx;wCTa1rj{&7}sLU4HyG9N#!u}lQ!9mxP=OX8tOk!`UU zAon3_FvIX0J|DqeDFSjM>7K}7$GWf!c%30=d6_`1$qan1=5-_<)yMM|)o>C+;Lm8l zNvuNik5HWv{lg&H;gVz{8piX(D_G8Gc@m4tg)&@7&5BkbqFqU=%;AP{67%>ZR-yXl3 z$oKFwEbH^}i|YfrhTV<7%!jL#yzYhi$mUsHHh?r|_U zW@|XG_2Mf%F&U`r1u8=pK2lkG0ah?sdx2k0bXwiOD(~Ysv&1<&QK^Ci@|o?s-@PhE zW$$2!AL;EJ&pq71*sP_?sJtFaIWQ_XSv3eLCg(Yi&vPD>k?t>ZIA1H0Q}&drXt*{Hg~*52g}iO+d;=0ebalYF(n#r3#20_=>Sdy@rS;>`^Zwx96zm z;i%{GQP16F8q8#>qaJWn-J>4d^#HEJH+~Mc$!B{H_jufBmfiRp18)4VR^%9iKdc-7 zGG-&DWcc*=d*kpeGk2{3B+N00YMhGxg?paroUdlw!K?Yi215h#~E zzn6C@_K=RquyU93qThH;nQ=R-X55DkA6*(`K`z_mt6;|Mc1_vbJ~QsUMf$aWL8fdN ziLM#9#xd2Jtg)1kP1Y1!u$3ljY|5s^l#TC5uYy@N)$A27f=#rC-Q=pgfpY|;&LZG| zorP2G5t{c17JbASd&APpj<4Uh8Mgb{G{fHeS~0_R7v|Ehy`D|c5c|wpV7m(}W_Hzb z$--HhT)PXV)gxJ8@W?AOx&8uVeh!par<_*;lYHv636l&2Ci$s4yRQS1W(7_XdHq01 zMFDeC>1FdLoY`fCb0UW1MXX&Sfh*j=$vsP{mr}SVAy_Sxdl- zPc8#9KG_Rq^efCF)Z%UVMX<$z{@sI^bPWD9pnvyppG9Q#I`rrs+~OllO%s<~5AL{d z(snku#~sE(f`kEpl(1?=kU_f zQga3qEL6g?+txS0vc9d~C6j#XXoC0HX)dX$YyMfy_GUZV>3ad%aohTOsGG1lBjW%F zimtt=M7XTCC(uheKtD4G8ahI57AI4rB@P{9pE@26sT!2E8K882ZUOOVme3W%wc((3 z2y-GqYCxWqU&7w+dfO8~T3ncPc;-w0gvs1ZUiWzq2N-Po3Qc2{f%V5t<7BE^8!87_ z{E%lJ;+FJIcVm0f96WnHW6*+oF96NX+@su3RdLOf8_aA;(nHjr} z9LA56haXnya}CuKjI$e-v-^fBQs;O7>-NN{fzK|7Ke8M+XHjaH`wV_$X}CWJ_t+Q- zW+txjm;-{bVf!2{(*KfxdqS{^Q-@a|Tqe#{5bVN}fR8{2&cY?m(NjMT`LL27FZ}qP zhfTP^5@X{mywyPte!24N)Q|50AHI^|QtDC%EY`o&Y2rh!iC4A)>UsAPCzewe!j5II zfka+YLgTGGI*8?jZy&9mCtOjwiYew;H+xbJy zOvQ+Z3tT26sc@ns4-pzd3ZRq7YSQEt19u9?&URcl~|*4r9r;n5le=N0Ai>DBC#Jh;is?#Vp%sO~e_ zK2`R*u|TzM3-;vT++Km;$1n4%Iml%ACUZ(UuHa?9)-w{&vIjR+8Ss7+n7Er!4ULDP zF)CAtIXqw;u?r!GjhnmU5>(?7^o>hk#|6Y^X9?uIY?g4!Kl3cX&%RC%dzk`kOjZMC z&o%4%*El?!uV~xZ%vr8%+f;wsuw9<9Z9GgIHyP{x42|MIkG0;xcQEJ2-Fb}v4Im5` z!=%V#RU4uQ>{~v0LbViBQ^QWLLCHBU69nQQoqieaRfPzthIeTg7*r35CsRlO{@0@_ zU4nlAxbo=zE$b8WPK?`+z8JseVIa=JN*Ks%5&v<^ImCaIs%@Y@jI%J8o_IZjKOC0% zGw#D#D4_Fpur0iNpogZ?GH@BH((|MBns=ciAr1B)|k_{j1$hR6RPfga961@v$h zdVwCd6zPe7K|l|T1Kei444_8^;IP0B;5-DtVF4eW06ShM0FFmux!fQ=dTmls01IT; zrf6uXSt-qDTrl%ZD&@0AXyAH_A$5?gHoA^BfU<-3s9|sXuC0|KtMWv^wP45JRTtE# zfqStF%$Co8!6Xh9Io1(^$!sYoNFUc!Pw#bcuLw*Cc|i@@778Gfu!5r++*MEj%W``s zuR%_U7zy2s=Q(3@l>q_64FHU7&>Ls;y97SQag+fqSLyF@%rq87=8@6pzYpW5m;t!G z(nXvt*)d{d5dTK%r6-58*f?1TJ|9CM$X`T+CG?9s7#8VYirr%k!HZ)NoyQEfhWC-! z9N@@#arz-KUExgm{=PC2D$mO{ajC-Ne2yl_!34qMBQW6NYvxsI4nz%Gs0O`5mtX>R z4N(ydi)m|c%1}C92<))lfgBmvpgXR}#Zq7w0|5jZaO7TN{|jGh;8GGY>DO11etjkB z*H@B00K`n@a8z193(}9%$2s5xcNY%cemwM zc?MTZ=xy{vAS1LJt>p#ISk3hDYNEFE&(pR+)3j~yELG&szC7|^`82W5k33vHQS2K8 zW;DH1wS{#XK)tS*tS!|(br3g*5M9~Q-K(Gjdm8t;npGnORO>nnky+~M=`1}}>bXSd ztJ2ExWT!Lk76kJGQL^i%IQ>O8LPQ%lAJK|pEcL)Duwv}OrDv2F`)}z%B}QYd*A?`) z&At)fO_cwTC}1H(%)mXe+7*Ynat%PIn0_unldJIE&qcbi&$$KSFLvpnrrEBU!;P~* z5O&QD+cm>wNt2YhRYO385}eG%_?5>HH8o(x%HHMz35kgvl}&MC#7dKfMAXOvHt5P4K)x$%=`bs- zlfNU6$1{wdqIeuuhz)jThEiBUOB|GL6LCFd0B+Sp+3C;FM2=-sHL*6w&-XVG??e+} zap$aTV)(t92sBs#mPfUnh#Qx{gv>{ni}4(B-tq_$Gh7&>?5vvW!ul^szri9T&mg7^ zZ?5c!%Dp;K9q}Q80VB^W&S!C%|=?i!D2tUc6gUQ3y2@`8cV@z?7zp|_` zud#3wq!W`rCm$1Xi^bn+9nHeGxh+)B{2p?PDW+ftTuj1csiN9AO!8vL)MZ5a+Akhj zZTp*p+YcbJv_G`%7eS_7BmM0MIX0#J;aRmG=bv)9e9!g+F2Qu??;M{K!85RlCD~x* zfS4K}HVl$P32qq3b8V%%R9KwPf-=WaTm5BI8`yLNQ{Zc35d%R=qDAmz~mM5EYPFG$5n1Ke&0Qy?K-hdVSA&a?o z;j8{NMz*>R89EF@N))6v}s;d&-{dHTv z8@hDtE;UgsSDG+Zk}ri&X=}JvC5>~&C*igG4)?we-7eYp9e^8NR+vGHtVM79;87@( z-wolRnJPrBJcd`CR7Lt%xPj`nzEVD|+xl%iU$@F}wu%bND~^T}_%R?MU<8JL(!2)e zTl*kF!Lh|oQ?0E>hXOV~MCSlVE~js_clsJA-knF7zW)fOS5Dt+ZsNWTiwrw)-^P6i zgwvh4M$gcxt?F{po!gO$(K2ClU=xgOx)zzPaJq1m}Z@+5xbl=>+t<= zDja4+u&ggp^OveMKtpU*qoVeQ9-K!dz-5!Qx`>YA0#X3PIqTvD6j1^=rYiD$HxoDi z1cC0i1iDRvBZ=QoX#1GVw)J;!8)92(^TEDVaYJ`iII=39{&aU$99MQ(07p=+3;9Dn z^E7|YUh$d!ueHNSp#RD5O8MOFQg1Wv6);6?>uc~lGk=79!gq3j6?4Tm zcv994S%^D-nTKEEhOB19nK&kh_mAF1Ec7{5t?tbwiI(<^qB^tt4PQ)Q4T+t~Ix|4b zg&y=IZ05K}{3&#v<0HsU0WE}?>YtOT8TZ|Q96W2`K-P#`Z*bp@yF(3Yr64-;BX`f-C_=0gWA@vCe5{f5&@A&M}}-(`b$d&8AOX>0ZA>_gS##jf7&PvNGj1C} zrlB&IjLyE>kf$>*<_LcJEpGT@Zriw-7dIl(&?N6Fnx5weH5cRS{=D}xy^`K$&nmp9>p^`q+4Gqc$k zX|u7&>h?m10M4b)#KfJII|B#W7J*-jJt?NRPoP8Wv9Z~uS^jG7o5l{gRl!j^Tr|aP3?*#WD3mJcVMR7+TYRdND!IVr}anR=TQ&%oDbv6 zr01&vI|5&iwUG@|vOSAg{T^m1AKT%6+x9?Z>({MIaQo8Ng5F6*ht7MCPxPVr%g4$V7`rHOqGYs`vN8*?h&m09#Rx_Hw$0GXH7mh0P zX7eIw`c~+4S%`=T9MDH=8X|vAoB(bvs7@o)O8+m!F4LRQE@s$U@|Ib;Wgd}6+Ikyw z(Jjyg4e{uM5eFz4B?%iNF*U#{jFUdfXpFIp4|5Y4E2ep0Zg40MYYvRP3J?H~oe6?@ z@V7Q*J~gt4Nkira(-cvVA<8+BUy#@M=m_6%5YiXBEOw11$F)H>HcjY1D?Z|_1Oa^=bF%b^!A>@R7>lg)aRuP}+ z*&C<^Xnj&e5C1@ziISyO@ep);B@f|ousnpxWtE43`@On6WF-SxmNqxc!+SXCg5|q4Ir@|bAwGO~ zkf4U7uV$BqaP0`+NwZfbkd?9{$gs#G>(;5k&NSn^!2!WYvp+R{O#{NSmI%*S@DH~u zr=5A`!PLO{|FU_`yl@^4siT>wzMl_<60ieq!akyh~bd11(&L7-n^CLnI#k!;PXz_ATNWok*-R#Ar|Pi z@N)+TUu$uxW5Zti)M7<@*1}z*u~9kjb4laHqp$11%5JuC7SuI2%BaDYohtP5=5MBM;&t4-?AeH|XuuB^U+ zz>^|I;T09jii&wD@x85FN-c`9lmI@DWho_CHmyBUt+i|o!6i;CYY6^su!i_$Wi44e zNzdYmq1NfH71=7Nc{M|A;QTbIwh2882YYbS)g*mI!Y)u9YVtn9gMu(f7|Etty009` zP@K4U)MPCltZLbDt9|Nih!V53^cdn(Hn;OfyWiN6uus?SH{O=G_=X2UZIU;~qf!G_ z)x%14jaQ^!j5sJLwA}Ec*nlP@qz0^DJ!$~`V&&@$q>tgz(SDMz5bg%;K_&(D0>7{; z_J-NtB-9}2rAJM3s-&0SjP;0wm4)~S){rha=_l)qo+ZtH0n#LaSxf5%v^y3K;KEq2 z##W$+u zMz9B%Ovaf*YnORH>ixyODtj|-%hpm1H>NoIDq72akLJwit|E`kE-*`wolO^Py4R+Q zkQJvNsngodzC~KQKU-TtG-Fq0YcdPVG2q?_J_i1p9B~uY=a6$P)y{PoA_{_H%@cgePX*vWeNvIAig2iY0)l%G2}-FJE^Ax8QZ1^#?nr z)&9<{?>!){dv3|b%0mOUzeYpwq>-I3QgaS!m!Re)ka=Qiycuw-X(RFPNvCDkM<3=*krFYbKkX<05? z>|J2bY%I+lQ4rbNj=_gp(mIwY!rcHy0qur7Srip8HN^|i<~xu|oAF70(=<1Q;hi$B zf5is=OOSzka5{qEc3~DssYw1|;WRi&ly-aB2yAJo)E6#R z`obmtj$-RD#5~4E>f;~Q$puui3PT17mwEUl3PZ0)VaOD$+j)5T$?3;2s-OJ(5^v8$`A|? zM+Lp)>=f-rc7?#S8daNJc|~E3+%+@qRIDT8W)5rW+(-r?V`Ku>s~~U{qzydR2trlO zwNnlm4t7r~IDXL^+$o%ZIn#JsWV z_oPBFL=8t3W$_JFF_;&!+3OJ^L0UaO+Kg|4PdZx_f*d^sXD{SM_r+zH*Tb(U%0UfSrmAr!0dl1BUv@9YeZ{uMK|7J3!mklRgnPYL{FjyCUeUC!|FUD^`wW@OJ(#iYvKbdWVrOP>ZuKnte+!HB z!w3f)EP%tSawr{iFXsTYe5$F&MqGL!-XRKl28T_uI2aBJDppsz4MPZ7 z6fAce)|LpeC|K@jY^v)WYm7{Acd&Obgzg&T9gMwgt@I9drXZ-LcQ9|6cd!7# zU-`(2AgD*#9Ur`dx$J8P+ezu%i{s9g<`5oWB&82953IEG4(5TTgC!R?0s60VsCESq?2Ae+GEDLa{U z;mM)7r)9fGRB-HbM=Lh*!-)!xZyp}NCJrx;3XWT;qAi`r=IgZ|s5C*Wtg;LMtT$4*Sc!9IOI9H=nf;w@cKfunLQ$)U)QvyuZG)4@QD6k*vudL!(lUT=nsg^4k-IWVzb9cUWes}&<7h7yUP-~L9r3g z9gYM0<6>Kfk-c%TONWtnIA>%DWn64;SzPSpEa8*C0JQO|$r4_pQLyh{WeHfYOtPeU z0^18|lj<7ra#p|hV_qtxaHO)nZILzD_wg27?g#lkekFH@y>fL}5ZA}MCC2KNxJ#(E z-m=OP#PjjJd~?9Q!U62D!S|eXk|By{whm&eX)cmS6RZjVhM*=S;8tySk)!`z)?u6 zf}>X^IQrr$OE_07;hsBI1xIgq!O_8JRdBQ_IC@UiB*=c$`W2*EaB-@mT<0E!t+1BdP{i2-x7|l+9j;A zgx42KIJU|X&J|0zYn3Iu@ma#EE@71=yv|s{W2-FTT(N`)SFM-d_$=Ws>#HEtRS@dy z3WWN^DoZ$5EaBv;F5!*O5>{^stG9&L*)8D^rH=ZYoVy~+~a_$*;naJ0%2US}-f zv#TuOT(N``tLo(+1WR~r2jTqZ)p!X%>|4V99IfzGi>mfLgKs|gIuD`q>?%umby>o# zAwp|zRo9d5i>mhgs~%|cH62y$S7P1R=PX{N%u{ME*OLk%xl)9FMqE*q{(l-l(>JMj zt3rr-r>#|baya*<^%RHSo+{F>k0QSNEP|G*BK`Z(EHEllHc-2l?q8F~mn)SjrB0cD zn;3&fh%eTy_wS@$>>#GJLfo*nzVeC$vA^XzMy3C2B(F{D z&GMl^|B^PFi}W9cIlML1ruF4UWuZ}<)Ui8vAbK_8kf-k($wE@w6Ag7k&Fpt}CiOUu zNF_dLs-d?CyT@_I<)<^Puhg>?BIr|wHgb$@hkMf7Q(NkyAspiTm@3lSQm(DrddxWU zHuClazlJm-d}*$>KSh<4t9a-%g0I)PyV9-qj^rUfjXr*DG*gJ=T{j1us}e=^^g~fZ zAtEa4S#oTy!?~I`ilE9IQY)GqMVJ~61Rut3)L-M@B@P~3`BKlQ^!8EmC`jKo8hhni zR2D|$k<(M=L_CPnUd$>vpaa)Dsfrv^@|Y^puMZ*MI~uyV9BAqF*N3=E=v0-VxG!!N z#16*VZR;(0us!kd*S7TJFq4+DW1#F9IMaGF1(}OEq5vQ7zAuU>Fkz9^(UIj3*7!9p z`tYGB){#+JUC(l*s}qodd_d3Inu;spw{P}4Z%-8Y+<>}}-{!)2Mb-d?pha6q6Xw{c ztj1Il$~!fJ^)-4(C+w0=oVh}pjdXu1q285o<`WfbUMy|xG5zua1p&Ty#71=IUtb%| zTr_WaHxb(%PrHaWS1v!U!vprIgw2(56Y_2u0BsUp371e9Sm7gQHoF-y-pf*dN+ z6I%MeIj>8od+-#E2!rUMMqERVH;NCt3q|Hrlqq)>JD$RhN6L5wLfbpjh`}tqcd_S% z2wT2)o`WWO>B(W_r9%O~{mR@0r75$o$lYnJ&`WM3`tS!0>1D3Szk<6{$D)m>Zrlaq zrGGbUn|67=doNLCh^CRpmsgCOW?bGl7=EuMJH@E#% zN2OnEkcXIt2tU5E;JAI_OQ-(m;J1JMD_{7r@`*$Ci4_G1(X04n_TBd*0Qv^^kdwzq z4?6gF$;mn0yO<~BTzlVQ-bD7h@y`vpL&+lNF6POiR6Oh~=B>`ZI*1B)JCsoK+WQvC zp%{s`!M)d6q?WuX?j*M#$Q_D1|LR~Kcb1l3y7em`|J569dp5ZDJERtKMXGb?^J*zi zklb?fkvuS`PrLKxgt`%fY9_Brz>0n2EabIK>WKr}x2lVfzas(Z*34%QJg$mON^Mn> zGZ%(LPbH-UP-#J~I&wcyon^0#5vpB!!(ThnFx8S`;ay)rs?iy#|5`6Ab zbs@e_uDp;NR~2PgJ)NaTzI@3N+Rsmy&F_81xYRp**ROx@{G}u2(C5|eo{r|V?i<&g z`D5o}$DrDvcC0678L7qBjBif@vo7Zp=Hpk78Qby_b% z`XI8ZlcokmgNoLeTIS0MP<2k$-YLfsX31u;$U=9PLh=!JyISHrYRi{+?_l6Cq>D3A zxFR3#^+|P3f9k8=PunAm3+94jQKx<#pPhVjOOg8pIY+>sy2CVZ`6_bn%MgC{8vE=% z`>b&mHmT2IuTh}(qfRlY$d67moQwA%5F;3&m&?5%cjt1?=$pth?z~Y~aB%Fl4s&NN z53m#M9M64bw)iK^gE^ds6z@@vandL1_8`4IQHF3_;4_ee#yEzq;xmTN=UD=0_sk9R zS|`Dyt*WSp$iiahaFJ_~mB_k|1j$sbwuBVU{AP zXG2ID*)WnQ8$l9hqezl$4U%TI7D+2xha}C$kPKz(kql?&AsNZWk&I>&NY-TMBUzhW zfMi{EA(F9-kgU%#B!Boo;rlJm1SA-N#C7|Dg%o5?o>VsMZ+ghSe=_x;2i zg_1NRi6n_7NhE1X(vl>VWJr=>Nk$|Ym1K=1Yb9AH$(SVTB{@%$aY-g5IbV_sB)L!$ zk|dKPm*gTzCM9{3Bo|BaW=`_J&`wM0np`X_oU8b_+BWZpm^b3oqB^vUw9M;7uY54XX#4m004S=~5UAR{GhM05AprN^D|DL|X~ZDqH7TUk00bUTncwhP#Yqzm0o z@t7^)%D^9WBBNP;P)9uF6l>l!9{yhPt{Tt4xU*2tQXuP_C@fGL z7h?|4eA&EN+P8<_9o&>P`b1U`^6W^3Y)F_{m2Tq@Mca~3p zVKn5y$Q-X8B!@Rw-Uo|m9b$g@su1muoM@lSaqqvR zv2AWre9f~Gkqdt=ci%(q9Ac?wzS(5n0(sY!<5^%F)OB-rA=hT}JWD+q^NA*xuXSPU zM|{J{HDosUQ}Ortg6;6AK3eA*nc|urslxoJ+Nx|7v>7k)%(kD+wb}OXd4fFBX4|g0 zye6yRibP{(UE^ea?Bd$&lV>g{ay(_W{rg-Sus!z*H2aD@xjUYPAO_S6jl%!0AlLY| z2nDqW9dmI1=1b0@iJ#3qUOEljFq!kH3|B(#lfpLP;EJ=XPnc$~um*wUZpENxIAJJk z5&@=z-+XJJ)%~Hk}w2Rm3BG-6rgMxw* zjG{-eY3!QAJ3T#1Q91n4ve$)ZRvT}X_qYYF^>~ji$OFYTbfTlA~=HIb&WU1FHD8d&* z3VMl2_7ccXmrYYOES8w;V0MW~BtTdTKhPnlRYTy|zZ*B^K8B$2N{1lC5Hv6ZHS%B1 z5QOEr#A*u5)r1`e0<`E$ksjKoAp@Bb`M6_ZoC>sY_GH-QsK8&oo@F^N738M>9dx2M zDar%W;I+3wPi7+!JE4J!Mmlux2)37)_x+J0G}1Zk?C*H*$h~p218h$d{`SC$Jn}D5 z>QZbLxElCI%S|7mOK%6xG4>0(tv7;{y8lsN{$tT}9i{n}<>8x}MrJhH?oaD6(&ksb zd{j;AQ4=kHwEGhIi-Kmu(XOX_6{y6C_=S3d8_u|G<78gU(mG^x_T7d&oq2JCrI2rN z!yj|o#?8FA9${!4v#V%&uIC3BWi+Hs+WhL5(2z-7(6tF9?_Qhd_vC%V=6RSVbVO}c z8Kkw^I9pYQOh_QL@#Gx`ZGCV{QG7iGVuLrJwdv&w6wI8&gfD5iu9|{YB-zJm|RMQ_sw1qYytECuE2*$Rs^4-5|0#>*13FAKW1e;_)P(NQ)iOPM>?lZ zpFZ8%-_h?#_}oY%M<9L{zPkK#0r|MAlnY}=Qi~zr<;9RS$={wu6lO8iSd?%36r)Et zTE`|_pkNO~`-++nGB&fMZ1N@*+aU%AY*By&;_v{>eTWj-Cp}8YyJ|f5a6%X&Z!R06 z6!(Q;?zv|izF6YrEfl=e5Wd=?lqGApFwoGn_9&p?Y0am^0F#f5l!l6Ft!T94y(4kV ziD!IJo=y`befc?GmZ6O@3NsR%0*I~5b$DAKl8XspIGj?TCw zM7)u#Ed9k=>{l&5{6*Vh;ZdQ?0S-L-c-LeReH+`#ztM!GLkIs2(Izy zk+mwa6Jp`ZQf=!=2#1_`Cb00PEJk13SerN?g$tDIp~QGQav!H!Y>)nU=0~JtMJniZ zLsEn{mOCwL&6r>sIGtJH_7r5>Ux{=>_VuHhW!t>=v5)uv$5)MJsIc|b{6IzIgSvb@ zYnC9ZAP>XpnV*EqGt{|JPE!Diw#=MxH$g#{1+tA zD7KG25?~kf%-v1_rhOH|tY{JPc(AxV zXhk^yd27Z!>fi&9Ie9?MBYDlVcNJMkts_~T0+|_TJY>L)SL8L57FmO8W~|7dyQLzF zrKUT}eaI6N;_8eefyd*b71g8#arwJJz8NilKs+!}{)ovplhv?O0s`xq-QUB&wjoOh zuSitvMtHbgfG9)q=S=&?47Wd@Z|mfzce=KmGzM2&IR6Zli%?C2Q>2TIS}!v!IE9dAab1S$=SX?+~ed*&oI{^$5zW}=wZ4`Cdg zY5kz);^$EO0F+Cfc|aHGSDR3+AA9H#WpeZULyxHRgE6+<-eG`N5n5Lk|Ecs&7qfX( zV{8B8H|&ueCv?&#l4JYlChdAHZDrJ6p0^`sZuRM&qSVFeJ~T&}eKpVaI`#g?}m38I?LN zW7B{~Ov%NqB_@|boGsnXts+3c#BQ^K2-iIL$wyTB%P#i~C?>;TSq=OQ1PYKvZNp#o zC?*9dOBztn(?>iJ7I{scsO|*vM7zj=soGZHug0>MO%*vVklP9~RgEDoj@xG3-ExJz ze#SinNS>P3*OSHoY$I*%b$ICA4K5#}BqJ>-Se6kMR4X$eKH5Fw-ivn~lM6&tUR60G zEU4aF`H(Z?9z*SIMfwt7ldoq0l6g)Qd651&P-nWW--TgUQ0-Z$Rt=XHXeS!!*CC^7 z>+1&txq|dtO)kHoubf;~rW{vA`fXqjZTI+!y$$1B4Izesk)6wD!;TJ*YtQVV+x(If zs{0B%7TP?osu?IpS;pMX2SyHmUXNjkC~WI62`DuCKwzPXi`>OHxq?WQCSW`@^e@~< zX>FCqO+j8*M1L@oG0p=hYD~X^CSzL+R-eWfg)hfPXm-j^#^w*0aV!_kae*{hnc! z)xvylxiGo&;S3fnBs75RRzo#`-{mgD0v)^w0$`Q?b`+Th?|DSY>v1SXO9IXl`4PZ_ zkY>pEfSdr3b7joB_`|TRW4@|yaCdh;@{fP^rCdo znTy(A!jakCmA#8;TUU$DE-?v zZ*z)R5~o=_#&UoFDw{boc4JmEU(xq<=yq}e6uj?1HbgE~A;6>|xn^6D)fsi8%xFn@ zE-8EAcW)rqY%J0*L#Ub-@~C9}b0Dweg7iDkv=3o}bFq+m(P5t|97 z2uNa=1^;;OUt!SQwq9~_z8Si0eE{1N3!i$pKx2ENsnJn0(BXCWeHW|Ag)l5a(oVlv zM;d1uNyu1cx2-9Uv7JTGqd}_GL-Y|CQv`|l1Vs>lk5Odq`VBOB6!~B~TpUvbXsriP zF(@G-C?@fyr*K1lVg%ptdYbHjaXHdtr?<&Z1D2WoArJ*>8fHLlDG6VK=IP*Je0+-B z&f%q{rREIAOGcVUv8}Jmxp&vgG~7CxU?ME9N~9*(R?}`HF1Z`@lEYJDHe$L?0oM#H zf!o&C<}D13rdD@oUQ{MThxGOYybpk45n2LFuNZiZWQw!^hcQN64Y#ekdF=2;cZ1$I zqpuXb!UAdY`H!P#yStC=66`E@1Wit*$vuPE+Ma~el0j_s4kAFWpvXalr-ksInb>ln3!KFumXR)UfSEcWUYY4W8vhB$xR#1p~QfB|{HPJ~lUgai6sAg7uL07dw*UF0xY(oO)yAoYzD<0EZ~LFy1I^A6`? zd_lDoPh+w2Z>C%(t|g~P|Fn)N>>(puD;r|^ibd@uD34lOP{lde_)YEUoFo1z(66ylA zReA9giob&5MqjamVt)EB20g7&{8l{u{Gg{@6mLTDw+21!p?D*TPY-(9NAX)w{QeIO zXnBC*A3^blQQY718j3fd_?|&ehbV5N_}2$LT}SboQT$&AJ>5X@#VCGo(9;o$--O~v z20b04coM~*8}xL7;)_uH%%G>6D9%y*XM>(@p%{1_b8^trDT=`~&EF4tdI-fAqWIg@ z(-U248AkC1tU@yf4wa)0I>0D6Wh_uJu4Sm zX#M%Di+g}o6^Wf;)y20bfmmn?l*gaelOlYW6_kM2gA&+`-cJ_kiwR~8-`U3Z3Og=b zLfZUwjqjq487=NRFyk&^6#ho?xGFODlJ4jkeS@3>ufv_<*rRG%Ukf3Kc@bAg2+i7d zveLieL7vSSh=NhaF%1v`7BZ=698N2+(O%qS%xIB*Yjj#)Bi9yu;M6yog3&2AQNI47D$G+)JPPuCS{3OBJccCdw!S70>}bNmFd`2IXQqucBCYR3lkA;w z+n56lsVT!#AlOv zh>|Eor9o^S%fuNXxstr}BTSw#+nhp(P}<8ffd&W);wVW~o4@*(?tA$JgeA zEZ>;ci=@p9p99r_;Jq0pQ>LqzKKH0f54M0!0{Om-2h594Jc^42&zw1lANPOuQMp*W z?3W2qVXu2Tfb(JtZoAZ*C-O2S^TQi?*D{uGMbZ6{4n?YUO3mf9NuWyFP$;xZ5h&0o zY?fn1q5!Ed0I>R*q^!&74$)R0YGN|DV0LfzsnD&jfGX`u%>p z`bSpV65&>%?0ib3rL*g(I~~oS+qPsmcE%#Z?0R>z6Yn{kv)+;pN3C?cnmrn;jU*xy zW4FN&Cpd{RII%-;#snvri4$ZSGX@M1V1pbC7L36rIN$`6(F7Cid7k&yPk(CJ&V*!u zv~}EH-CMV+?*GsGKJW7;CN>d1kUj*&bUe^k=Pa)>8uGY!p!ejOvz8C=NC$fqiNuhl zIM%_aV9WcgD$=jCyBa-_P(vS7< zCbYfj*#5jtcFaTbA+sMWj20JZEZ+hOpW-5Kptp*}!A#Z_9OVo|ix3k+Ap?0q8#7NE z)>n20FcyF#srZQ?NSQH_eO?u`z4x$4YxJCjJlX+)w7fFOyB5mm7&bT&gqaQs84Yw- zqF`O(cMy?+M4)S^hl4>r1S>JV1n~tVm}FfD3X=$bMAub!SE`#3Qdu?-BgM!8z@&K; z^dnZ4WkrP|#P8;9_gp)@i8+A^BkQ8L$esvRx`3>lKJ|b~uY&~q=og(Vyc~xR1);~H z_)-Seq06_2icR0wg_Q$aFA<`Z%sqvTWRIq3l1*r}u&bef4J&2GWwC=SA~mu|lM@YL zCS_<{KsJ$KRlc6vK#~3eAeVW9nu{<}JriMYQ6(S@BAN^$7-i>t0gX20C5cQ73AAz0 zoVr~^%~QZgs)UwnBO)RV>v7@qK%jWS0DE7FWmct1_8={FL|5eT;TRHO3a_em_=E2T zD2Q8dfSw(EA5{s&^K$q;;inG1Pl)g;e18Ks+$E&{9}d3H1Ise(zU=f@5kRY;{U3bL z{^Q?8(EdkO0`23>jn(+?iPq<|DIy5G5wDv#2TXr;+Ww~i;ar`zS8c8S>DpR76@K^d zoBw5X+FsplukN;2O=MS1WdET}WKVt4F+p9^4G{0G7Z5WK=}yzNhmzxGp>G`M zy`o}VNRI=m_r`!oa!|p})bIA>-Ahjksu6mu8TaZNyk)Px!GnrYkh;&R!ruDy{mS<6 zoh6u=>Vdw+OaB9NaG#SCBPX~IX{gJc1{{)LKt0e`y5tVb4$><`zrK76l#2s>dHQ%8 z1zTQHloPgkQcj3E?|k}xm7atZJKmA8Dz5^W>p)+bQ4jYz0r~FASlr8L(+KoE0m&#N zy3-H$1LgZ3sD>fN^r?pd{R+b8Kzb`ErSBAC(Scr{FV~W>2{z#I3HLfrxM-`YCD@Rv zGjem_3<|hsTBM&`1J=y+SK8!wc8W#x414Eyh(&msdPS%cNdvZ=Sy^pX12DxvJvu`b zin2deY*b?VVAMvnaoV2|>C_E)ABMtAk-k7B`h;YObe{Yqb@vku)xAVh%|B6U`F)(7 zkU=5>CQ3j+6-^y24gO1O1fU2erv05T06luk4)!GsD4gYug!5bVt0yDPgm70j?YmH`+8qYQFTJ`#3Jm_FVHPsr!rbHB0|5|Zu) z7zeonjQ+fZ5?$?FSB^83G5uvKpxmG+$451u%Hh{BI(@e1dW^J2`s4(-fMwR3DC{$s zb>j3ZebLZT8%$v+J76KUhG;z`(Ff@7te4R&DJW}=BwC;$S(cFW zM#~aHsPE6JpD-Gnxf_)6I`8ay=G>@DqwQ5izptVw@*^+ee;OKx&C1)X4qtZ>Xd%g? zhwES;sejIR=-=LEO<|~ow?og7B zMECHPwp{mzlJq2c1WCGboem`#k?2t*>C5%lP?AxJ9!HW?t|x|)j7#(yBpH+I^M;bF zk?6HZG9lNKLrK<3^!Z3~o?Krrl;nJgUWX);a=m^i$vTOC1(IAK*FQ9rw=F3 z7kz_DI&@K%8dSxhi?T6;0w204n=mNWp^LKf3^IS{qHNM2i-#`CE-=aJ(Ut6D~Z?q%Psf+(|Z zM)u9B7&N-3w{KQO28=A7eX}Zrrp&bV%_;y)A`|bMRRD4YCfqlxG|XI#CM}>cxnwBY zH>*;kjFI3g_syyia8VKS2GYN8t4n$TD)Wc!cjOYPJ~Gbo{<>MCSBQP)#C^+Lu1QAYbCUUunW6E zl#nz&QNT$nln%xZHYw(~T>AJ)VMucH_UG9hhCn6!(^ zwt!NcB$Pxcg7)kNd-%wMLT7CvyTRU4g<`wG-d=?gyTRU5g_JdQTY&Bjy0uwu9Sm4%Ol(hjg^AK{z!rq27(%L3roR)boY?5H4G7AJ@ek&UG=xb1mQKa_Qh*0y zzV=S9NWYG9#^5p|L(ECB!9+q>(gKQ;_lP1vq7=k6CqZE+){j8txa}24ks44Ep-zdK zh!desiE3aYZS?mrtz0I&1Z1>DVwHz9h&AeX3XVHlLC9gx&<;qi6tZZ2QpB$TKKYC4g9fH<)8^0 zwRi6JqMgiH?G@p$Nz=*|TMoD%I3Xxoqy$(oZsiuad$>j5!=S7oR``2J*Bh6n!)Vp= zy{=Us9)8Ee!|(Wm06W~6gA)~cyT^?=2NX$GVtaczjGi9FL|(V9G#fdusuA@lmbc~2 zX5irkn4}Wf#&I?YU>n=a6l^m=YhehcaGX)LbZJFiwsYR9TDo1nkfZagv6*+==mZN` zTI2%ef;Bi=y0UdgFEB;!yTma^CdOWb*Pf)ob4RStHP(8CuL1&P5_jbbXs;xh0?Q4D zD~_}16ND%`PA!4N5Ih&*C?0~TPLQ@WMn)o~5t=X;pmiM5Ws#gWM>@JCbY`U=C*i3? z84kifs3nq5B2LIByC9!LQk=Yi*M+GbT8i?6 zntT$FL%NwFvMYy8JUpr_E}pj2RLY1Gko z?jYNtJ^ia6R#v57YhBQ>%Bqe2>0jNEcjmkU)3`#!;yZT$7l+lgr|dJIJx(uLBx#gb zI|8EagC>GgoA?d(VDW!nL;M-enOMt`dCpT-IK0y@uED#6i6Vk)lDM#^0Rx=RlOk`4 ztuBCtASq5vD}4-GU<#E2ku<3+MzPzD;ah0oK(K4#7r;vjX2KkhO#d1i@4-AF?BUvU z$#sY>0_Ia1Mbjl*3h=4$1d)paHu2mW4#@A?mNxPB3E#BvPO|iY!Tkye@`-N>45>I*ne>b?suovW@!}`x0rSA_eAipR;d*G;rsU3x9+&H)ugGNA( zuA+)!wQy@EQD6vmm`dHAYkua; z8Sk>5wg<^Z(HyxXz$S?sM{dB8i^jZbZvD0S8mtmM->kVKPwalsqN4_L&mdF)yt;IHyR zIB*P2xLI93s}7)Bz}XP*r@st0WgtX64sq^Yab_g9PLXvLFLh)sA&iDFE||JLG=w;- zZJYLYRo^66=?PV&f9|6`7qT{f_U1itI415h!ht^OA=3)H-Pri_O$aw!cjP1JJsXvp zTfFX#hmS5DJHB}EP(Dr%V>ZcBf17EUw8&Z}MWvl) zO8D+bt%C2fgj=`fx0p0<;b5Poq?SC8jUvPQvoU-0L3tR&7OiR!zQp-7hoH} z)$0rJkP=qRw!)MKa#$x0@Zlc_)EVT0HTZSYnnbe+Nd#O*qv8#?G}y+5+j?_;A|b!!d!~kFIVK za^VCbX9xrU--4kC_>?h+tB!r{F*kI7sZGH{Ih}D0#t;Y9gpKE65<)LS$GqIP8?O*| zEwr;%Tl6sx+dJRt1-3vQT8*7b9$6ps+M0{r?YC_=`kK3(>yXfPujr{cxDSFDj?=>n z+^l3_87sDQKaQeYYgz~L*1sStLjVr0sEnR7N2@!@Iq!7OzSG9r+H>Y8G-;Tcz&m@O zfYhHppQ!nZtzO8&;f(N64Z#e^X849>kG6%V<#qJZF@S7dfk(e}2RfVhhrwFyv*tjy zJV3ohs8`sza3?DDY7{M<^}>&%{xVoa=!HB+KDDdl5S8p`%+9LR@b6Hmp7G96spq)U z#p1O5nU|_mp$q%_R%(Pwh3q#jD>ZV48MN3t#%iPMlYxEs=tC-9?5mC)lp#8&BUi_{ z?z%PIvk864O8b=k9{Oq8u?Uw{)$5lvhUlm3w=#Qg4U8&9kZ0s(s|P zhm_UnG5-RIH!l8B#QSypapi8D!i})Lu_(TNm3SEIw~gT<340n?`;osMn+Y&uGm^GjSocj>%zgZUk9_XK@BY<4{IbHK zWLYN7i+$60Kc+l5ersm)*b3RiFmQz;D;t&^WCs~-l^Lb`84&F^Gum!uG!L!XsP1{Y zMK-~iZPlyQeQ&pL%i%)^fPG*z?GL0{hihpE+y+yYpFqH?#Oe+U99N{jOVfZotI;$o zmANW07V*Ddi62;A;*XXkZshpI+R6WcX(wqN>Yb`@dqNllvUP zYo07~z1v3Uia55!<(R>llOC!N$*xFaWDS3aYM>r@yWIj;M$lxbf%;PkDgjZTV^OKr z=qT7>V$e?(b?W3n@mrjMU z()Yxd+B&VR$8{+sD7Um|<;ff?cajA*$im9SJQNyZ@X-mIPsY0|{3KZbw+D8S?m^-I zH5=p6Gmo;sj5QBAc{B7{_z&^~1?3Dxo41c-;K!kVETHZ@Gd6edfEhc4qlO2J7AH)e zZXuk*TvMxOae^>oI8!ayBYh-lE=MO&i!R z+;!$mEXVaHak;ZcCYi{d`S&5sVeR6(!b^K}G6`l52o(5C79a^%qQzUj_Jn^alq1Ym zdLun@vz#FNh{(`^a$b%UlrufTVmNh8nR}OWlp%e$7}Ww;mnYkMBolnt5gI}~1_wD% zG|VdSgeZ{G1@OK76B5EY9M7st;Mfszv{|)7s`_#h+JDP)E<9lD=M`kpq1{=e?}g{+ zJrqQAaa6{#eKmsgfd;!{5aMC^1q0n9%O!Cqld%ovAN8lq0}_kxWp7{Vq%8HQA`Y&Gb!##*tnV zf`l@KOahEO6cNz5hpXKY6Ok@?qrMWiW%uLy5tKeP2QK=SCsvm;}VpdJTb2bD-8gzzmhSPX!iw3$ zareFVEBmANw%@vOoJ2qzi{SGJl2C7pHg+IReZr!g4oXw*#6B!Eg0Q#ctevKf^xF$D^tFOUh4>io_srA>cTmCi7`|>piJYK472}oU&`fE^dNZEjR zFc3d&(Wrg#6dLwwUD|qHV;P&s+tA$(^3+6k<)cUDzWLEle(a7L9{>I4)RBB_F1_B2 z;l9bo=f3#V+rRmlXCJ@sS#{(Cen=0nd=YaYs@H*pZG60e8i-4z3a_5l8+t8M@>36di{|+J&=#_4&q1W%=L3; zyd!2}Zq4;(&5?ZcKt6te-(y<5AT{G=bS}OANIq)D_?@u>d3q!tpBufNx7J*5#&C0@ zyg7a(pTLt7d`@nryqO+AQAe*gqj)MklBXy)ii7;8N9NXCf5eQL^gy1@nWIOT;*R;O zW74_vkItP@hvrI=t#>V)W&_aOwF^ZC0e&BPXmD_t4#d0pm>Iji=75Datr;mwY}FeBlZB-rV-M3zy+Ja zL_cX1X7~xw??a(QB_c&;K*lu9oShPh3R*7GG7$u1BhlO%j&$s|F^7y3sBCY0{6WVj z@@2%HC$Sab_QQyL#ZcsX5V^h?*-@Q`+d`n4t|%n{D%tKY`rRmwW39p1L9%S*qG4eXc7*szX`>^IBU*nYXZOzcDDWs5jPexgm7AYh9OcI-FG z%dU&982CuOTITU13i1kK9szU|RI&Z*@>251*uXwp#)d>WGBzU0k(aT3uuPEfn~ZHS z=e%s!X*+dnxBhUCmBY0C`V%9p5yqx<9!6O?VO=be#tMpBv5E-w1m4Y|KEVp_E`7e8 z2?A!7mmxF7ODPsFWBX|NSi)LmY|DPFjBVGCbyyax)sC5zRJEXFM1MeCJA7#cDwX~q zz;3>Wmy#)7hIQJA6~R~#9aZ4cPnVZc*G$l6v3S{GbMmrVf1+0>=(D<*V5E*ss~*KW zqbxfw$6TVSlw{lmvm{E1PC)#+$0v9xC|X|nd@ah)V89&lGPM7>j0OLZOAxcEm_VwZ zm#z8@ZRVb_9cGM|-75DC_UgR!U7{-YBm@TWW!XkvJsx-|)91$J6rTvIdDlMrw=~T7s|3gQ zAa_E!1|t@-EtVzNC~Z)k``Q)ro3}gn&N{o(%mSxMvBu&VlMa_|@}|i!6&OtvbFu@I z98bV{n?1o@HZWUM@z@g%3`_6rK_1SkpA(;LkGyq<_;~}T7XDleRWQ!t*s=4(fatq3fF#3? z>9AL%_W=58AN|YHea7)Wr{}vDzV1BVofRQ0`N#1dy+z**&+qhr!RD=fy0BNkGX~qY z_Ulr`CvaZLyrAZMmA7~gJKa0IY5yuX|Gq;oibw}nH%Gx(e6FsyS^XT`l>hhXfj<0A zdINp+@(llCpOLv=MQ`-4O0Vxap;{uB=NziAP>`P<5Loru zzu{TagHhpEXvOKlkab8(06#OL8AMB|BK#&!^9Grfe45bNuZ5j{WB{!(f+uB}uus%qaSA1nZ0n9UuVnyW}eDMHzKwn>viKA^n|xzTHcm>LWJp&2-8{B0s=!LISt~*igTG> zzGzgtr?T+%(oXcNcb=UYNTyK7AM0Tusvjcghp%4YAsmh6p;EsK zhUgV+6}89CM>5&c%y$DOg$3IYu-tA;Z9vQsB8Q%;X;hWOaiSP|KJU}%l zU|PW!P~g}kJvk6DJv4|bB=txN>A^3r2#_JvhAV28##P#S+2{X#n=2gos0(ZJy#w3hq{*rP37`#g`v-8d7cb}?!g(U^g1bB zI00-zyIwG2>eBu52%cHqr!hL49Tz*7M2Iw{XY+sRh?P;2dC(tFi=Lanyxepz9!enDYnAs<|w!)DY4l zN$KENiU(-tS)YTaCXQYy@rz|#{0Gy}d)fSORz`+p^ZrGCZN=AM>B0%lej9Q?QhG-6Kvap$kf8K!6O*nM+lmDf+k5YU zJa;dQh=ghySn2>;jMzSUFYaA#VlX~j408#{wMmdWBR^C1bE%2vf@z9fRrwh(nWCO1JF8&DEKo~KbM-QDqUHT9Y~GnT5G{{?C-fxb?S=jpu%>FORkGe zN8Aa~LD!7@Ox3C3vdj7EdV$s6EOr;pl)6&v?y_RLnr?6JbylvpGPBY4UianI%RR&O zLN7>vhk9vm@AW`4j3#JT_2RgQ(FAR&mo}>UV$+5mWt)U%iC2hsX{N-L&{_>%yG!!eK8@(e_^7M53)Zclo4QB6~`j#YE0u z#KkZ^kZ!i*2GO!^2E8VnQn(`v)lA~bYrV5qVw5<5+Te_o7*+az%1bv0F;4D zj!|O5m0gM9Z!N4!yj7fGtX$#|6XBTiVm-Yq@$vtr5>J$xwur^0WmZ*EdL69_S(dMq zqM}7nqT`O+w~~Xd;E$?u9rdEAsyEch>#OQ!by44Y(W@VXP40=+O)gjS)lKf|CRaAO zpX7$|`)iYX;^l5~Ppq)XJ@H-LElO#qZxqQ6_Q
    Co|H&05 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%0A%w~Pkfyo#&5g@rhR;D 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

    d*(Ao-7^or#Czucqwbk! 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

    l<3`$VHw{`_D}|3)0ayU@ zjfLAz?}qCs{?gHr^}dET)1wB>mTOdY{p)LQQQ6w4Z%Ak zRE3lCU9t{i`PRbav-5G23ckS~&Kbm2okGmCy4A|4I@TXlV*KHBFGq$F!tLE ze>Kz6MI^jb-&^SIC~&9oO=-1S9S+A-(Vh7!2RS1-1ZlmGBA4$kT-?lj z^&D5T`c020%;wB@C209lTr<6^EJ6KXVb`RM$d~SXELL8qV&e}NuHM=mHm29sI&;z_ zRm@mQ4!H!2h?IV`^}G<0D@upt2q-ve@2h@1J6w)wa_Nk9xI&qk{z-8zkBf5~zMt%P zqW0cKDXlSyCw9}$NcicgmIH@2Qv}6n&sNIze(q;mYegX|j|H_4Hu$;JfS+%Dwm2qc zW3C)ZflPZZ`it4Kye3MJzC^D>Nud1P8uH8831Uo>t0#1<@(Iz_f%=L;P})1=U(Iy$ z$dM70O-u}woKB*>@Ba11VT_K8DvKnN4xof2hox=wZ)S?wXk)cDHUp+0a)|9${M&`Q zpCg{EG_KO%L_^}e!s%!rETgScK&yXue$3FuVFu<;6ggWVet(|K$U$T#j${6tV!|KJ zj~ON?(gF?n!U4qi$Ma=|lU4~Y_=G4#`P2C^!;a-hAv`*|`0A|$CZ zpyun?c#rdAMwSLB2sAqAV#wU{Jeg6VMx~|kMw@`;UgyUQfC$DI@>&xbmF|6h%s`>D z<^4eN0i}okAPYmeAGF&AlO_2#tb<}&_+J`+*<(AITS@h@Y$C5m~(DHG=XW7&`6HD z5bm+(+yc}gLXnygVXX`Hap&Fw$eLRqNs^Q)KK|TWfP4YPr%q9zl>CHqZUK2)LMo`0 z41mEs@!VU$pbr*oO2(m7^rUld0h(Bf(@d8r0K${cxdjC+DJxu30u*I<%Ax&WaJ3r_Ylb3)@y-jNph|k`p{H>-JTz$b!n=aSUw+$bZ&x?-U}Nhm&_!<;X~S!!9X{)97s!Nk#w0Hs37w33_Sr6w=@*<&0Rc1~@G7if!2 zd~6rtGjGBj0~1Z zSyc8wCWqJT({|&vhiaptY({7@Dc+c-tzyT-_dD4 zL5B%36BdZp;5*OuG;dQV(E&vV#unkj*HYh}OIJ zY_1P^I2sL)_j;EPj~~8lxBCEw%?d>&AA`tAy7zW@pEV$-vMwm*9FF3BU4(Q=F`=;1 zM$#1N{fGYFCP}@)USAvb$HPIdH#)vLgrmLQ?T=qGgrn1F+9t{msigJQ$p(klCB4l* zttexSFxD}P8k*=o(8VSSl%!6+1Sc34D@utt5VixAm}I)mbvRFc_#`p~Yys3}^0tuh4d0V#f_Q#m1c zARC3s;B^t7J=8n=*VCx%c6P|E>YNZ_>Z|7E80Ct#F$YH?fuheHy3G!;%eSXHuhV!M zxV-JlF`BFlkt2=`W*eOsy6E6d`TU{(dfLiXC?SnFF4;*R1CY(WD9*?G!lB#kpsgK7 z-TpqJRL?almc8N0=x7S>DbyGDsVjcz(9)K`XS#V%jVHqqeYwl)<2e!x$e@8EoaigN zcM~Kd6FV|f@YWdn)qNQWU)!g~`1+x0j_RvL#>Om_eYk!yn(~S5a`~(Sf$|t+;7d3` z-#Apxyo6JciYXs_Msy-;UyOurc6osgvk^%UgKbI?^tTROu{DBxTSCE>#GUpHyYrl+ zOhc4@+X4_l~Xq|OQ8%5v?r0*R1k6SwCFyDz_%7IdisC@U(G;RIJG>SSF z@FsHtZ*+|C+sY*U-l6W;AKH7NwHC4HgwoOX51nyVPI3wq6=4t+`Ak1Jb5+?($B2Yh zkx5|m56@f`LR2n$FEb_pGCw+WVe@vO=8#XLNk6UL>dw91fYZ7>K`N1oB!!HO|Kl!q z0Z28d&QErq5weInkO;{{RKem;4_($w{o9i*n!Jx&-8^Z~9+--O`$2V-I8diBu`XZ) zYiktbpB=j9FrFCfxQOgBYMBUwr1V~5@kNTCA9}zAJ51m+K9;ICO^@7eHs|p6dbb&0 zp2m|pJ8~B_jk-%1TRID?6H0udZr)RHFQxXO35Y5w+4xRwc}#m)-+?hWlE`ya=a*js+=FpWpwEw1>%}<

    h(_Yr;~O+8)a5xQ_vxL3+nfWUbs^moJ8dwTjC@d=l;}g z6|W2h0oobJ3B3Koj+?{H?OSilR<6g1V>RncomYlIFfy2w!g5a99}nHQLmTspx_Yp- zKH2C7^MB#aHA}$N%qk6ts1@Zb%AXEBZ>NTxSG31=ombfYOS@G;nP3eFzMyf*n?LW| z4OrFnv`Vnq68m6oOXFN2ZG&^tIRyy;f>lDuyDUCzr{=vqjn{^QG4=Lp=cc0Br?yob zd4b57Hwdzzxa;Ch>|Zkt%u7BqZ+Nt(RwoIlbO02BQn}mWV|J?8^(zU7$8SFzPWD{2 zt*SOZx2s2-dx#*7l#Jq1?!Nf{?J!y{Z9((gc8%eQ#=YK-KMV)ZY;dxX-XLkKb@cWg zi?DA+Kw6uukLv9B98*TVO#slU$b0T%DQjsw?%%|v7$XuAV-TQFR{DD_-fD-sY$rYg z-fOH@c|GTPok~JRWf=k47|6lid+{GT>1hRsiL3=GSGb&@3?~rJaU=->e3OVZBymkAGgkyBBCX43OjVXry=XL5qJg6WW%X&Dql6l0c=R4o()D?ZMOLVV|!y_rM$dcqcgdTUh~h%$Lu1LXug z2SxP6#VK&xm}X@2zwAP4Hlo@B)0oG{+qHoVgywQI1TNo~18T=IZg>#VOw4+Gsc#GSc{%CN)PP zBW@`NlF)0TO&fped5eF;bLA19fPywIJJ7CBDqgm)#GXH^#|)yUKd8_r#>N+sqX^Kp zAp>5pIAw#JiPX3kHS7i5xr&(}K+HVmGtIsG7cO41^;WQ6Gu!tt+inDd3Fsk3<vlu+K?0#rNvA3YT`>5JH!MRrR=s(NI%>$+I zc2N5_cB!)vR&oj@f|I-=zG<&@e)H~zMs_BE4^o*Ng%@wxT_iZ?2|EdZS6Nx0(h=7}1qK|MNe?>TtY1qJLqi zFzr1rFbYsZw$i_&OHqt5>2vTo>nNO+@9ZMP*rzc^k#$U2MDwmLLLQ0>Aw*@gE)n#* z7th#d5*dpZtqBZlB&B=LUOUWt7yr*wY?+&%8V-c_@jA_WX!w6p@=UYgDTBvA@s3RS zy@f5|pJ+5Be1Dg=DHwpckxGCfZHXV)ZE|#>=%S4)%yAI2|KMI*;6sa-H)KE8)8v}r zks~xZ>6G3dudUWc%w~qjp3g^Ul-IuGtUkQotHek4TCa~ThUtQ}!TE6ebey@+Z}_`Q zFX{D;jE2XnVeQ4TMQD?FYXaIhp+2_TOW>?)hH5TZCjenSzWW@)J_lJ;blF8?41Qwq z$~x%=hsUbCK0v-%8L#Kbh^QLXS7?`A-+b-OybjHuSCE_o!JBmf1~h(h@$MJw2+Yq6 z_BTw4>$iO2z11$o*H2$LN({AmN#jVF*;jL26j?wEiJ@pCtO=i5ymhT{3@e1|t9;C7 zl7I@vqiQ@J^?GaT$qzQmwCHn((z$F_;r`@!9Np*k+VelZ-(&F$i%+~@Ti)Kr9aTFJr;Yczwweab zIit1d5L3%WabLNAj zn7+FBoeK_c8)j1^^fTul=5Oz|oCxD` zAtCwpAVo~y+3Rxh-7aR5E8u_ura7s@!}q!f6|0H4=8KooYY^XGeE9{3kE{-dGs2Nx zuV%0~jR9~{>8tu2w|IiX^Uk#YZ$%wfsYIz`0Z^PuQGT%K58uH1hxRfv7nZ8gl1a=n z=0&tg{;;zoW@mCN%oEMqZT+LYzSSS^){j({H5hwM z2(dmXp;{e|$GjagrOr5`gfc4|?N1jUcfsMUI(P{7kFBkaXYo<(AKTlB_0XPoZ#QBH zf&NXWKZH}ZJ}^LrQN*OnKU;kKUaiw=|IEW|izzW7$>fqKKVN+19?fgQ`05#aFdXn1 zwb#3DIQSnl8XjH`m$Xfv{&dGrs*NgxC6yE4AQ9H0gaI|*C z86jjzi8wUODj$Edc-tLx-$?oTAsnSiueaqRd$n_akVYqJQc?!SW_(yLEagnb8vO0z z27q?$=B8Fpbmd8ub-AM| zF@&0-PWVuif_pAaz1U-#%+Bn6tTal4+9#t-FgCU^#qYJW>BXL2fUuCt0jLyfgHxp1 zuC{wGO?kv>*Bq?SQ94m&hQtyf3DPy}OUq??pQTOKE;w2VLT}Lp>uqL4t=7}`U7EUN zhwGE6XWbT3(L%QNtBFx4#UQ0lCxc$|YP$C7!09OGN%#k47e`)43#0rX2 z^`4w_I$~)1J|D0&_1{j?k?WZ7iT%COTLNW_DY9+P1DF1;aYs&_vC&h(Xl*8^qseXc z4_eyvC{L%yN`NZ}DKH;>l5;rn51zGX7lbX%`w534+j&z+cKoGN)C*3(YQIrwTEp~Ws)ZAV~#|sKm}VUI?NcO zz_u&;;Y-snf+>}jEmqs06$DCi9I}s?y@?r>7GIbvEy+uORD7F=>X9?$D`~t^Ihi8U zz7;QxjdRfOkJ@;ceeTY3&ZUf;d_W1?PT@z--tp9Z?lo92QQ2&TbFLi%@R+4(IL2C< ztTZ*n90BSm#sGSbLhG^HjM2K}B*=#xK#R~GV2_(M3lB;rr_mTFYvD{Z!cu5k^Z1R| z#Qyad^?EbX|rc}E`*dIlvFsU+G^PzRZrhOa;2J!sA(%={_%6zq_BD~k4WGsH97l7l*AjU|gWnP&@S6VnW|U&FJOrp!aL zGHVLLrr;_@DvBAf5&0&%-D=NXy7N}B+Syvv>k(hqk9!<^y4vUT;TuP3ZH?+sh&eV8mD6{(vuc3YxSJn%REXa*4Oq@rij@pNzOP*DogX+rLG5K zDMT)TxuG0!+{N=cOPUNR2-22x79!yDcdzHZx9tmdFLU49_JvEMUHi~V8XV!=i!<&- zDoR;Y26AYG&*nu->$?@YHsmPJ(cU^zDoSQAoRFILO7!BT;~mSz;qk$qYMhu}26PZg zhmhk-mTvA?GI6!{QnV4^9R`Bnnc7CYbm>ILqMHEiy_C(txPfy$17#H@zHIj%z3-#w z<(xB#`?HPvYPo@d%ZgA3Tqz)`$qrypKq!`94{WP^pDjcBQoja zbVwzkRbb3(_EB|CUPvJwGSROyuiZb@S`%>`aInmlN$GX_sG6@SU5eVf?Qyq!CA~eqBz{nqO-9OdLuP2l8CK)E?GH=^Q)r|8eAtVi!>8szq zf2y+-F<4)OQK2ZS-m#CWAruB93N91lzP@w+R3o5tAWP9fqEO;p`=^>DW}R!m5i(x+ zckiF-;tXa)a!Pomsk~<&Rc9Zy^9p^?sYHBl=k>`4E41|@6(1cL_rA`OQG#+_DOp6a zE~oc*mSp0lWCX@6plH+|=q{Op^xUm<7R<-}!OoIWf+J!lRt`$2_@T~{TB9#EE3m<2 z=go&ZOXgxYkwYZT3xb3n*}oUAC5hy92*G%+)JOMEbygyW1RxnY#CZ7F{;4ju=%5Kb zXFCzOk1yS7JCEsjJ&$43uQSfB-|`vON4z<&#%pzoHE&O{cOeTWQqk@cOIK|Ry4Z~W zxq3G!2%iFQ5C?-`Qv~|t(tqEkYMySpU!M^sqtxePK7UJ-;i%WUdisgEfQfM|RxFj^ zO|&I@(B8*SE%i6z7-nSAt3zNW?rZqJI$L68G#m_j8^3dC!~Yo8fi{guRXb^Gv1&6I zVnrw~Q`W%-BV(5I=_S!tHRGjbu43lj(MhIg1A~t`nTz<$((UKWD-7yB#dg1K&2L>B zIpmbr+Lh40`WH!O$=7Q>=1kIjmi-^oIt@~t#M;CRUdLZJcw-lZ34{Tih?J5c8U4AX zOX~oE0XxZ7CX+ShPM;!QOtGIXTko$TALKHBU@tZZCguA`K8O|b<9$xHW zj$oEner;(dT(2$u)GZ%Jl<)*cei)r8}5=T}_AF{0l4nRji>z zI4@e7SVXi&0^{kF_>HBV$ksPI+UBRG%W+<)cbZAVy|SRSP~TkI3H|Jf;jvrY3{+>s z_j=pE%~+dl0hbulJX#$Jerw0~xtXZn+mf{3>#YnK=Vpa744um!T=p@S^zEgN>F2{^ zYr`>N?G#|Yv~{Uq&RT##N$ERFm+#Qf8$EsFL*3IW$*?&EwX>cAVG6P2@9x+})4;hp z^tadB{teS4)h>0Te2$F&fXu%0y`^gp&+?gXGj5^^Hm9oEV?J90Zao?vyMDqGe?2!( zz3E=55E!^V$yiGK{?gyh)NQ7F^HRZ6adxUCNIJ69%;flkrHfAX@G1?COzQRnN1*^y zry1#m{Na+BJ>Sr9^X)f>$^FxCK-FxmS>e1;oq`F>1s+2D(b9k3F4kDX9MM)LDL{Bm z)&23(2JQBC?YzdN96$<22D8Px@ROy#o~fKhB5<2@|Xd$;ru~qf4*tx^udh)$`uF2f+vj08XFS) zV(G$}q0?t4!_8c9olidHUt%+nX_z(_k{{*F)Y5NwE}dz4XyI`KzVBo2i~X zyj6G5o)3yPlJ#E3^6O1YHWKGYG#;+jh!32=<+H?`1e)UgZho+ohc|=hL`q940)Vf+$ENrL=)U(!V=}Tr&)t4wEn>uSLyM9#S&DU%ISL zc^aP>_j)YVwbb&y*F_y6je1|9Uh-eP9pGLN+~B&49?P@mQ1tZISD>r&8X50 zcx9N_-Rj_Z2?p`!rOTUWnEr5Mc|K{#!?vVYPWyI9HfE!&)a5SAwkf;`!)T08tIfLA z;Oo{gMh+~AjHD9y9IUwO@;~e>cWj-n5>ITEPdwBazE|sFWRZ7Up1SI19;!Z8gdE!v zv`98bPwjAqyDv{Yzc7oIu-*xY38d3Td)ao*-eY-|lHO#=a1qX80k8^<&;{FG!h0^8 z#!GnTby}xu`!E_#()ehlEDEnJ9hxli?^Gp(<)EQVF@}sGZI2%o45IemOYcc%La$s1WZQ4Z7N`V+cxZ{* z$F`sS;j7-OSqrGw*os0^#ZwH|~Vm9Vh(|B@uy>k`Ci42A_Nrgw%eqWEAnY5Pp z49ohf-DiemwFCU=IP5*q>U{dq+W$9@1%)|Vm4ZOE2tHt^Nf?U^XA6A ziYaIxIM$7^G;(`TKJz3K?G^y0$}ysXR8}!izna4bdDd*fIzkh^0pe|ZbNy0D(ug2+ zP~;)Z^`>Xf8hA@p2hzi75@&q~b0Aum#V z`qG75aYlj1=)GyL7B6m#_Qx|osVV@GMZ26RZtGW0wsc+FmvIZ*^hzM>G>Xb-R5lQLDDP{;=XM+o$~Jt_0H z03Z9oIF%4zzb9qDF(f5rEXf)r-moWSq*WA59f~Mi&Trg{vKR}M5<_+htr6-?dr_99 z4Jchug@mJ+-@GSfK042YC|;Rlgni3ilz}zLI)xIGlqvYP?nzlGx=8JTLU3M-x9vq4 z1uBKth(b~+W8c1f#i{Nu}L~#jCsfMt-3;%G~1^pD`mv0*H`(% zb$0_yKLO&OY|!mYMjfbf8Z~|2kmSf{;2)SeYX~h|rL6%^!7-LbrfBB3Ndr~qbkc>H4r;1J=IG2s|!E;&I zht6eTA6~wE`^ebQ`@PDy_*36^;H$|JDQlITmGF_}yIrv9%sftcJWU`h>x@i1-jaB| zrROvdt5=MMYc*@ZsTFMa%Q(NZ!Di(HnjsrZNk$8&KDrz?b#{sZa1pYB#W`8q2GhWIwe$*)7)h%;Rl05uhP@9|5e-T073T+Hh13@Q*fA$)uJ%5I8|rJJi&x`|e+l|Fm!RvbDA+>-3|%3geD`KJAEf)O2I z8Vwy8i`lwwOu6x@=33!BH~!z2%+AX|_?{ZTr%=X|2gx z>FkZj&THqtzx=;;0-f8DQ(=c6HX|cWNsXDT6_gdnLprOY_`&i8PLRyZ2EQttnrtqWXE?|&(IGX%;`7Rf1U9dM`?HDbt5S#!G zu;NRx+6{9xqn{tX{I=KLt|l@)c@oDK!CI)SuQr$*Q*^tSqc>J3tqPM7rk^a|^&HtS zq5;yVp1d+~m5tUMf48&l*Aj-J;?DjJ*UiJW4wzv;Th)oy|5NyjUvs7MV?VU_^DUA}q$ z=h+d#aD-JEuC5M`kL%!CUS56hN-`O7aNdFa-Ex2bi>90VypBN@*&69o61)R5zh6GO z|7A7RNC?{$%~`9SX?yd zA6c2Kp7>9HQ-mRn1;T$)LfMO?xJbrZ{@deeb+kVIx8h=@FV_EoXQ7L7e}G45@E77@ zb+HuY7LT~#z|8MRsXo&F<%R!yUSBQl7ykQW>#LJ~4J2{lfhGoqE;>?EoQ*GB91I5&&a&+fj$BmMCY%F%;einq X8qomgq8g + + + + + + plan + + + + + + + + diff --git a/plan/index.scss b/plan/index.scss new file mode 100644 index 0000000..44f5323 --- /dev/null +++ b/plan/index.scss @@ -0,0 +1,477 @@ +@use 'sass:color'; + +body { + background-color: black; + color: white; + margin: 0; + + & * { + font-family: 'Cute Font'; + } +} + +.content { + margin: 8px; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; +} + +.nfc-form { + font-size: 2em; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + + button { + margin-top: 10px; + font-size: 1em; + } +} + +button { + background-color: black; + color: white; + border: 1px solid white; + cursor: pointer; + + &:hover { + background-color: white; + color: black; + } + + &:disabled { + border-color: rgba(255, 255, 255, 0.3); + color: rgba(255, 255, 255, 0.3); + + &:hover { + background-color: rgba(255, 255, 255, 0.1); + } + } +} + +.content { + flex-direction: column; + flex-wrap: nowrap; + align-items: center; +} + +.error { + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + background-color: rgba(255, 0, 0, 0.1); + border: 1px solid rgba(255, 0, 0, 0.3); + text-align: center; + + .details {} +} + +.error-container {} + +.calendar { + user-select: none; + width: max-content; +} + +.date-span { + font-size: 2rem; +} + +.week { + display: flex; + flex-direction: row; + flex-wrap: wrap; + list-style: none; + gap: 1vw; + max-width: 80vw; +} + +@media only screen and (max-width : 999px) { + .day { + width: 50vw; + } +} + +// @media only screen and (min-width : 1000px) { +// .content { +// margin-left: 5vw; +// margin-right: 5vw; +// display: flex; +// flex-basis: content; +// min-height: 100vh; +// } +// } + + +.day { + padding: 10px 30px 10px 30px; + border: 1px solid rgba(255, 255, 255, 0.3); + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; +} + +.date { + font-size: 1.2rem; +} + +.day-tiles { + padding-left: 0; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + list-style: none; + +} + +.tile { + flex-grow: 1; + flex-shrink: 1; + // border: 1px solid white; + padding: 10px; + cursor: pointer; + color: rgba(255, 255, 255, 0.7); // &:hover { + // background-color: rgba(255, 255, 255, 0.3); + // } + + &.pending { + background-color: red; + color: black; + + &:hover { + background-color: rgba(255, 255, 255, 0.7); + } + } + + &.selected-mine { + // border: 1px solid white; + $border_color: white; + color: white; + + &.border-middle { + border-left: 1px solid $border_color; + border-right: 1px solid $border_color; + } + + &.border-top { + border-left: 1px solid $border_color; + border-right: 1px solid $border_color; + border-top: 1px solid $border_color; + } + + &.border-bottom { + border-left: 1px solid $border_color; + border-right: 1px solid $border_color; + border-bottom: 1px solid $border_color; + } + + &.border-lone { + border: 1px solid $border_color; + } + + } + + &[style] { + background-color: var(--color); + } +} + +.tile:hover { + // background-color: rgba(255, 255, 255, 0.3); + backdrop-filter: invert(30%); +} + +nav.user-nav { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + gap: 20px; + user-select: none; + width: max-content; + padding: 10px; + margin: 0; + // border: 1px solid white; + align-items: baseline; + + .username { + width: max-content; + } + + .sign-out { + position: absolute; + right: 20px; + } + + font-size: 1rem; + + button { + padding-top: 5px; + padding-bottom: 5px; + font-size: 1rem; + } +} + +.new-plan { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + gap: 10px; + + +} + +.field { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + // width: max-content; + // min-width: 60%; + font-size: 1.5em; + width: 100%; +} + +.days { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 10px; +} + +.faint { + filter: opacity(50%); + font-size: 0.5em; +} + +.create-day { + border: 1px solid white; + padding: 10px; + + display: flex; + flex-direction: column; + align-items: flex-start; + flex-wrap: nowrap; + // gap: 10px; + + .remove { + width: 100%; + text-align: center; + } +} + +.set-date { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + + &>button { + flex-grow: 1; + } + + &>.date { + padding-left: 5px; + padding-right: 5px; + } +} + +.date-detail { + width: 100%; + text-align: center; +} + +.message { + display: flex; + flex-direction: column; + width: 100%; + align-items: center; + flex-wrap: nowrap; +} + +.click-backdrop { + z-index: 4; + background-color: rgba(0, 0, 0, 0.7); + position: fixed; + top: 0; + left: 0; + height: 200vh; + width: 100vw; + background-size: cover; +} + +.dialog { + z-index: 5; + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + position: fixed; + top: 0; + left: 0; + align-items: center; + justify-content: center; + + .dialog-box { + font-size: 2rem; + border: 1px solid white; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + padding-left: 30px; + padding-right: 30px; + padding-top: 10px; + padding-bottom: 10px; + background-color: black; + + .options { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 20px; + + &>button { + min-width: 4cm; + font-size: 1em; + } + } + } +} + + +.users-available { + list-style: none; + + .user { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + } + + .user:hover { + background-color: rgba(255, 255, 255, 0.3); + } + + [last_available]:hover::after { + display: block; + position: absolute; + content: attr(last_available); + border: 1px solid white; + background: rgba(0, 0, 0, 0.7); + padding: .25em; + } +} + +.signup, +.signin { + display: flex; + flex-direction: column; + align-items: center; + font-size: 1.5rem; + + input { + background-color: black; + border: 1px solid white; + color: white; + } + + .submit { + margin-top: 30px; + font-size: 1.5rem; + } +} + +.fields { + display: flex; + align-items: center; + flex-direction: column; + gap: 10px; +} + +@media only screen and (max-width : 999px) { + + .created-plans, + .participating-plans { + width: 100%; + } +} + +@media only screen and (min-width : 1000px) { + + .created-plans, + .participating-plans { + width: 40vw; + } +} + +.created-plans, +.participating-plans { + padding: 0 30px 0 30px; + align-items: center; + display: flex; + gap: 10px; + flex-direction: column; +} + +.plan-column { + width: 100%; +} + +.main-plans { + user-select: none; + text-align: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 30px; +} + +.plans { + list-style: none; + display: flex; + flex-direction: column; + gap: 10px; + padding-left: 0; + + .plan-headline { + button { + width: 100%; + } + } + + .plan-detail { + display: flex; + flex-direction: row; + gap: 30px; + font-size: 1.5rem; + padding: 10px; + + .start-date { + filter: opacity(50%); + } + } +} + +.splash { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + width: 100%; + + .options { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 1cm; + + & button { + font-size: 2rem; + } + } +} diff --git a/plan/src/components/dialog.rs b/plan/src/components/dialog.rs new file mode 100644 index 0000000..3a699e8 --- /dev/null +++ b/plan/src/components/dialog.rs @@ -0,0 +1,55 @@ +use std::collections::HashMap; + +use yew::prelude::*; + +#[derive(Debug, Clone, PartialEq, Properties)] +pub struct DialogProps { + pub message: String, + pub options: Box<[String]>, + #[prop_or_default] + pub cancel_callback: Option>, + pub callback: Callback, +} + +#[function_component] +pub fn Dialog( + DialogProps { + message, + options, + cancel_callback, + callback, + }: &DialogProps, +) -> Html { + let options = options + .iter() + .map(|opt| { + let callback = callback.clone(); + let option = opt.clone(); + let cb = Callback::from(move |_| { + callback.emit(option.clone()); + }); + html! { + + } + }) + .collect::(); + let backdrop_click = cancel_callback.clone().map(|cancel_callback| { + Callback::from(move |_| { + cancel_callback.emit(()); + }) + }); + html! { +

    + } +} diff --git a/plan/src/components/error.rs b/plan/src/components/error.rs new file mode 100644 index 0000000..b400d6a --- /dev/null +++ b/plan/src/components/error.rs @@ -0,0 +1,25 @@ +use yew::prelude::*; + +#[derive(Debug, Clone, PartialEq, Properties)] +pub struct ErrorDisplayProps { + pub state: UseStateHandle>, +} + +#[function_component] +pub fn ErrorDisplay(ErrorDisplayProps { state }: &ErrorDisplayProps) -> Html { + state + .as_ref() + .map(|err| { + let setter = state.setter(); + let on_click = Callback::from(move |_| { + setter.set(None); + }); + html! { +
    + {err.clone()} + +
    + } + }) + .unwrap_or_default() +} diff --git a/plan/src/components/half_hour_range_select.rs b/plan/src/components/half_hour_range_select.rs new file mode 100644 index 0000000..b5cc44c --- /dev/null +++ b/plan/src/components/half_hour_range_select.rs @@ -0,0 +1,54 @@ +use core::ops::{Range, RangeInclusive}; + +use plan_proto::HalfHour; +use web_sys::HtmlSelectElement; +use yew::prelude::*; + +#[derive(Debug, Clone, PartialEq, Properties)] +pub struct HalfHourRangeSelectProps { + pub id: String, + pub range: RangeInclusive, + #[prop_or_default] + pub selected: Option, + pub on_change: Callback, +} + +#[function_component] +pub fn HalfHourRangeSelect( + HalfHourRangeSelectProps { + id, + range, + selected, + on_change, + }: &HalfHourRangeSelectProps, +) -> Html { + let options = range + .clone() + .map(|half_hour| { + let selected = Some(half_hour) == *selected; + html! { + + } + }) + .collect::(); + let cb = on_change.clone(); + let on_change_range = range.clone(); + let on_change = Callback::from(move |ev: Event| { + if let Some(select) = ev.target_dyn_into::() { + let selected = select.selected_index(); + if selected == -1 { + return; + } + if let Some(selected) = on_change_range.clone().nth(selected as _) { + cb.emit(selected); + } + } + }); + html! { + + } +} diff --git a/plan/src/components/nav.rs b/plan/src/components/nav.rs new file mode 100644 index 0000000..05f767d --- /dev/null +++ b/plan/src/components/nav.rs @@ -0,0 +1,77 @@ +use plan_proto::token::Token; +use yew::prelude::*; + +use crate::{components::dialog::Dialog, storage::StorageKey}; + +#[function_component] +pub fn Nav() -> Html { + let token = Token::load_from_storage().ok(); + let user = token + .as_ref() + .map(|token| { + html! { +
    + {(*token.username).clone()} +
    + } + }) + .unwrap_or_else(|| { + html! { + <> +
    + + + } + }); + let dialog = use_state(|| false); + let logged_in_buttons = token.is_some().then(|| { + let confirm_signout = { + let dialog = dialog.clone(); + Callback::from(move |_| { + dialog.set(true); + }) + }; + + let dialog = dialog.then(|| { + let cancel_signout = { + let dialog = dialog.clone(); + Callback::from(move |_| { + dialog.set(false); + }) + }; + let callback = Callback::from(move |option: String| match option.as_str() { + "yes" => { + Token::delete(); + let _ = gloo::utils::window().location().reload(); + } + "no" => { + dialog.set(false); + } + _ => {} + }); + let options: Box<[String]> = Box::new([String::from("yes"), String::from("no")]); + html! { + + } + }); + html! { + <> + + + {dialog} + + } + }); + html! { + + } +} diff --git a/plan/src/components/planview.rs b/plan/src/components/planview.rs new file mode 100644 index 0000000..e01c45f --- /dev/null +++ b/plan/src/components/planview.rs @@ -0,0 +1,314 @@ +use core::{ + num::NonZeroU8, + ops::{Not, Range}, +}; + +use chrono::{Days, NaiveDate, NaiveTime, Utc}; +use plan_proto::{ + HalfHour, + message::ClientMessage, + plan::{Plan, PlanDay, UpdateTiles}, +}; +use serde::{Deserialize, Serialize}; +use web_sys::HtmlSpanElement; +use yew::prelude::*; + +use crate::weekday::FullWeekday; + +#[derive(Debug, Clone, PartialEq, Properties)] +pub struct PlanViewProps { + pub plan: Plan, + pub update_day: Callback, +} + +#[function_component] +pub fn PlanView( + PlanViewProps { + plan: + Plan { + created_by, + title, + start_time, + days, + }, + update_day, + }: &PlanViewProps, +) -> Html { + if let Some(title) = title.as_ref() { + gloo::utils::document().set_title(title); + } + let date_span = title + .as_ref() + .map(|title| { + html! { + + {title.clone()} + {format!(" by {created_by}")} + + } + }) + .unwrap_or_else(|| { + html! { + + {start_time.date_naive().to_string()} + {format!(" by {created_by}")} + + } + }); + let max_count = days + .values() + .map(|day| { + day.tiles_count + .values() + .map(|v| v.get()) + .max() + .unwrap_or_default() + }) + .max() + .unwrap_or_default(); + let days = { + let mut days = days + .iter() + .map(|(offset, plan_day)| { + let date = start_time + .checked_add_days(Days::new(*offset as _)) + .unwrap_or_default() + .naive_local() + .date(); + ( + *offset, + html! { + + }, + ) + }) + .collect::>(); + days.sort_by_key(|(offset, _)| *offset); + days.into_iter().map(|(_, vnode)| vnode).collect::() + }; + + html! { +
    + {date_span} +
      + {days} +
    +
    + } +} + +#[derive(Debug, Clone, PartialEq, Properties)] +pub struct DayProps { + pub offset: u8, + pub day: PlanDay, + pub date: NaiveDate, + pub update: Callback, + pub max_count: u8, +} + +#[function_component] +pub fn Day( + DayProps { + offset, + day: + PlanDay { + day_start, + day_end, + tiles_count, + your_tiles, + users_available, + }, + date, + update, + max_count, + }: &DayProps, +) -> Html { + let pointer_state = use_state(|| false); + let on_selected_update = { + let update = update.clone(); + let day_offset = *offset; + Callback::from(move |(tile, new_state)| { + let message = match new_state { + true => ClientMessage::MarkTile { tile, day_offset }, + false => ClientMessage::UnmarkTile { tile, day_offset }, + }; + + update.emit(message); + }) + }; + + let range = *day_start..=*day_end; + let tiles = range + .clone() + .map(|half_hour| { + let count = tiles_count + .get(&half_hour) + .map(|t| t.get()) + .unwrap_or_default(); + let selected = your_tiles.contains(&half_hour); + let previous_selected = half_hour != HalfHour::Hour0Min0 + && your_tiles.contains(&half_hour.previous_half_hour()); + let next_selected = half_hour != HalfHour::Hour23Min30 + && your_tiles.contains(&half_hour.next_half_hour()); + let border = match (selected, previous_selected, next_selected) { + (false, _, _) => None, + (true, false, false) => Some(DayTileBorder::Lone), + (true, true, false) => Some(DayTileBorder::Bottom), + (true, false, true) => Some(DayTileBorder::Top), + (true, true, true) => Some(DayTileBorder::Middle), + }; + + html! { + + } + }) + .collect::(); + + let on_pointerdown_state = pointer_state.setter(); + let on_pointerdown = Callback::from(move |_| { + on_pointerdown_state.set(true); + }); + let on_pointerup_state = pointer_state.setter(); + let on_pointerup = Callback::from(move |_| { + on_pointerup_state.set(false); + }); + let users_available = users_available + .iter() + .map(|u| { + use chrono_humanize::Humanize; + let delta = u.last_updated_availability - Utc::now(); + let last_seen = format!("last seen {}", delta.humanize()); + html! { +
  1. + {u.username.clone()} + {format!("({})", delta.humanize())} +
  2. + } + }) + .collect::(); + + html! { +
    + {date.to_string()} + {date.full_weekday()} +
      + {tiles} +
    +
      + {users_available} +
    +
    + } +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum DayTileBorder { + Lone, + Top, + Middle, + Bottom, +} + +impl DayTileBorder { + pub const fn class(&self) -> &'static str { + match self { + DayTileBorder::Lone => "border-lone", + DayTileBorder::Top => "border-top", + DayTileBorder::Middle => "border-middle", + DayTileBorder::Bottom => "border-bottom", + } + } +} + +#[derive(Debug, Clone, PartialEq, Properties)] +pub struct DayTileProps { + pub pointer_state: UseStateHandle, + pub half_hour: HalfHour, + pub on_selected_update: Callback<(HalfHour, bool)>, + pub count: u8, + pub max_count: u8, + pub selected_mine: bool, + pub border: Option, +} + +#[function_component] +pub fn DayTile( + DayTileProps { + pointer_state, + half_hour, + on_selected_update, + count, + max_count, + selected_mine, + border, + }: &DayTileProps, +) -> Html { + let pct = ((*count as f64) * (255.0 / 3.5)) / (*max_count as f64); + let pct = pct + .is_nan() + .not() + .then(|| format!("--color: #00FF00{:0>2X};", pct as u8)); + let pending = use_state(|| false); + let border = border.as_ref().map(DayTileBorder::class); + let span = format!("{half_hour} — {}", half_hour.clone().next().unwrap()); + let pending_class = (*pending && !*selected_mine).then_some("pending"); + let pointer_state = pointer_state.clone(); + let on_pointer_enter = { + let pending = pending.clone(); + let selected = *selected_mine; + let update = on_selected_update.clone(); + let half_hour = *half_hour; + Callback::from(move |_| { + if !*pointer_state { + return; + } + let new_state = !selected; + pending.set(new_state); + update.emit((half_hour, new_state)); + }) + }; + + let on_pointer_down = { + let update = on_selected_update.clone(); + let half_hour = *half_hour; + let selected = *selected_mine; + let pending = pending.clone(); + Callback::from(move |_| { + let new_state = !selected; + pending.set(new_state); + update.emit((half_hour, new_state)); + }) + }; + let selected_mine = selected_mine.then_some("selected-mine"); + + html! { +
  3. + {span} +
  4. + } +} diff --git a/plan/src/components/state_input.rs b/plan/src/components/state_input.rs new file mode 100644 index 0000000..a0f5cf8 --- /dev/null +++ b/plan/src/components/state_input.rs @@ -0,0 +1,61 @@ +use web_sys::HtmlInputElement; +use yew::prelude::*; + +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub enum InputType { + #[default] + Text, + Password, + Date, + Time, +} + +impl InputType { + const fn input_type(&self) -> &'static str { + match self { + InputType::Text => "text", + InputType::Password => "password", + InputType::Date => "date", + InputType::Time => "time", + } + } +} + +#[derive(Debug, Clone, PartialEq, Properties)] +pub struct StateInputProps { + #[prop_or_default] + pub name: String, + #[prop_or_default] + pub id: Option, + pub state: UseStateHandle, + #[prop_or_default] + pub input_type: InputType, +} + +#[function_component] +pub fn StateInput( + StateInputProps { + name, + id, + state, + input_type, + }: &StateInputProps, +) -> Html { + let set = state.clone(); + + let on_input = Callback::from(move |ev: InputEvent| { + if let Some(input) = ev.target_dyn_into::() { + set.set(input.value()); + } + }); + + html! { + + } +} diff --git a/plan/src/error.rs b/plan/src/error.rs new file mode 100644 index 0000000..3ffd559 --- /dev/null +++ b/plan/src/error.rs @@ -0,0 +1,50 @@ +use gloo::storage::errors::StorageError; +use thiserror::Error; +use wasm_bindgen::JsValue; +use web_sys::DomException; + +#[derive(Debug, Error)] +pub enum JsError { + #[error("abort: {0}")] + AbortError(String), + #[error("not allowed: {0}")] + NotAllowedError(String), + #[error("not supported: {0}")] + NotSupportedError(String), + #[error("not readable: {0}")] + NotReadableError(String), + #[error("network: {0}")] + NetworkError(String), + #[error("invalid state: {0}")] + InvalidState(String), + #[error("storage error: {0}")] + StorageError(#[from] StorageError), + #[error("type error: {0}")] + TypeError(String), + #[error("other: {code} - {name} - {message}")] + Other { + name: String, + code: u16, + message: String, + }, +} + +impl From for JsError { + fn from(value: JsValue) -> Self { + let exception = DomException::from(value); + match exception.name().as_str() { + "AbortError" => JsError::AbortError(exception.message()), + "NotAllowedError" => JsError::NotAllowedError(exception.message()), + "NotSupportedError" => JsError::NotSupportedError(exception.message()), + "NotReadableError" => JsError::NotReadableError(exception.message()), + "NetworkError" => JsError::NetworkError(exception.message()), + "InvalidStateError" => JsError::InvalidState(exception.message()), + "TypeError" => JsError::TypeError(exception.message()), + _ => JsError::Other { + name: exception.name(), + code: exception.code(), + message: exception.message(), + }, + } + } +} diff --git a/plan/src/login.rs b/plan/src/login.rs new file mode 100644 index 0000000..0cf704a --- /dev/null +++ b/plan/src/login.rs @@ -0,0 +1,52 @@ +use gloo::net::http::Request; +use plan_proto::{error::ServerError, plan::PlanId, token::Token}; +use yew::prelude::*; + +use crate::{ + SERVER_URL, + request::RequestError, + storage::{LastPlanVisitedLoggedOut, StorageKey}, +}; + +pub async fn login(body: Box<[u8]>, on_error: UseStateSetter>) { + let req = match Request::post(format!("{SERVER_URL}/s/tokens").as_str()) + .header("content-type", crate::CBOR_CONTENT_TYPE) + .body(body) + { + Ok(req) => req, + Err(err) => { + on_error.set(Some(format!("creating login request: {err}"))); + return; + } + }; + let token = match crate::request::exec_request::(req).await { + Ok(token) => token, + Err(err) => { + on_error.set(Some(err.to_string())); + return; + } + }; + + if let Err(err) = token.save_to_storage() { + on_error.set(Some(format!("saving login token: {err}"))); + return; + } + match LastPlanVisitedLoggedOut::load_from_storage() { + Ok(LastPlanVisitedLoggedOut(plan)) => { + gloo::utils::window() + .location() + .set_href(format!("/plans/{plan}").as_str()) + .unwrap(); + } + Err(_) => gloo::utils::window().location().set_href("/").unwrap(), + } +} + +pub async fn check_token(token: Token) -> Result<(), RequestError> { + let req = Request::get(format!("{SERVER_URL}/s/tokens/check").as_str()) + .header("authorization", format!("Bearer {}", token.token).as_str()) + .build() + .expect("could not build auth request"); + + crate::request::exec_request(req).await +} diff --git a/plan/src/main.rs b/plan/src/main.rs new file mode 100644 index 0000000..cee655b --- /dev/null +++ b/plan/src/main.rs @@ -0,0 +1,227 @@ +mod pages { + pub mod mainpage; + pub mod new_plan; + pub mod not_found; + pub mod plan; + pub mod signin; + pub mod signup; +} +mod components { + pub mod dialog; + pub mod error; + pub mod half_hour_range_select; + pub mod nav; + pub mod planview; + pub mod state_input; +} +mod error; +mod login; +mod request; +mod storage; +mod weekday; +use core::{ + fmt::Display, + ops::{Bound, RangeBounds, RangeInclusive, Sub}, +}; + +use futures::FutureExt; +use gloo::net::http::Request; +use plan_proto::{plan::PlanId, token::Token}; +use yew::prelude::*; +use yew_router::{BrowserRouter, Routable, Switch}; + +const CBOR_CONTENT_TYPE: &str = "application/cbor"; + +use crate::{ + components::nav::Nav, + pages::{ + mainpage::{MainPage, SignedOutMainPage}, + new_plan::NewPlan, + not_found::NotFound, + plan::PlanPage, + signin::Signin, + signup::Signup, + }, + storage::{LastPlanVisitedLoggedOut, StorageKey}, +}; + +fn main() { + wasm_logger::init(wasm_logger::Config::new(log::Level::Trace)); + let document = gloo::utils::document(); + let app_element = document.query_selector("app").unwrap().unwrap(); + + yew::Renderer::
    ::with_root(app_element).render(); +} + +#[derive(Clone, Copy, Routable, PartialEq)] +enum Route { + #[at("/")] + Home, + #[at("/plans/new")] + NewPlan, + #[at("/plans/:id")] + Plan { id: PlanId }, + #[at("/signup")] + Signup, + #[at("/signin")] + Signin, + #[not_found] + #[at("/404")] + NotFound, +} + +fn route(route: Route) -> Html { + match route { + Route::Signup => { + return html! { + <> +