From 349f7deaef4da7bfbd58b19d333cd953834c4498 Mon Sep 17 00:00:00 2001 From: iiTzArcur Date: Sat, 4 Oct 2025 16:22:24 +0200 Subject: [PATCH 1/2] allow multiple servers --- Cargo.lock | 1321 +++++++++++++++++++++++++++----------------- Cargo.toml | 6 +- map.jpg | Bin 21691 -> 37238 bytes src/main.rs | 158 +++--- src/message.rs | 50 +- src/server_info.rs | 168 ++++-- 6 files changed, 1069 insertions(+), 634 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 834816b..6fd035f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "ab_glyph" -version = "0.2.29" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -14,24 +14,24 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" @@ -44,15 +44,12 @@ dependencies = [ [[package]] name = "aligned-vec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" - -[[package]] -name = "android-tzdata" -version = "0.1.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] [[package]] name = "android_system_properties" @@ -65,9 +62,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "approx" @@ -80,9 +77,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arg_enum_proc_macro" @@ -106,26 +103,32 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.84" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1244b10dcd56c92219da4e14caa97e312079e185f04ba3eea25061561dc0a0" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", "syn", ] +[[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.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "av1-grain" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" dependencies = [ "anyhow", "arrayvec", @@ -137,18 +140,18 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.2" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" dependencies = [ "arrayvec", ] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -156,7 +159,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -173,9 +176,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bit_field" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitflags" @@ -185,9 +188,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "bitstream-io" @@ -206,21 +209,21 @@ dependencies = [ [[package]] name = "built" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -236,16 +239,17 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.7" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -263,9 +267,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -275,16 +279,15 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -311,18 +314,18 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -354,9 +357,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" @@ -384,18 +387,18 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -419,7 +422,7 @@ dependencies = [ "image", "imageproc", "log", - "reqwest 0.12.12", + "reqwest 0.12.23", "serde", "serde_json", "serenity", @@ -440,9 +443,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encoding_rs" @@ -453,11 +456,31 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "exr" @@ -474,6 +497,26 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "fdeflate" version = "0.3.7" @@ -483,11 +526,17 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -495,15 +544,15 @@ dependencies = [ [[package]] name = "flexi_logger" -version = "0.29.8" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a5a6882b2e137c4f2664562995865084eb5a00611fba30c582ef10354c4ad8" +checksum = "ff38b61724dd492b5171d5dbb0921dfc8e859022c5993b22f80f74e9afe6d573" dependencies = [ "chrono", "log", "nu-ansi-term", "regex", - "thiserror 2.0.9", + "thiserror 2.0.17", ] [[package]] @@ -514,9 +563,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -619,22 +668,36 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] [[package]] name = "gif" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -642,15 +705,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -665,11 +728,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -683,20 +765,20 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "headers" -version = "0.3.9" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", "headers-core", - "http 0.2.12", + "http 1.3.1", "httpdate", "mime", "sha1", @@ -704,11 +786,11 @@ dependencies = [ [[package]] name = "headers-core" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 0.2.12", + "http 1.3.1", ] [[package]] @@ -730,9 +812,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -757,27 +839,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -795,14 +877,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -811,18 +893,22 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", - "http 1.2.0", + "futures-core", + "h2 0.4.12", + "http 1.3.1", "http-body 1.0.1", "httparse", + "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -844,36 +930,40 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", - "http 1.2.0", - "hyper 1.5.2", + "http 1.3.1", + "hyper 1.7.0", "hyper-util", - "rustls 0.23.20", + "rustls 0.23.32", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 0.26.7", + "webpki-roots 1.0.2", ] [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", - "hyper 1.5.2", + "hyper 1.7.0", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "tokio", "tower-service", "tracing", @@ -881,14 +971,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -904,21 +995,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -927,31 +1019,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -959,72 +1031,59 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1033,9 +1092,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1043,9 +1102,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.5" +version = "0.25.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" dependencies = [ "bytemuck", "byteorder-lite", @@ -1053,6 +1112,7 @@ dependencies = [ "exr", "gif", "image-webp", + "moxcms", "num-traits", "png", "qoi", @@ -1066,9 +1126,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.2.0" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" dependencies = [ "byteorder-lite", "quick-error", @@ -1082,30 +1142,30 @@ checksum = "2393fb7808960751a52e8a154f67e7dd3f8a2ef9bd80d1553078a7b4e8ed3f0d" dependencies = [ "ab_glyph", "approx", - "getrandom", + "getrandom 0.2.16", "image", "itertools", "nalgebra", "num", - "rand", + "rand 0.8.5", "rand_distr", "rayon", ] [[package]] name = "imgref" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" [[package]] name = "indexmap" -version = "2.7.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.0", ] [[package]] @@ -1119,11 +1179,32 @@ dependencies = [ "syn", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "itertools" @@ -1136,30 +1217,25 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.3", "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" - [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -1167,21 +1243,21 @@ dependencies = [ [[package]] name = "lebe" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libfuzzer-sys" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", @@ -1189,31 +1265,30 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.22" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loop9" @@ -1224,11 +1299,17 @@ dependencies = [ "imgref", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -1246,9 +1327,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -1274,9 +1355,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -1284,31 +1365,23 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] -name = "multer" -version = "2.1.0" +name = "moxcms" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" +checksum = "ddd32fa8935aeadb8a8a6b6b351e40225570a37c43de67690383d87ef170cd08" dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 0.2.12", - "httparse", - "log", - "memchr", - "mime", - "spin", - "version_check", + "num-traits", + "pxfm", ] [[package]] @@ -1450,33 +1523,33 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "owned_ttf_parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ "ttf-parser", ] [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1484,15 +1557,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1503,24 +1576,24 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -1529,9 +1602,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1541,23 +1614,32 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" -version = "0.17.16" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.4", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1566,41 +1648,50 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", "syn", ] +[[package]] +name = "pxfm" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83f9b339b02259ada5c0f4a389b7fb472f933aa17ce176fd2ad98f28bb401fde" +dependencies = [ + "num-traits", +] + [[package]] name = "qoi" version = "0.4.1" @@ -1618,37 +1709,40 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.20", - "socket2", - "thiserror 2.0.9", + "rustls 0.23.32", + "socket2 0.6.0", + "thiserror 2.0.17", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom", - "rand", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.20", + "rustls 0.23.32", "rustls-pki-types", "slab", - "thiserror 2.0.9", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -1656,27 +1750,33 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.9" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.6.0", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +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" @@ -1684,8 +1784,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "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]] @@ -1695,7 +1805,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "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]] @@ -1704,7 +1824,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "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.3", ] [[package]] @@ -1714,7 +1843,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -1743,8 +1872,8 @@ dependencies = [ "once_cell", "paste", "profiling", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "simd_helpers", "system-deps", "thiserror 1.0.69", @@ -1754,9 +1883,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.11" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" dependencies = [ "avif-serialize", "imgref", @@ -1775,9 +1904,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -1785,9 +1914,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -1795,18 +1924,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.4", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -1816,9 +1945,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -1827,9 +1956,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "reqwest" @@ -1842,7 +1971,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", @@ -1856,7 +1985,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.12", - "rustls-pemfile 1.0.4", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", @@ -1877,79 +2006,73 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", "futures-core", - "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", - "hyper-rustls 0.27.5", + "hyper 1.7.0", + "hyper-rustls 0.27.7", "hyper-util", - "ipnet", "js-sys", "log", - "mime", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.20", - "rustls-pemfile 2.2.0", + "rustls 0.23.32", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls 0.26.4", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.7", - "windows-registry", + "webpki-roots 1.0.2", ] [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustls" @@ -1979,14 +2102,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] @@ -2000,22 +2123,14 @@ dependencies = [ "base64 0.21.7", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", + "zeroize", ] [[package]] @@ -2039,11 +2154,28 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.103.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[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.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe_arch" @@ -2088,9 +2220,19 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] @@ -2106,9 +2248,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2117,21 +2259,22 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -2157,7 +2300,7 @@ dependencies = [ "arrayvec", "async-trait", "base64 0.22.1", - "bitflags 2.6.0", + "bitflags 2.9.4", "bytes", "dashmap", "flate2", @@ -2226,34 +2369,35 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", ] [[package]] -name = "spin" -version = "0.9.8" +name = "socket2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] [[package]] name = "stable_deref_trait" @@ -2269,9 +2413,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.94" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -2295,9 +2439,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -2355,11 +2499,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.9" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.9", + "thiserror-impl 2.0.17", ] [[package]] @@ -2375,9 +2519,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -2386,20 +2530,23 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" dependencies = [ + "fax", "flate2", - "jpeg-decoder", + "half", + "quick-error", "weezl", + "zune-jpeg", ] [[package]] name = "time" -version = "0.3.37" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -2412,15 +2559,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -2428,9 +2575,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -2438,9 +2585,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -2453,25 +2600,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "pin-project-lite", - "socket2", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -2501,11 +2650,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.20", + "rustls 0.23.32", "tokio", ] @@ -2522,14 +2671,14 @@ dependencies = [ "tokio", "tokio-rustls 0.25.0", "tungstenite", - "webpki-roots 0.26.7", + "webpki-roots 0.26.11", ] [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -2540,9 +2689,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -2552,18 +2701,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", @@ -2587,6 +2736,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -2613,9 +2780,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -2624,9 +2791,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -2652,10 +2819,10 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.2.0", + "http 1.3.1", "httparse", "log", - "rand", + "rand 0.8.5", "rustls 0.22.4", "rustls-pki-types", "sha1", @@ -2672,9 +2839,9 @@ checksum = "74b08b0c1257381af16a5c3605254d529d3e7e109f3c62befc5d168968192998" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" @@ -2684,9 +2851,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "untrusted" @@ -2696,9 +2863,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -2712,12 +2879,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2726,9 +2887,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "v_frame" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" dependencies = [ "aligned-vec", "num-traits", @@ -2758,20 +2919,21 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.7" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" +checksum = "51d06d9202adc1f15d709c4f4a2069be5428aa912cc025d6f268ac441ab066b0" dependencies = [ "bytes", - "futures-channel", "futures-util", "headers", - "http 0.2.12", - "hyper 0.14.32", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-util", "log", "mime", "mime_guess", - "multer", "percent-encoding", "pin-project", "scoped-tls", @@ -2779,7 +2941,6 @@ dependencies = [ "serde_json", "serde_urlencoded", "tokio", - "tokio-tungstenite", "tokio-util", "tower-service", "tracing", @@ -2787,26 +2948,46 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[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 = "wasm-bindgen" -version = "0.2.99" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -2818,9 +2999,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -2831,9 +3012,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2841,9 +3022,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -2854,9 +3035,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -2873,9 +3057,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -2899,24 +3083,33 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "wide" -version = "0.7.30" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e6db2670d2be78525979e9a5f9c69d296fd7d670549fe9ebf70f8708cb5019" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" dependencies = [ "bytemuck", "safe_arch", @@ -2924,41 +3117,61 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] -name = "windows-registry" -version = "0.2.0" +name = "windows-implement" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.52.6", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "windows-result" +name = "windows-interface" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -2988,6 +3201,15 @@ 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.4", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3012,13 +3234,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3031,6 +3270,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3043,6 +3288,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3055,12 +3306,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3073,6 +3336,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3085,6 +3354,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3097,6 +3372,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3109,11 +3390,17 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" -version = "0.6.21" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f5bb5257f2407a5425c6e749bfd9692192a73e70a6060516ac04f889087d68" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -3129,22 +3416,22 @@ dependencies = [ ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -3154,9 +3441,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -3166,19 +3453,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -3187,18 +3473,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", @@ -3208,15 +3494,26 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.10.4" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -3225,9 +3522,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", @@ -3251,9 +3548,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.14" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index bdb04aa..5cbd87b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,15 +5,15 @@ authors = ["Zefanja Jobse "] edition = "2018" [dependencies] -tokio = { version = "1.40", features = ["rt", "rt-multi-thread"] } +tokio = { version = "1.47", features = ["rt", "rt-multi-thread"] } anyhow = "1.0" serde_json = { version = "1.0" } serde = { version = "1.0", features = ["derive"] } ab_glyph = "0.2" imageproc = "0.25" chrono = "0.4" -warp = "0.3" -flexi_logger = "0.29" +warp = {version = "0.4", features = ["server"] } +flexi_logger = "0.31" log = "0.4" [dependencies.image] diff --git a/map.jpg b/map.jpg index e3825d98b24459d0620283189d2fa0ddcff9d11c..9b47426ad737334cf055a6b9e3d3e524cd7c5bd2 100644 GIT binary patch delta 36913 zcmWifg#DzYE>g>l7iF_^tHu7 znb!!ZKVVy7n$Ui#^`eC_3G_x_N^Z60Bwy82F1~#?vyG-wID<3{dvh_zAToyNX^lCv^fsD%w8h_uH8IDZ zu1(UkJ8*YpiHtCQl(Z$!K$BRaNV>(ery_K%3l_|InuORd;~x3hLMb76nY;cIo+XTN z`JvTs<`?&;i+y@Y3#iY*--G3`?GO(gHJpws^58>q4noxWJT=_`G4ilnY7Al4BK1xQ z(6J=KYUW{HW@2>SmEU!tD5R(GjIVn7=POC`=7v1k(zR#kP3NB+!2wgyWuhKP^?QCM z*HCvQ&u*NZDlf7RIss*zECG{}%k4&DB9f;U#O?O}7`u4+6l)hBE{#*y})yq&9=eUeq z+%lZb_W>SRGWa?`r$1q!@m)2UlHgTY4776Y8PH1@vtB*of0yEOaz<|Tu;NYVi z6E5*Y`*qay*JfMj{v>7os6$m3mO@n3w7tGaGva|>DvQOlXJhbie}e4RP90*gDY?*A ze|GyrW}TGWZl6FLH4Yf7APa8TqRAhP1`lowCi}A5K6&%?02^!ca9=#ugwC9wC(aW# z8N8Lg+}$#%_r0+O-$!MRH}7sr3h~p>nJ$iAI7oPMDdflMzSExkli1J9nI=q|B`sk~ zNu_C}bS#+LggScF57WCFb$Dz58;?DbmM;zPRq2DgSHE-FOW zyq{6Ow&jhn!5ZElUyrbgvFPm`dTTgZC2YVK@%}@53w~zbiSfUMAwA&SIqW~rHE0@s zFO$B|s4F($=H~9?0BG*o_;rB)n{%QO-=2^cPg!4yV6jz?#yFXQgS2Ag<$L;KE-Oti zd#i+iOS_2VPpP*dbG(cSKUGJCKpaoiXsd>}=pWoL;jwgc%;kJMNp5j2RHNl`aD&;E z3zn?*Q(cjmfrU<8YRaHT+dP!^5&-*>XOjq7MdZD|tkH~|0r#k4rbuX}2L+h~L~`hLT4^QVMz8YJM44pmdvK^q zZdT)Xo*lC`kxBx&oAQrZpe{564o|VEHiHLoi z9g%}iTUO6E;NZEF!=O#8m1p&7a(0-(kJ;BduVvrr5bT>`$vYV6s7wy{&*L00;so!h z`;wLvaC7w+AX||Xm*dLN(&(R}HLBI^%6;Rd{^c7?fIambbB;~5@it~sUt0shY1wJ9 zRC(LAVoW2yRbpW18cNV$K>YI}jT87nZPs3?O1t!e!zZCI_%`38EOXvR3&xlhJ6g(b z2K~#i@_Pwm{R1%57{}zHd5p%_hbBK3GiOS}N;#-317`i?Z*G9A`QmUg-ic|iR|he# zb-TcImQS7xRqQ7R2u+~R40<2$C7p0#{{o)=HVUWNr_gUuPjcgpe?A(P`1#L~wYu27 zi!|A(skz0*R1rk|_aY6KZ4R&3*)eVS_3Oe+?R6~;K%l~{c`GE-!iKXAvt3b~%*q~} zFKs6oPgO^*7<8lP!yxhNtmCW{W zz44i|?&DOg=}YL(k*Ft6C$&r+;tALLm?y&XNvk`a!C$zwra&m+sOF)`vLbVy|0m`# zId%QDJYEp6>{G!XPiyxq78eH~aY!9Gc!9^d!-vTI_8HK9YJM@<8DX$tO)zJ!I-Pt_ zc{Oyf*o<&pXinDhb`1(zY9zeBQt5MS`iTT5dTL1f3>TvN0IaZZXuxn64^C+!u1(;Fm!xvAN!kT9ao59b!ytdeV+cPx#-cJu;6OTxpeG`zU zvx}4RZYDhfJwN&LJ{jw!yUM%jSIO@ZO}I*m+d^rHsHY15c!Jy;z%@=ITtulKPXL@9 zJNIroJpc_|%}1rfC~~=Bq2sKQIOn>0VfWeLZ-^8zz{iR$Klg zD`%l;$IUjP+WmU&^!>nIRe%#HSaOJs1j)f*V)Dm>&2gEvJ|0(HP24b@@aABjsvb-m zKIew>GKA4OR7CK?Jf8GU<+`}fSHJ4iw#rH6DFa1}`DhG=_M3XgY(ea?VTXsWEqby_ zrKFU(QonXRLxOJFE*W;N!h-%V8$X!G&f{m6?+cc6ggb+g85`$|#u(s4HoJB0dAs1eT%E>pMd z0aFY~rh!FqX_a?|51{o08qIAOE`Cz~J~|s8`q7Y@P#&P4t3|Kl^i`DxPi=FyQ3cFl zH)nd3U(=Es8-J$&4L6E&#PeC8>U6gRp{>Dxyv*WwZB5QtG`QaK`yZd2SR^G-+~sTK zk*Mf#IEDNNpP^~yltI~Rx)}c=I*D)AWj#8C#X)IkIb^qz#Pw-XD6IqlctJ5)u2BvY zsWTO&5rwPl;kUzIOPNk+q)2fJ*F+wNJ3Ig%d~Xz6$-Qp7Tr%2~m~^KY7~c0MWQLn3 zqkWm;R;1j6oS%Q`dNF`Qq?bR{o55_iRay4nvVgp#c+wS6)zG^hEcfridy*KKax+kx z0L2OulypJF=BIIyMt)=5@265l*<9rc-}M;op{j@r2`|Sn3m<6VrxH0P#Z5H+)8FYh z=V`DmlZ;|UovD2ShsdJ%rWzM*c^P6$1tvXGUURcDU3#^9hGzom4b+`=>wk)Keon%j zO<;2~C25GdZRBK_5XjfKqUM9A1xky3>;++lrI68eueF4D05}L?XkV8D&K-U#tk%@O zo1PW5I>e*;*?eTxdAH)~WbQ5ahYeJQ@iF!n(%#ag|K`NQ7&45|;i2Zdr)fD`sjimen96Pzj6^ed7_1;C3P7FEvrF1?2uqD09gEa;#oq} zT!rtrga}4LUr$;avxO2&RO|%7;LEFW2f@dkiWOAWI_;y4TM>A=aw%z1-ULXd@a{)4 z%_rH4h7hHj3(7Y$G>rpyB?=w7bZNr)HVZ`%G*b3GW}gO zI!~`N{U`klXH#5bcahGy*nD>}&96=xumWEhrwitBeL;r^5%ZK!U~rT8k)I#AZ*<`B z!};(?S-pt6DmZ{R&J63}wzr!*aQQDl zr<&?Ov3j7@!wML#!rgg3VeCHDN|b^3Ut-P}yGjafl(r@WJ}>vhqQjKnB~X>(yv;#5 ziGb=8sv(iCN-n2}0gq9QA=|a!6v03V*1mfxdB46Hrs=1PT8sEnb4_YOv_Kb6YK>t& z57y;``{8fzop7!&(>T>rh>53W(T}l?lTnKg6%^LXiTkz*b%K&zH)3Azud`Ktkv~uj zMYV6&c|MNg96eLV^6^r!9XKePLnF1`URHbduNPKKCUm#4nhXik2HqV=!(9ff)&Z@z{?qevnB%xl2jhvQbT6z(_O% zeQWy2%SjMXrVrE1?&)z%&42vF(|stT#!N^8fTpvVp$XR<{{;=8lf3h0J6vzHB>&Bx z@tRz9Ja-e;K=w0IhFGtwp{@1Pk6H#cVbwCV9;o~9L8)h)luud(hn9Ug#2q&Ms>){= z{A@~!hY$MHB^U)C@vygQJ=?HvFY~O9MotC4++y(Q`Ut7 zV$@iv2QAyLN|NYDvyns~vmdEz_)BDop*NN0@>)AEyvOHep}^%AbxF);e|RCWRuD@X z9rj;gL9}amaHlA*X|C4TUA-FXcpoa}IL@1B zjiEcuIzZ%jKdJFT2JOen{%8xTH>4k$Io+3&UlqwK57JE>VRbCw{SpI=<3%hzBixNj zG&^!9CWx}R=PEwlZt*_wm7;VyKC2%wSlUT-J+tXYWHFgm zkYbUuB%+HE7G$dQJ}H4P0+89{+D-gXttRw3!0M;7fA|=_c(H=41Z4py0!K_Ky($By zFl+0iZ-Jesm;0#pGM5FRP^I#-I*-Pg06`3D6xvru`NY^DixSJ!1z%R5>A22G8R#%g zylwbXT`+uf^2A<9V0+V9x%hxT{agNEv!*`1p#oam@1FpI5@#zX^F}`3D+PLh7hrtu zz20|~5xu*B;93UZ_H^6_?#F%s=f4(;bdxkvhZGZQ-J?BuNU7vD4i8O+8ziaJoL~p5 zg#^?eF*cvKXIR{=SuF3dmM?o$MDqDFDK4ieQ7Av=K~#8ExAxD!0HqkdcumNEWg8a?o0{P2SB8n>ytf6*;>c0*b0Z(LnwM^Yly{_TldU1>zwOy9;P7pAA>^ ztIsAXlXqN=N_9zv@`!|O+k6EnP_5SlBYHY=_Ni`G5Ee~5K>cvhNTRAduiL|lnn+h2 zWK}PeayK_xk-n4Utc~;ln3HcK%y$3!K8-G#rL|!H>GZ_Mn{6_!mHMgqlyF#OKkTtPs)2Veb)v&D^6Lh9{a3}RY*@KJk3!WM zK&3|xgx$J0m^YI)1`EKt8EP_>DJ?KKho?95G>h>Z#vZT)C}M}IGMrpdTd~uBG51wR zzR1^#YOsWGR}z~Z?O#A&@(4Td;dNEJRduzO%o~fj;5ps9k|@b&7c&6`(FY7mi)A;o zLZ(W6bM;G-KNDDXb)(_6A6wbM_eRU^n|gc=#WoE&J&d{ksy6SZt_P?j(}#cb)I{^j z{v|BbP2pzo%dXsi9LAmcQhVxzQ_(VyJ;IW=M#sINgEla5q?$==TZH$bJjl(6Mcy&v zbE0DBqC&B%r*ysbwPl1253fl>?6r$YKm&PHm+a2;j2Elrg5>w)^suUPaU!+Y(E~0{ z3^s|*{#PYM6RoZ#QSow*v@%TyDzeViqkylF$bsr5AZjppK(;9BLA8+Ny!YMh&&!`* zMN+(>ZU(bDeVV4)U~d%}?R?aCSByhjFk;wyr)~2KxlV~TitkdE!4LR5#2?FlI3H#}L+Tp3l_9E0Zxe_fI{p=agH8_aDnYYA@I$cq2kk$hzG{C#Dmk^d6$N|##7f?I3_ej$C4o+N5uYpHwqbqc~HB;bAZP5w|vTL+4 zlIT?5PH%TC*`ww&63WpXyxrWuCgmeClW9)hpm6GIcJJ8I(QYAvr%%uv%jm!ubnv5$ zC2acRU@jr~87v$iH=za}cq7E_s>n>!s-y#$ z%pL!o<7?a&5s_>{W>7GiM0f=h6?=#IX39sgdwP1$-)M_o%<8f-zQcW_%Lq(KB!UY8 zPmgNqf2Cuts?BNR)t-{W4)9F>#8sGs9Wbef*5NwlV%hI{+6Ol$A9>&stc4-;p>4(SC98R?Qe@ zJ|UkVxPy%;ZC`h_q?u-;VWCjC9FtLSo<(M7ns`h++i!_i_+=4b4sroFpK`9}T}o&s zyNSFQ3c&*uV^H4F5gFjb?)U;1fq{=U{Fyw}?ZRS6D(nzTstXO}6J|zjsdhwgD9Yi* zqoH4kpR*?FC9KGkb{dGAME6UiKci^aFF`vkMp(Nh#lr4f8_Ir13JyycDqlR4bN}Dx zC3?~mDdiAV>U{WdAQ1c#RYMvbtE_^Anz;T34+La>^&QF5^X%C_o-PLcMhbcoEr-?;L>T3=&agB zV#!UH1Em6p#^1q70c3-8o_jTyaNaeJXN=A%g+$PH6qy(6sVP_dt?CSyV;ZVrfav%7 zj*`tu6vDk>|HaArR^3;~yMwIFUGHZWYUB0cWwb^PJ7roS6yjl$Kj78ZFzmemN*FMqBxT9;! zt3iVW$8)p~P06aS+yfXTffD`Z+Vv6&F1`wi)31-Ca0h!rzoLwK4({_4Mv`-qigUnb zGzV{82KT96xU%yv9h$|O`-EhBWJ9(VP@n|fWX1E(Q+~g1DgpkBXeX=AVfuqmCVjv zdSilz@1#Ds5V>dOc4HL5EIFno^?E&%#j4$?WGkG!+~7ZVcfAxL=4S*B`O)3b#9G}X z>1Pii(?#=(F7ejdv8(_!| z(!@e_+*i|H{!z$u_)(V)Z6LDlFwP5TQ4N4scO1){mkxIG&c1tPuFAtH9T_OIA3R{# zik?1jwSVi^y8(`Dquguw>W67xOeVDPS`FkQW7jjCa4sn zH}dKC{hI+=V;#z$6R~fdF3a}(m*<;1=j)yx3#qq1Ycrz;2Os89hwi4DL$p1Iw0+9o zGm}!46PX)6c@c86c=P}y?RU%H#JUOV)L*&N()pBEQ)>$?Bx)M;HPD7H-*;7`d;L5G z#9UO(6bmHhy202Cuk?zSLia`jWDOjdQ&RT8LpT)Y!Acj6d!FI9ZlnHJe_w zAZ=}n*^6^8pPkZgbA35+fkIkmS6vwiHt zAP61Alc9=nAv+K>!oHnN=7xilC1>hXaO=7#E1n{Zbu@^&+2b1h9ZC^#UW7B?&h0UGH-!15Jqn;NAZo?G=iXwO zK@V@52=}_3@11r*2Sf__!-ZacjG2!eibGoSsRXAca=qV=P4UbYd}BWS5<%v4|7DA= z%Wv-(R02hEJiX5EldDN&-2ewj(9S1XM*Q}Y{a@z*NIpAwnET=8BAYBAMBT&7k+(k% z>=Mk4#lD_{F10*0)zs@ELe?(HF^R1QT*A)0v?YvP_|+ZLeJ1*RkFXyz7@^)t%y*X9 z6{t{BK2Xi|e)@HiC6-PVy9u4gWN%m z7_*OyRdv1pF;yz&8gHF#A%hXO%J6|HjUx_w%UoA-JquTy()k>0cU_+QY#k&nMq?2H zgFvaYC@xm-aOK0O;eRVRUK~#MwzftlX;O(L#Hx5ZK`22tSpl%U=gQpq1O7Fh>c&+# zhT%a&spy0vT}p%V_?`X!3cID^W&emoyWEBpJLiLfmuZu!R$O-|Do*`lyp5?$u=thYB!x^fl2hM; zo!oBui<{{pUDtKX)=trqwg;%ut6ECh(^54VyB&6R5}J!z)@bGz@FT=#kj>JhRmtOK zLAWlC|e zL_r!mNQ1v1rhi^kTWHc|hJ5R9wG@8M{95!ev8?941Nl!a_MOGj>enl2w=4bur!Zb8 zV921DYU1<2tJ|lwj!<&r0Ja1u8blRI-o{d*&oKWBHE>#6XeyYnLSfIAhkYnilqHe< z;8)pispPg!v|G62o5XDF%*%$M!xP&~Snyv!JPK1eBu|r>D&Orl^iSnlH(7ZfJ@&P9V>;o|%y`>(_nJv9U}h5QvxzFi~wxbIV z;w4GAv89(U9?ZTkVY?B7vePHyzYQ1XFXP%^UD`?j zq0DKBD@i2s-@dr?v3m{5_jDg=!$gb9Fx`&SrmF5qqp~#RdyF`eleCF*m+S1}GQx3) zyui>bY?1Eb)z{xnueQLCIw;A*S{M@PJ%&z~Fo zB@K;k=7<61lxbERP5--YiV^@&@Qc1OyUF;ZUB_-tzRt9>K$#{xG*FooNZ-I9CalKP z2As_p(&A(*hdG-NMRy`!c+;GbgU!<6w?95&)2{=;M62QCYq4XHPaoTRZtjKXAs5=Z zBeyq&+$=BVX12ok*!$;+LpFRa(P6H4_L@X-`Kp#91bt%*3RsDXJg`Q8`B z8WR#RJ`_OucTcB`wNnfs**wkhxa9QJninP=VDK)DU+8uWL*@<65@_?rV7;+sJbWZv zTZ07u$L$Y%aHX&eVPz|N;--8a zhM0+`<;E2@ne{w0GUP_AocnXN8qr-8F`xVT*xPb`1Ms)|DBPpJ>QuR4GpMz71xT-q&3{(Mv&C2vd# zx+>8h$1;O9eAI`-`>lcHL@yy`XLQV?ah!?2$1GI+s&?~;j>zB6mg&LbT-8&^45%dt z&@wtF>jWs#E))dMWFOgTtH)NPia;M6Z6O*p3urFE@tViKYL#A&F46f-=fY^6YS=WeA5xxC5&=SmfQ@_S}JboJD1 z1kbxA6`80W1+j1O8p~yGD5lzXyQDD@@soNCFNhf;%=nahiXskA>{2y~HFxb`p`5_| zq?-8Zgk{Ko{u6MWuh=J!&p0~1N$#K@C9$66nu{4nTsK7JVMV>(FKSX_Oh`LrOjLcg ztc%*LffWEHaP@t?o%|kC&z{`Twze}nU2xq;IUlQPQJ-{s_dD|8! zQ*dP!h=9UPqvmS4IEb6;CVT4bGZa0QMMWcdcHFmi{V>|NzPz1rR|(eZP9LQmBQl@< zmyQ(Jsajen!dVSUB1#*YIvYce$dj^`&K*?!$3FnKk~H4c**K!y@;j-?L#03{fr4O~ zm~jAX;Z8wdw^GIdM&`=L@yhC>XMEdY6k9(fV;`(SMr{ma=!-usWdZn&QoiyF<@V5a ze1TidIO%ErcJ{Sq$+dxjzGx2`wkeI4rb5*{G%is?|7lJ?8bhx@h^~f?ZRU6mjLSGU z%(WQcqY^UVw+!{&Q0==Ivz~xA_&vH zc*$I2-NIOct{%58HbRKz#DkH76WQ3d6e_LLhf zw7{a@88MMi4e@5;0b6H&ayJWNeC_5fvDCpV&Qyi<#X?<2q5r`FkppbN6nFFJSYB@vnNfD%ZI_G-tl9Oy`{q8-6Mgn|CDP#kzZ*kM9^1>nSjZ_^Mu zZlnO=cpQLM`C*9(@{9ayx8~-Se?UdCND?(La)A3WWN#?<%@(}^z7jYJkLMXL$Q! zqP<=2oQCYQ!Z}EAD{PbN*~%hwAN~TWqU&tnwbcSdw?=eOg?K;++!yM{zf>25EfGIq z3_l5{GaQT#cQ$>;C>;K0v?tNq6qtkivnHKGtB)C3pAU%~lH2mPrrDe^Va?noFhfck z(PD}Xvn}yF>J6Us{bxhacTxOa@Wh@45Ft+keb1fUcaxy3Aslf{jk`D~HKH9(*-!~^ zRaM3J7#W@YpqNjQc{X%Wkj;!0^_>AlBAovM0!z6|jDmG>4LhwKtZ_bau5TJ?WxrXQ zIo*eS^F8`CUQRH15c)!DlH9aVLE=cbZFB-YSi+RrjAM#e!Yjd#`hs3P-D*TV;i{ z4APP$pVXe4@4y5ox>f9i3B z(Is&xwE%Cj+gTd%8X=_W<}W}EKR>VS+FujStV{uv1yc0&4ou!q6&H@EF91{- znizU7NEj=2clQsJ#Jn4>eT)HU_W)C9<$7QzgMLE%9Ud8+obGFn=3O$=;z08VbXO*x z?$E$^x+@n8Nsp2GB0`mkbWpZfC8K+e!~C-hNE3v{EN3pJPINuC*|=#MtGP_M_`O8Q zeJyd%2H~i>LANhsPuxCtJ!{|8|GKY@wEI(>jN5X9m)t}dIBDYFN~A|xv?d8Fi6uin zvH*PGh*N{GUp1-qlF}oqi_kDeig)`?-9z4BQ3@f0$(vQ0F18&}HA#bOO9>_T>w_#~Rp|=~D4x%fA0s9=a%_8+IefhMBZX_AAx253 z9a~NBpz(A{E-5cM;uG^4Braxi+kcuS1un`eei^)RlEZ06uR^|AoV7OqO6T3kWr;rp z<`1R{W|6I!5kN-8G?>AVXEkdKmV0c<@CMht;Nx2se`WQvcZKJ3ivE8NY0TQj!>^!9 zF+f%~3)4tVGL|6OLSlro?*pSTgxec5_H>nqoa1H4c88NgBDYz?qlqEN4{cm#i8En^ z1ENLV@>GNVqYOvGi0^_AC6gSy;2`~gg@-w(0=C!baAQi$pBwEQ6_w+*7%n*WFQqno z$!r%O1ftX1&C*z=;0KXhab84wD3`HY;xRcy^NUOlkK$LD2Vj}&!GmZzu3JtlL0s88 zdkrH=2OC`7;ky1O5&?%<$M%P>rSk3P_U?n|r#b@C&qfob7^4xZ`1F`y5tzvw(Jmyd zZ4~74ucG1l#7SepttlX70G87bb8V_T@#WiF(TOf(?>07>$UH##LF11+z?U$6A67Lj z7f*}LRY}G!IPMg!dk>SfA(YW*{X|#2pMPVk{xC5FNuyon;cCtg30){771=9=v$w8S zOo8@OUG9pJ+!HqkT(P`%VpWb#39pyCwhkI8aAt~-Wgk7!ilxZgYJL&hl*FC-oBjch1>v;pEA;%Oa&ZeLgE=I4d7FmL`=JN z8&M=Vzd`jJ;GRwZ>`hDnB?mA^>^liKPee-X*YqY`inh@v;8~rD0`SH>=}|L^W%aW% z7mnuOverQj;!}xj+-w%FH(%9MdWXpGH_40CQgb)q$iQKA>1k+i5`B=6M8|6j@jxdn zkr8;8lz>m|)3UQtGTxD}uVP<=CkjFzErj)DXpn#rf}vR{<#)nhMwO-44nH;Kf{kdeXqJJQHD0#(}E1B2@g?s5Gc3WJa;5D zmV1?+;)%dFH?!>$Y!;f-4QW32bXJ*oK5DKx4=>U+cIeTN=n3v`;>t@0eQ^veSGD zQPvu7|MH@pMVq2hv2U#=y@w z9fNk(P)5%{`V z#lFtn`j6++2me5gcADIVQ%wAxSsexV{Fa3Vr6nA2)d&I$c!PHW6o2hErVXk?zV3-y zYx|Myj6nS7zSo?Rwi4wA^I~5D+~QZ6=udhYx0r@5YB`IA*%)jne(`pgkn1E%u4 z@o4@9JmIekrJ99_f4A4;7l+|C9eUT-8y=S5On1*(V+_24q}Bp6msKYkmK_LRHMQ88 zSNC}#yqDwdzVt%uDblFX^&MYJ7~SJ>!5UPJB&JicNM6=TP?T>Nj`ha_j&0VSKe-JaY)lx1Rwg2GvhU(&Po2Ix@ z7lxW-0YCFs&cAz{{<-{1EGe4r`gww&Gd!A)rIZ4!!vP4^^%ccH$Bq*<$8o1$JLX;+ z!Znt{4V6&O3JWe;?D8bwI1g^h+ce^;`MGxdy@Rg|WUV_8xWuC8KCy7SyeKw?{-L0^ z<0TqK_t|JH0%W!54i*E5^&E%8jf+LBG0#9R%maagUPa>515Gd3?a^=FWxOF*3@^HG zDs9!4l$mP~5PQHG+2$Q99gN>5W9Gyxv7{zzgKWd!Ve>t)^~WaeL@O%|3Dx0Y!7LI< zLkJ;T12v|YFXZIMreW%)t?1f83TRZq5i&yG1f>hwnm;~EB-~SpCCsTRZWi0vqi8K*Oq^JpFO)h3~ zMYF)mx&U|V>#OwNh37EUfAKDxiF(&Gi|-9)qQRGTKmPN27)q3hEidgjck~w)HCVK# zxFiYS>GYUy$1S?34V~Ba#O#v%gf>hdX*iJlAYg-Jv>e1JIb3!J-wbGoAY5xtfsK~$ zI>YEmV5j_wA*lNF0?kJY*G7<7nR}oA0(dI#+_A*2O9ON+x$r_}BTgTS3XNU{066qb zoYSEl5;fAZI(qKA4L$NfQ2w>WN^v??`e9yrEw;2`V%IkT2J&>L3oteiMQ)o~hcYnO zM2y@33)d%|IFY!#Sh5=D3N9cXU+0vStK}9oa}yZ^tv?Pcq#${}-G6c26wkEp@>F;v z6pig!SCe#TmrnzpGpy6*(CO5n%#bH7+P8CTxeD=B1z=HK&MiFlfm}rYlFUQwhJW4` z*!(;h^=@2Yc#4Qn-&b+7Un!68E8*ciX&|l;g(osNLK_au9drQQz_SkNiEuqsdEopLCoXk+0&-Hd+j3+VMeHg@eno zOFqrCiZ@0Ej>%?Kk;Pq3IddirnV|W-M^xL0aF}U(#29BTR>y}qviDK5eqY_T@&y#4 z1dnLaD9b|8=a4>HnF8Z(`O4oIgCZ}pO(n>v+o)4y?E;CL)B8j?w)xn2v>y@L(EXuq ziiuLJg5r#~kDEq^KXsXt?7CqgfCC(7dqo*^@{E`qg{rh~tb%M(%#YmkO`7t8qKWwg!q-#rK zaLTFizgZ5aGOt>1jI7AL#_T1IwV`(%>*vJPR(R(sH{JgwSm z9c&Piq?jk~fg(K%gdEhl!ab}M& zI`!jKlcXuPrG3@Hbm=%nRn>d9aam}oO#qn&*Yzud*w^c7*vMVn)&6Uu+Hx!3n7Ta@ z^@6RNtdY?@m^e_M+kwc{r-Hm&hfK@wqujV-l+RZFi_0Qa9!rO$7~W;H-TlO+4}J;q9l%5nunj1 zq$EeAwj%kmCli?WLazP@N^|2Cs-p-%#jY28S<7Sw;r;AR@*RNR&uTp=pcsUM-9~<(Xs}9!rlc`-F4ZWnRGY*knUWt? zloUuS(SA!%Z+bv{PUaW>29xKf^l%n`y?C#S+KJWOy$^$ zt8Y3IP24##qhWcEq7Q&v_{$l#e-GA{rx{84b=xa$0nuV897Z0J*+o%O*P$=x+-6xliZX{D2`b~6Xg!WpRwOs^ z6D;7BQ)^D4$~S0nep8THfQ_-14yQ&lyIA2fA>Bunda;aY!6_#B5|PxLX#ZsWZWYFc zhc=wq-Q;$dTV_6DGCsZYmQMNyAqzwvT!55&KQkr=Os|m2wa|iquXN$}1zY7}fKN#`?`>a&Zlc)Wf3B$-H ziz4&$w=pPUe61eHD3VoOEN8Km&>coAL@w!`D%d^IS9NL}LoOCGxUbk`{W!zDY)Zj| za5j`RYIUzGW~lu7iznEIgS#;p+D#|=C7io;2c-Cc$`dNwd|r3RYge|truo2Vo2xZ* zym!-x{&|m^9A^$18?;{{Y~U849AQQ5KYWt+fnX?Bqv0>OI+M=Pnde6qRynH19`85K z4k?D+&^@uAPi?2NS2pjDuQGVxR^H+nZNQvTv$YG1z+KiBY5VMc@=gA12FLxr8ZgRY zCjKr)K|vy|J+vjT&odyRg|;PTPB=N24!Ph86D%+Em#lThKAqdyk50>s$o=u0Be9;l%R5IP)|}l+(mvoXb(5$ud`4wQ=9;VvC(6Sa znwpZC5yV}(C$T-1V~jvApgWB^FNyo?=9Ug*EcA7@h}dZsy=Cr|Oe-V#F3 zfr8F9y93sFbT1BcJV?st1r$_zzBra*qhEY3MX`{p*U3WYQXivS)&_|V`I8?%^0xuk z5`0fYQltmo1%vVOcpX+q*9{<-iyfxz_|Rm=0)+&9k*jeYw0MtP6j*VV zU*4^IVDkDd>m2OIhFGxd@n&U0`j$~m&gmC}2iPA2y6Y4w44VjmUv16{sp923rVkfM zmA?j`SR*8ahR2iSlO&jvRFq0#Hi9-iXKP)By%rE!G5M?&ig=TEK1rF>;viq5lYiZ9 zQChIR29T$9%j}@|-e5^l?x@7ZM9jyRUj>Nw39R2I>FJ3!QhQlOpt>B!c9Jhlz$1y@ z+OUpmvcorv7Q`yPozdP6Vt5VtWJA*61DM0kW~F$ub)?Ij*8;vwqy)vF z5>@($MzH<%Bcz?J+5vJbvN(JLGc@}@iq0~w$@lHUqiZ7VM#DyjFc4`+kM0J4bc4WX z#0`)hFh&SScT0z$(%m4Eigc@#0^&g(eg zU^Nrn#F)FKpKi=e84NAFF<4?3OLdDoRDjvzugnh=m@QG-6M1Qo1^pE| zN`bsLp90n#|9da~0rOL(M0) zUVOcS3Odo$$45+iIAz5vV)g z|FRy(l|Uzh72M3)jFL#R(vqdzo9jqq2*>GKYhois<*#IRytb^b6MH*yZ|^5HXQS&~Mju4 zpOGkOZX`=9*uF9OHM)vOK3A6uCtqXI4E2WLz|nN3n)mJls@!Bw;bru6zlw471ucq*vzAF=M!hyZ$F7tUEPcy-ki?b6NnQtDgDilH(HBBKH`e5Ogx7xs znF$}L4bGw^(Bow6mnXEUwXk}O`#A?z;O3Q2*-y7dO`13E4U7i-LH!t@Yi@1gaFJ>Y z5E_x3V$uM|N9J{kak7mpAi6>N$dr7)V`V~V)*&$$l&KIm?C$^sf4VmzVVQf={BOgU!~ArUbdO>as3BsC`|_cCU?nc-zSo0k7`Pnl*pIwjxmAS z0r#>{2dyLezU4uukV8vrqgXARJUBnw`#=0Yps{eQC7b~xvj+jrN%8zzp;fm{$!U61 zjySfL9hq`dj8pO*ImPX>bfgbS8ou*NmW>7x`A4R&9a^-Hd1d!n(E`;p?NppDa1TA` zohp!rp~B=wPwiN;3}=5WwKWwN3fD_i0Z|O^h*(|9o8r%5#DYrVot)d!&#cV(>xEOH z(n z2fRl_C(i|0OD8mT?pqw@iJ4B_%kZpU?6*2cAa#bTjuCZ zoqEpcVwSRGnP5|I9`v{d)I*)*x_~TFq7xQIxd=vGTcdT+G+2-UDk%8S18b z+B8zpnAGW39UYv2{Oq}o{FpDJ(wTy%Q@m6AT=)A{yQ^WPABR`WrJu%4X^2GS4S>qLr*pI?xCR-H>=h;Cy9(Husao5=m8dBbV+#q zUzgqVh!2^mBL1qXw-Q*hUD*9I!8R6hQ6GyKi=PMp>Bbr!nbFe4#7o$> z(^v!cec;6&+~FZo14m)_HD;jT!EK01oM%G+en9G~lK)3NnAv;y$8?!2I%DSNesm&0 z4O(SGf0!#wxbf~*T>fEp5IzfgWwKsX!ZR*t7o|nI-(e+6r;JkLT`T52fniski@CX( z@fDml@KXOFW2=VBQPbBj5sW=p+)AecYDcvQ0a#ve>FfLtkY~!-$d?lu(kwOWPcQ{@ zx0E4^jOEhod=>h+QelR(EB4Pb0xNOiLK^(JA-m_Jet&J6`lexunUpGm+8$ZsGgP%h z{pSO|P=7Jmd(RLZw=5rAY)BcA7^bA#(BzwAJtx8MS4n94V zA^TbFO;I8sT87)vQvb5i?f)y)gI*a?Pjb+fcuNMhd}F^|OvZT^%#n;gFzdDk8>g|v zkRZPRI4=GkdBFxO5KV~Y$nypQ8=8>O!@mcOa~X5kf%N&zMD<^uF6bv^BHp4K^ANUy zXD5aFKAtG-Ag`gsaKCYD5tqf!%FbIB5fGwAy?>I}C3r_w#b-g^!n{ zel3qlsuJ4Bp7xGza_rxl7^Qc@`x7^1g?*MC#9*>_=DLZXWEvN;2d&%0!8MJ*PGzuG zWF%@fa>&HMf-4Kb5Whwc3kpl@rX0rEzlQGyMfM)JDNFWJxzx${lxtkvlep#Zc^Ai5 z&fx*^hZ#*bm^yz8w8X+;q`}+HTaY-noE$ZTc)K8TgY?9H@vxO2&qSG|JtY|+tSnfD ztRsgUt#n&TGI4_csX5+P%vrZ4QNUG*P#s8ung7DF#}B-Pa?BsF2zF)0`=KdzBRo|x z>zFq!D=*n)oYyyN**5TM1R;UJjNzV7j?X^%+ujIvImo$QRR{B<*Bf)*z6!QGeNHVK z6(PVoOy4B@Tsi{}gI%Qdzn0Q}0aBADiXDU68O)Km=I?cx8rYiTf7;ltcQKGhq7aii zWNW|C+Xv4w6%9lNlbKVojDG1C5etV_>Qc~d@QrCK#WMk$S8YWU{L;>V{c>_M@*?l@ zr*!`Vgu;)nikmDv)T>DKf_@Wy-~@nhe%OeIdSS+0s!z*=X(nI=bsBDo6_81$R50OJ}D-W&s2t$cCo-ut$(Q2 zGkwpAiIQw`yyu=on>Ng{%yQdtk3=ZbXqoT)K%kga;qMRLwt#b~J(v{Y$7)$?fFgOz zohv5b*oBh_LKt*Lw98k{)iVEAqtbe{c8!XHA&N??y2~=m=@w~@@9oK;kie2v30P*k z{W+744^h#SA(N0=SwoFe*4O2nbe5DYg6*PeuZHLL9k&5TjqB<)-YcX8{$Rg8+sgSa z7gv7&oZtMyPV4HsLVbUwN2`*I=v)FjLwO!^5p#~p0Jba0_H7L{8D!1d-NvZR{!<^@ zZoFN<7q-b@r}9pp*IRW_#Ah@$;%w4aw~Jz3!4AoW*~+vxd4YJ&h%60H;i z7O^s?Ikx}TvtZciCu0B=^fl)gAgs_sHGZmtA7(By%Es>|{9hsp$x3joO4Gh%cGHrE z{q|f)D#2~B`LmDr7VX;joVbDiBR`w{i_5y5HpU!BlQ^{x&f$kITsjT9%Pf|jT=s3h zdugzd=H4>%cvE$;ERiQr&9PNVBDMcLMC5_72*`@OSb5^3O3%AMz^~lQTH$QLwi6u- zb-?uYg{w@76*mhXYKbTDoL0=c*y%QKFH;ISvT6;F_8y%4DNe@n6F>wh zaF-FHNMG;&Z52=@KR}6Vk~%}PZ+C8$(3uk>Pu{|z4-F*d->382R;Y{8yZCjwK1(+3 z4Z2nvy;=N~vQ^#K`KLak>c!KjGPK5_vO|}LfK(=w;|*vAC2vYl^zL8k2dA;L#M2oy zqIcVRTe2)H$(jKI+#MbEMB*^5&S^4_c@Z01^38ol+`}|rnHsl&-t{D58n6}z7@4>h3{ss*|fv$#tYLn*Uj5P~yA2fzGF`RCK z!mpiE%Ev(}_Bhw3pFLZ-js<$PE|EAd8)6 zks@xxOvch3x-8QD$)I^&!0hey1!%+M0i{HyLT6E_;#r{T+UF1Muq}+Gi-Dd6ew#;h z(re^C{-Vemm2`5No_&_bv*&{YkGPqk3HzNu79NV>O(TSfV4fjuE98 zA$!NUV=hs)>Ga*9eASxe#-iy03|C=B*QQ9zT-S32kyoTCcewS|R@t#OM?JiJVooIb zD@#Pn)JUopOMaNxI-z1@8l!%$L|iQh3wd@QMstFAoMpBKeu+mt(o`5@GNJC7NvOx1 z)SXW_rEk(2w(}=LWGaZh+Ab#*SmQ?8#MF_~v^zHbpwy)_w*X{%tN|gl%wBVo6kl?d zIk!#~A6hQl#RaD$^1-RXkXr@{>>q2I>1i?%qO8&U6E(rO+1m#rh ze_AMn(jc zhyjD@YJlNHG>`sX)$GDuzYg)VO_XNJ3$gl>+mVm7xl`B@a)Jz`+8=J4VOJT1Q1uW& zQcXtX#vR|7QsiU&@c-GnHC^CeNzrH>6yO zqbr&N?9s&>nVw7#4>Aj5l>2$v#HqPTcd8D%5{KT^%bn$n=iIRBczc#T2j99+8w#J8 zE4jT~*F6b?0yc}~vc-v{4*+a}MucD=$JH1^Qgtyh!>g-Grrr!ho%tT8BLIIebFX?B zkoP228U+rKGo7 zKcZ>4JVoxo30_yn3#kAfp~`?5>9CjU?x^|rrn9PL5Eb3AW9$5Nqryq{wd#OT-drx8{O;ZrcedG^z&I|(ZFDu13}cYZ zbXF)8^rHh!ey?kqkY+G*e#v(fW;m`)f2Vu8D99;2{1lm}#{+)zh}6>ZW`Z>@*P201 zzQTsXOyp)({MU~tHR)CBa!%nX0XlU}mN>G)Fp8#9x-xt@F&bz`i*=)-m5mOdCAf?J zmJ3gNBad>j)hhcR;E^Ol-22Bo>f{F$J7(qr#eLUe19Y^v8g7tCq2J2Zp0OV)I0di(mFIPOHlMosFnCMYTh0-ibWv=}{zaV8R5vt65raXMc^ zOEsGEHI8mq*LLnhr&vPg167j~830Gx>bJ zlJQA{*xO`t1#;iLAo<*CG;XL#{5V(fXqyvt^}!t}VKQxY%@W+nZbeuRrtJH80rb__ zy+tjxuCNY2+32|qm;n}R2gq57al|)dOCXvh-6>WXa2oq&kGM(F8rA*7w#x~S$}H)v z#FQ4kX4oXd4V<(Pwn%CncsJ+Ug8v(-P9I%XM){dg{W$nlr$ois|8Q3Pv z6u2Sxu3pH4==Eg#i3-~|<+fsvF>aQMw)yqo>zW!g13Th(b>pzEFC=o7e{~#z8X<9C zR@Z@n7Nz;1w@zlx>*2PNiAMU_DS3_z{)s!k5X>SN2|hIsEH}0hAT4<08*yKQ&Jt0> z!8Aq1UKy_){#eSc<)Dvf1Kv}9}q=C~VTa|<} z+9@*Fhx0PkG0x}uqVXmv(65tE5JL?&VgynPDwdb&h zRdp+@73F2=unZUKGP|>BimNH7iQAqAO@#>y@t~v$8vu`C!M%rG_v5z?o%zLS zouS+%XZ|vER|uVlvyms{CMj!zOd;!hF2amk`^?yQ)>OQ88vQLX&O^tF6==&fXi|SVC8(9SAo%b8kMPAxtb{H>6%|BD!w-9kpQ^WOf4{5^bBs_dp%|K z)8H_}G< z{!^xxYOv3PZrb1IXXCG99JxfvS$xHW4RUm1!P61^%&P2;L*lE-SXkLLX%u#8m7z(-A#`7Uo*>$zm4FGZa>AcF`hv z{xFX-ge{3S-7b3F_tBruEgiD1Yy>!ka^sZX=6m zX%KdBkKe+kmfMR%7PE7zpmci4TU?SR+xwcdVJP{JQc)B6(o&m-*MqdEw@rl^)02W(@J^GikaPc4Kpz+eorGaqs6$) zX!`SG^lGaE1eNjlExBgucJrgI2`RnFIMLXjt;B=?Y`Lbq!CAC~b z#!S2cE3z{lUnI2sqTF;?qp?Gt=rmW9uylBAz&Xwf2|tl?wGk2}Vy`W5qXN1Di-1vK z*sxh9?og`0u~jhzKoMCMtM8hI44zTvp(}gHwX+FCVKs>^rT}`TMsv%W?K;~oq}J=S za0VM$eyEhbG%uP#J{DG5ET4BCQRM(l=pXHTz!G4_mJEemVx#Fbp~sR*qei4*xBI+F zk;+?|so5#}cn0~R@FLMplj)TSn+2if?JT!NlJ!iFYIFRJ-O9)pwj+41(BTiRa|pby zDhQQngVX4!uI_Rqexx^N1aXmWY5$EquK4c*Ng)OsuP&)Fu{0R< z_XQ3sABSB|4fnkEpEb2@)N;X+Vl0HjrVtc%tRR!0RIkhT+X5p(rBtVJ2uLN?KN%*z zhn?{BT8kq^iw=2^?=Zs=*YN0={X;lwm+<%$h7i8FNba7tZMdGEXGHMTQ!sg4>G;b{ z_*|oZs+x-k&3O0bZ|GjSy@Qi_e0KbJdX$_?d3<6Z?N}qwFE7mCHPl~l=V9>>5Jk>| zeFR8PMVch?Cc3V~7?~AiS+ov0uC`{<_|kD zfXao`|Bx!me2Kq$)ZBr`LrIgcj4r<0@eU`4oPZ5v*k@^-j$IYWdph6ffi6>35? z5kukkMKxN(<^;L$n?AOoHRn3t3OC_;Lh zFfU-%ltYNK{qw%Xv~mp%eFXxqAc-@QX-MhsA6^Q{8Jc`VJJyy!oWS@VwS8aCC!^5l zVX_R8-RM>k8y6QW)B2kkBGqq6*b)gWHk~Vcr9WT*w7T|MM ze!U|u@CXZI>et793f|aQYx*3(FsXt*qZE;ZpXjUB@kgG4WNY;RaT(&^ z+XaF(#7#HtF#^yekA#n;X8+U$NXN=2k1)LE9d;1MzRCb3vi(OU&0dnGsQRPewM znn>kOq4=j5y(cYy_RLV3aFt(z6D&{k#{nze5jmG4yPs#05r2}88qjUU28nNjLEthN zs7ypoCivOo$(6l2wF5SK+!ukg3r6WFZ8&W2_e5HdLLU$o{E=GD*pQynddWRHDFNba z+}h$4eWJ!h=bS_a^YD{g@g5<0pI-3q3Z_;TVBj94JgFkg)qe4&xx1iXFtGd-RQLSf#DW>88paxZD*n&nUn^3a zrmxZ(SH%0xP7`0*8?<8f5F+}}e(RVkD!w%p?5sb|zeh!1U(y5`E6o-T#qZpM24O!V z)F6`jbUvJ2Bg8vKB1~JfS*nibcfY2z?S?u9Jfzf%#79x`fgH(Ni*GY0T2;K@L}X;@3oP- zwF)!N5H)SGPi$(_oxTQpVc{HXVf)Yd8~XnN`gyj<$5uldBH2}AY-Et8+u1MTqEf;m zNND|a{7PmA>t?~nf}5%iegTU$P3I4@<(+5}Pjf=GjSEHy28f(Sj!Exh%#7xh9*1W8 z3jg+Ee+pOp1uP=jPn{`$!FTq$)X7T;|K@d+en>48NbcQi*Pt$j65d=A9i#9FdQsXF z^nRNtaOXWN*93_t}O_ViUiuLGmZv|_7fd}*L;i@2IJrG~uIj#)7O%;PcW&MZp2 z=wgIBo6egL0@$w?LO2Lgc$YdI8UFJgT~Wp%3;WTm({*KGiEv(Z zIVWSVB%%_ib@>DS@J30#nj^j%bR~oxaO2#E$P|&v*p9Gi%19FEU=V|sQ-(a9^?jV1 zjvQZ~2p8KjIvI{UpUS0qWM|ro;#b-({8^z5_N~#|lfOVy3u>u_Kf5~L#*>YgtL{MO zR_8OqZI(Agg#+~#$pV*S!ooY9oi;_A-uap`n?T^dOmWAwnVy*J?!2aY;4s;P^Md@; zazI*XNzNCONUr2^u4u;pl*XRD2}@wgIehc}!Q>&xG{w5YOwoyGN8X7Pwa@h-WXO5a zGF$izw+LM_vVPABi$XZ26kXpMPQqwArBi>8PE1odrT%MEAn~`SVjv2a;CQZ7av-b$ z%7ha6kxBo^rFi`ENXA8`WQeXbot=#D7-0_8i5Vk1;-@Nbp`}gDx1Ryd(D-WO9{)~-dwzl@ zHSTfMruRT6Ctnn^sFAWwzmYmk*7@4q0GVROhyzb_$e3M??0!9A=eeo+s1ku56?;W? z61`v~RW()DE3b12#1zfVbaOKaao*2?;#&hlflhNS<-a2-;SnS#E#lW%pPAV<{VN|t zFaNITTovk#w8%?aQ_Ofv&*sN|6Eu<+InA%r`XqxkbBBcIgZWY}=zVyZv4jL$jS9&z z?qRtAx7TycuWD(8Fw)1o<`^f}La&EQEo{jk$%CzwKa=0TM==nfIl`mN8+>K<@fLQ@ zU8+;bg?&!MyFbaI5sz59M>>z57-xWQE0o2COR zq!ctfRwT&io~k|1!wXg&nvC|4gvpqqEB00?CVt2Zm-Tg2bNj;&a0_(9TsP){jD}7)4 z7E33O^GGL+zmi+b8(~ElIuf(CYfFU{>T6Zu)a+fa@3Ob`C+zIC0Zo?05KV{aApoD!HfK%k_{V;V)#0ft7WC~GuJn)9r zGq^;T#Yon+K65n1(wS0c4%W237I~8-N>(IuY&3^({*mC7d%Y)=beHpl%J!(_iN3%r zGFIKj74IAN5j0qnSX^JXVl!I(%3rE_e>)(M2A=^NX%aPn{HEm$NJ3T9v{;jyMxR1Z z-lLG^^eDxQSi=CLyTAQ21q?I3oSn(uBtdX!NW2`j$R>gKxpcKs4 zKccF$E>sraz{l1!WH^nVC@{(g=_(>iyKC%?(s=Ghph8DLEWk?h(27*rXISZW4;$%t zzv+m}*ZbN^;QkKcUra^R>#zT{N^lbe&priY*#IO`M}F0GEmJR-*Gc*~ep`tYW;N+HhQo7>g zGzB|&ZE#U7tt6#H6!HgrkfJGa22|u=pPfgjMhL+9#Yh6mdE`$w@8&`C4W&H#Y<)#! zaBw*>gd+^}Fg(bG&ljvPMGmlje`$YXKs*LEqUdw*8v+E#20Uyg-eh`-{IU2yfUJ^# z=lolfZU@>Gb50nF_r&gAgHcpXop-5_y|(OYM~*NS+NoS@0-^4-)0biY*!Hw5NUTTq zRr~Gkg!?a%GXDm$v>4DZwNxbLBJGEj8Z9q!UP(|H*KE&mR%lf!rs4L};1u#foC$g^ zT0cR2zW@A{@p=k0==&6iWCY6FZ zWiSGjjw(?ffNoj76WIF5Wy+*S{osc{LC>HZ`7oX?US6ipomZN!&4bfyiu z(AVLh{9cUj04GOfz4xTurpj(!UI1Qwh@Ji7xV#fa9TlaH>pg|!1y>MT%JAg{qbltq z$9$e?5e_E4PMeP%Z)^xkFUa7P1Kwy8-3tJ^O;YyTI7#|nSxS;;vVg~<9=37E4F?mJ zZBj=h1H{l4{Dy~kWF$#_Wl5r!@}l&uQ}75Z;=G;@T}ZIC%&${u)V=D#yC)e zV-+BJ5M>&E>vVN%(r%=tJylzUdS9vAmyuqm)tQjnZ%k6=FUkP>u3ycU>y)weKF!+0 zXMhz$2T<%W;-4=xaz^htQ`e}_Vl~(V_%l`}b$x$RGkYmYv!Di=@aPl$_uNf@jMFeA5H)>+PJ#^ zJrvJx%eyY%PIxsdpKSI7FkV~OCYYj#^ZWAWV;it!>0tMxXAW&CO^i`pFvr=>9-7Ou z8uvX)3qh7C$oS?P(Yr+hGBtNdc~9tiFfWl~bP8pmvYvxLkb( zlSfMuP3UwIt@uBB*Y=H6Uo&XFm9-fR-qOb7#BcEv8%EerIVHl3e6#_7PAi=|3g{_( z>eQqoY0$vpUWYf@q3QK3U8mvv(hL*~(V6y}1%uFJ$l^!E}?bI#qIC19b36}_lah2NvkzdUa)F3N2odR z|3hW@xY(HPxR1?EG*)`&&2-=2h;%>{@N)>9LG7y5ueL(h!pN-~4=H7g5QorlJ%`~3b3AwCVTs z4$2uTWp=fe$yjS0bcD!RB2KNUa=I9u7IV!gcdGa}PgyyNY7KaFh6=bXQ%(xHd_1+m z?IuhOgZpIiz8fC#ZYn;n^P2A&_8Er8mH5qiZPz|n{L2`~P;KhW2_|;<(7BaAXwjHR z+=H>&g#^m^vM-&Zx9nf4Kp2?U7gFu!9XqE|UeoK zwZEA7lumvUVneJH^!=$$9C58+mhrR_Yxp9syJOa(Z|>mRZ&QN4mZ<4=e8fjua&-xkpbc%>R7{Br3m7qSM%krYaNpu zfg^V+U)BwXJ~cjmT<6q{{H%baDJW7MiFeEvPfWM#)|HJ=)#?y;*`aS?y8mm*s3Fj0OoGxnF$X% z*6QVA#?RNZigtD*)E-gAry*)U2!`~Is=e}ct1QBQ=h99NwS_s2)TE)1rIujS0|YKS zL=>c^=rBem@8on{v*{3Ec1aroudX+JyLCd|yi%#@cr%K5~se3pbF%Wp2R8KLVAG8w~_ab{!NQgS( zPj$DfyS6gKCzeSG(?E$uzDMP+)PyBlSO)E?PoDa|`l+DAAcoV)>;EG4omGNFcpMhO z>U1}+D(LcBLKV9PX?^Z#S6j5IC%rmQS-ER;7EsHa{G@wLQtxdUk-yj`Chg0jna}1{ zj;AgH*rZLpF)sE!!9Ke1z%S9r**HWWW$0(X&*y3WdFjH5Pl;{VmuL1( z?QLo$O2oaMuv3*O^z}GJq z1boPsJui3WldowLG{i)}RxW4|;E1!hd}bv~k}iMFpdD*&F*4D*<9e*s=MUetTg`@B z^C;a7QeW1Y4kP{tc)uwi@`VUgWKIWS-;8mgEV7ee-E=KtK-o|j>${)5j5jQJUT)xu zF}WZ~))o<6UDsqU>X6z~LQnLv57JJ*D#`4{h3hf}WPv^f3ftkmu=||82!$Gx9E~SC zT5H*)(7=7dHXXHNypUcE)@3_V)9$O#S6Rd?v20_#Hk=e8(9TB$1e+B4Y{)LkF{RnI z-faw0W%_HN#wDWGw*i-u@9Zrz{tX|Y!it{V!T0JBSxIKs2ZMQH_Ui$XVm!HkLct~o zn}q>7R!)WotgQ7L(oql4lxJF+9d;U<_&b;a=h)T(-ej>HstWWTBrg<}b8@>u?I588 zjJ-xIoT;d=;z!?`62I~fpZ*5=mx9#5M}t?2{a92o#bO!Vl;l^ZUVt@dRe>RhVbIQ| zj!H+l>9z`T1P;|BmvQCd$4e}0)7ORs2osCi;BVqt?-C6DJEV=OsnVYf^eI2 z$Mp*XviO4A?F7uNDmq<1YHIW9)nXSG$<0;Ve<6<3hTLE)^@Qk=*4h(i$7#(oIof-HywgV?Cx=bl9MVer)ScO+f21r@Zi@!|&eG(I zg&8`szMG_NNkK*)tIaAGTUhJ6ODBF0YO)>wpt&tGy3KHw3^DlD-InqN-e!~-$Wn=- z-kql8=MYR)M&^!bZO2%*z;u-@mL%=lO?6|?ngr1`gV_@PCOh&o3r6Wz z)o4B#6m`yUa*k6?^ZQ+PDA|LrY^kqm>0+yW4#~q9U+#zRyZ!<-^cMY0Yd;B;|+s0Y0j!-A#zP$ zz?BX@<^}MbYog+k{w@lUX|ip-UggP^A#wnrI^oX03^AS*J{J?pA}KOHj(?~cn;~jB zBVHDSGbBohIC#ISG@DEVEULYc2;RezWaNo?c7*EO$iCpPg?YPkL_JU32GAEjzd+{%AUZY^?F3a2v@(k`+ zIcwnowhsqz-eGq~?O@zj0qg8SJ~9QeSMKq%i*;UbH)yB0t;T0cu^IL*NrD8PbY(mg zt~AOyOM-qm%4kaW)Dd^#+^nkIK=nWwK_tv1kIhFyR)a^AnPdq z>WMOhDXA5=%#lyTEJCgMpp!a8lE9;nBAr*aI8=BMy(9!-dT`-bN*#-3I(Kl7q_sD~d=ENW&b##IjWmO=HE^x9?!syC!VW8T-K zcexWhoYdUj`+aOlV-g-0zX_xXV=iKS-mk;Gx6@4 zL|`<>(-!i3j2a(?<}Y_-52g)U;O|$2qI+hdyDh^ocXA6bxA(#8&I4rRX}Vf6w{@IB z=$EmsjZSHdi^9z{tN72Eu} zdU0gL9-WME7`>H%9IJoK*jDtE@D^O#$H~+yd8DIFE4@o>N$1FOFM&dI*Xx_b?*_)?HEWu5ToT@Me8B3_NS70yO5cvTj%Wk1oQ;bZ3 z;z+^IXo^mvLFBp2Q?BvUGpxT50z3PyJuXqwp9mNQAC3@Q<$?VTORT}1^={_TC(dLn zWOp;7j#XpknhS@^&eikLK$FL13nOWN_X5iPq38M=5NKe z;{3=G;mYJ*YJMv4864`}SAn3=6GOri@Po}>-3w(pxU@xT8vTKESediE=9csV#!e$6 z;e&!XGRf%U^UE@lB%~*L`aApt0eqD=?|_mOdO^Qto^gIeX5o)vBT0gJ(c&rUd%<4Bq&jmU+vd35oE1;8AtmXc3^fHPC4F` zKgdcN&<+m}af3s$o)@L+g_cE@3aS61t}H+L_fl$t-)wcP5$~IT6j#+UNK1HFoc%xr zlHr`3-C4N6p^z$u>awJ)vR{Wx2b(rACRpsitIdZMThtcU8k(VhdtVUK^@G2WeqGpBGMUDmFZ8jGcAsNxNq8WW0bl;LfB z&ow-*m<7?Ra0tLSvifiv_%4GOdRapSCVY&i&E<`0>83gxXT~)+uWyaO&_`)>hNBLo z5(T?$g^95wOSBQl8lEKD|_4))LT4!F&>5|z$sDw#l2oyx`T3p>4h|@7z zN{>0n?k55oU;C_Y3t_^SQ0mS?^C{}24-6Qhy^SP>!wB>S8fWB7Bfh847A#r>u|nLl z(Y*zKe+sH9y{O5_#JRiFQPz(ae$ZGo_K+2Hawq0-6>8*JvWBdhe>a0m zOHbCJ8Tq_=f~i(?hqOGq+}%=*)`)_BK%2Y{w(d8APR-z1aEvLW%W(a2f4*4LW;>%n z$*i08ALIT#~pq*BBqjV?*eac1ZzrSEu> zR80yqXbT7Z%;`$mC{W%F?dql`&12~C^|VWc>Q;AM56diTa8Z1}7Vd4nWfDL=WWN{> z06+pp)bOs3pGAYzpX1xNVAQhy@Cvswqnwqoo99K7EV##J&(B~(|P7mSOTN^Wh9~LazNBHZ zx}yWgW!eLL*;sJB${$2fXt?;9&V;jihxV#S?Kn74|BcKL6I;KzuaYm|+1DRh16`Es z5OD+aW?+$WL=g!n6-kTJ>`#Q-JTA9ciQjN`@Ba=G1@NX5ySpcq^Z_~w#?4)ZEtmg} z9Ojucr%9rYnYHh#%%sJnYB0g<88(guUjcvAiKF|57rqqsCqR|` z%QCxvF6HB!-yM;rpDz!Etxuk_5+1hfzCmT`H#{pxLCN|zYFiy zEdG|ZE7f`lt4I~Hl|;V~5FZV_&?Z$M);tQ~Y8fdmmShraJ04-7+f#ilkY+7oc!XT4 zu19zkf4}z=eaE(XB;?ygl0&*u$|q+L-1}qE^nH+O7oCUfQogff#dqii{oiCF(&WX| zHxCYPP|PXnQ;e#fl}SIY!reGKdZeU|;{5!5(Y^qMdsu|0fc@IzeAcPI$hEJiiX*1q zv{PAh(VdRRGx!J%$vDPZun+0z?SH;1i6mM30M`1!($aVM<)d7RM^=fUfTyfMr%Nt9 zfBfH?vfYSSi6Kh(mOXb{q%h6cH2Hx^aJ{hv%I(ecqm!3;!%g|$o*I$WbERZ`J^HSh zKNuOR{=D$;F7eUoNZQxTsGW4}3k(*CF9gu3k#Qow zqR@Q8%HPd}BRm;21k3`VH0l&T%%X<>FA)#!@LbWlumFNd#Z|yT3#rRE!5z7vWKua< zHkq3k6Kj7Zyi8TgZdd*;PaQplG>oS*0jXVE zv01Jd%Np$rnHz!Ulk4qN;ErbQGF?XES*h zzlB;E1a4LnGw)myszKqJhJcnUnPiCN+bPPnbGDZ#IG3lnN#u@nj4Lwy#YPmc;PKl% zXexgwklsp5F^xeZX&_+Z7(G2j7B=Q13$PQofx%t0>=zPp@P%Z3$bW~vX`m}9c}XWZ z$4^S61OED)fCxC?PyNXVUn z;ZEfzvFlZFScXQB9lKlGBbqJ*CD~h)A-#V{pb47gwtz6X<2dG>fUP35jkwF7uWBv> z;YLp7{NIH_exhCi`L3^@}!^lfXC9Lqf27E zONPq@0F&3(@##{e%W*`B3W2$%!RR+H@}bFzMHk_=xFw!8Uzl^xKUzvw+@}%xCar(s zZwy||acHPgW0zL>w*j0F@T})eOlckZc(d&jTioheeYEjU0+v+-6V7rEO~XAaA7#o> zYk!7yWRe)~C9se%DzfB*#{_zMVv}tFM^^CV-IcVr$t|_zv@5tt8|8o`4pjaf>f=&O zOv6e1$XNp*j~_a=ap~T)<+zbf{tJIA%XsafyIWw-w}k|-13P)gpr;WwVrzaLg4WVo zy)y14iAsqfD}V?%+^6-e`G{!aukCLlnT(7ii#yek_bc|uswTy|A>_PwGhG22WIRL@ zv<}Df?L~s;S*(4VT+oo&MQ`?tX!n(aB$Xg!V*vV84V*H`HN5#dqh;d<N~gASHm@Pp{#{3L(r*9nah1^H$IWA1i#^=hPnEdQiZrKFG)`yb^J>my!6>Ojauk z`-mK?#!8dMIpT({7ajJ?Y1E@-3jz)(NG@8ixxTT5qO#N#VPZ*E;-XNwN=CJ&y{*Tl zIZZ|;ig(HhA+z-y8h069bY9G^3BWA7a%tE@1)R#N(gPYdLykYfoxrDg5RY!s3EkHO zW}U=9H)E7MQm_}ajy)1W|Rw~eA9bF{YX`-*XprA%d-3+pLTIU_Sh`Pfd@$8ryP*F!Bz z?JKY(wsx=t9(k%(CEUFQ#8&FXu32Makh#dIapoG4eKlwViZ{!Q;FTn)810R}tK*#OweeS+Kx*kA9UgLTG~9Qif=yvb(lZZ#y!xZYOR& z?@v$VT5^$bET2z^Tg9kbMHJR=9>$(m@)X;wL4Sj^co2#=c1-C?hkV+IGlyD-cHmJocjHBw_11 zDouK=Y2`xFE?F7QGoHiJt}-RW#+LEz7~2I+(J@vkP8-*Q^r|4#wA5m|fbULJ;Dg8~ z){|Bp!Q!@+f~nfxgz-XQVuaR+q~%xf>sBU)3m|{Q0Ht&2a4K#HwhJUaN~lD}2~X4O@|IRn(wP9TQ_QV+~I>%{^hFpTi{2iKYaL2ukLlh_R6ngm*dO_peyQ1B|R zCoVUBRh;J0e5JWAF_1qxg94_30v;3;843+L=m0frNhB@nsEKP_~ zJSYV5oZ~e`mLgK+urkUr2dzjJ(q>f(6+nLlcLB$Kw1zTc=Xs29**x~eFu4S1fr%K; zy)Y+iGMr~UeX2leG=e5T#3AdrU{mH1B1EJpFtnZbM%m}-O5h`-C?#Z89SSm)KT0l8 zkwhKCDxf1DDUhyDwHE=`0QrSxc|vynB_E9lL`b3*C(H*u3bD`hrUSRkNo~$g_pyJv zfF;{Afb5%weKGma1D-Tx<9Y$f$R&S~rEnSLjBx9Ker>I^{v$Y|z*oP(wutQ`FVvn7 zS_D!J$*K^jPV5H3_4G9|L%q$bOW9f`X=No;W0v%+>}?rnRJheHX5EQhR58E@9CoM3 ziS~>eQ@MEdJN(D1cgLkyA`fWFUub`Lu0*kt8C!5P+(_m$MZ?^)Nh1Kva#cnEsz_G> z3YQE^Fwgg>Vn+Rq+C+#-kCcuZ1b!m3XwfqKx{m1103mWh-H)v%got9klF8Bu!)R9QZ&CPE$f%SqEr3}h z(nPV~?s)Qgk3&RQ2|=BAtTc zu5aw_6=sQ~Rvdz>^G1C>lnQ_4q)Qz}z|V4s`#}#Nz$eq_X@SgLqF7#oZ7FCNZc=)W zV^m1w)LSGH8z-UkpbK`Fk=;w>$e~xcCz14^R~4ja*^uBBIG`>;_L)`qY>#gA0eQa8 zKqZKf{q3vXki*H92IViepBo{ zGgb_&-csdv79ZWs1hz(CV880{r=xepG!_;JA0dFtcMLKpW3gaZw4k)iK|K^>6s`a* zf)JpB-omX6X-%!qEKh$y+Lgdz0b3o<=|#n1%-j%0Jt+)WrP+oJf+~QNPWfis2I@cs zfEe6xdh?0^11gdL1Rnk989Yqe1{xy2-C@D014cK2R2h8KVn5}RhF+eHQZfSTELq(e zx}F(RYh&}Ouo0V$tTwp}4=hf1eh0l40Fvj-TsRI-8=HZT%8P#i7 zlraEOSh0dL*ofQp#WVxsP8bH*%yI;SZ{ePlfO`p*0Cp-t_H6z+pauoGe25XZ9)%D2 z6j%u%u(*u*w*(W{XgR_6G+YY$&C*OEK)||_oD5)Mn2d^ICW<2P%HZTE&+AbpZwPz0 zB#7cS2NfvAJx6~P1{MH!9MxHjBEeS5jQaXjS&Krul1}bA;+tZzJa2^k}4ZCNVeC4*etOE3-HLJ?&JLC zpkwZpr?*#-<}MC#$QczZs}f17%^Jq85X7ngVA(B>{{VklY9!pL72HpBzEqx3&nnr& ze@eR&GU64uiOC0WY~hDWE(0LAn@&ZK=5R^se(rlyV2+k4?Aj%f)-aMDSwYA?_^ey8 zvR5&+JvQ3VI$Nks$K_ymWO^F7NQp$vwus7wC19lvP@{J3TDC$(JEVUkAsY&lki2f^ zBAEpywO4-!=O|d`1MZ)~fC)7CWsOweGK^(ufksU=l;vDw+)xD8(8~#2Dx9CZ7*H!0 zCyBCK<;myTfUz1tz=kQ3IpTmUs&42;?ETi@{&a>;sVXwD1y|IZ)RqjB24)SrkKyA# zg#bWjV7ZVIGyU3Rj6PoA+dvJ_Vt_B7;r{@5e<6QanX<*d`nUQuXCj$FKI8r$&Z!Kn zf7Ufx0<@od^QsddxBmcG)Dl~Mi$WS0JN+uzMUnSg@cw3?WO8->>` z>-B#$0VE&lN7VlSIzU4I0PFt%;8X#oKjX*#15yTh{nh%Kq$8xa{{WD3f4fq~CExsd zAIJGrF&vHG-(RWzLbgIH_Mi(^fAQ--`-Zcb)lc|gAKh=I2OUHwBOiD0su5iM z)%<^z0ws^2`U+?ZBkw=ffG0hF3PVKi_lJM`r}^ri^i(0|n3{{X#M z%-SScmsx)g>ncV`FWfYSS6{l+0Pp!`)PS!40Cj)Qb5?}U|Jlb+4Tt~$ delta 21243 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
u?`8W(3~|l-mosFuA8V{8FaF8V>;$Ka zD{L3-m+f*;h&KCb{9Q-hppCjCgjjF-T;0eLUC__$(eIGpU?TV$W*-C?h671}1#Wc?^ z%TLhPONh_BfkRuC*Csc3LcEo%99U&)yPLk;HXx%1Jx#^F_2RY1wY$$k-pTZR_-@!b zIN;!tCB=8MRpP@%n)JqPH3}^(zRg&d%j-{|aZ}|KKZphuvG&p#5yeE#3){9_VgHo5gHo zv9qGf_++VNAdR3XdBpBm#?^X2=r=jb;ht!M8j zgp&)@k)Jd?T2QR-pJUsRb9 z_R#E_HWUAy0W4fb;+=tIPsu+(q%OKD?t8(^f6p%s?<>y;oV`i0)bTxfthQo|Ob_dG zl`NpPgVQ84BW?8HX+^KBJd&2~>CGAB6j)xt4iRwb2G788Eu@%{8y8zjVL)iA!Q}IH z(>#Lw*>vzX8ahvNzYtfau7lK~7F~rqox{c8x(=2F-L)Z89AS@udF6u4Y8-3|~o^h}lFLa?y~F$W<2o2v3D;S$24 z6-0MEHhWJ8w(!if4X$+rFGv^FamwX#>^B_&u1ty5U`NRjmKf;}vd&nq9hr_o5HWFc z$pg5#(Tx21aR4V4Z#d-PR5mR@PfoRgd?*soAh$H}Sulr&ZR9=; zxfREMt*JLu!}Zuoyg&PT>@A*iUFVjenq4P6C3YX5O*=QT8A8MqzP2*yYkuP(*@9}1 zKP?xkT5MVNd&=)>D!&@Jbn;#&5xi<|DxD`ks(}y|9-ZeoH?KJt+)fYZv-t3 z{pmg~33p>-oQIx)W~D~s3{AJyoW?cuWR8)SkQ0|($GNi3*c?O<=<6uz(H!h{E}LvP z>~IX$j}(iBxUn#Vy$f8eu^IskZh%ClLV-?^pS&6)I*Q+3R#tr7ikA^}m67>0fI00( zY%<<5%^ywmu=k5l<%*K;xo2QLb$m5bSRkvyM~WuKXuHHB$e7PsB|AT|<0alBA+Kp(NyXDUdUneZIhiHBGojupY*33b+ho71MsE9h6(J zQ(b2nd~8xE!$=COWW$7h%#tNOk4S*vkkl8M+(@8+$VC%AfTp{d+6+jN>6c&{6q-J# zB%;FSX1WaiCIv6(WI8z8t@4Y^fS1a2e4%be2e*NgW~uRs5H;hlTqUiB)=E(hSsgOu zgEKJ4QnzU_h#PC;qN&FS)sSvCdqzee0Sg@0>up>F#3VCAHE$B5KoM%wl8(YLUWemp zlQV;*4OvUjp2YLs9bRO=Xbs6 z{>F}}S3UmV)I9v0T@yscQffVVSXD?cho~XId|jtKrj7wOBpz=PIYPf<%$UCD#^Dn7 zX`D+e@DPpayTh8WD{J@FKqq|Q?w?5$-=F3WE(>1@)j{~~7nzHf;=Q`}xA(k@)EnC& zNyh&3Ikam+oWSBe&}cGW(Lm~n&lj%(RzJQazhg)6UCwp{d*4lQBZF%t%EdqD?JkZy zy}aZQe)YHbIf>o)BeBB?flpGZ^rA1OSN~HM2N)B&02NrOmXQ~ahE?yajvJk~Yz0r~ z>Q)>~5+_D>r5O~RZyolKaK5;Xd;?c&!xlKq)5t5=;5OIpBhi$~c)B%l?jX%gV-c!z zZ?O0;c(?dFj~=VaA_X3JZyE1=Ap#Jh*3usvVMwL0B*Y8Yz@ap-CzFu=RWuM}Zl+Fv zFGfS)Ea8>HY2$%&L^!+vXnN8Im=&@vP(<9F3tfmZx?yC7z*dtfv36cp?pl}*7fQ8K z)NBS<=Daaiqj1eV4;4w77412ny@doo3mmgWE^M00e~bbc6^w3<#{QYasQpB%doj<49%>4(nmh$?8TaG zga4?Py*JzsYnk*Gs;_DO54c`Ux85pMO=Gu5l#u33z&UZUE($s!26Z=8G0x%~)VD!)eBALy6*7d@;5@nPw`Ysph{)F3)CXxa{;t zbNj=8D$yieedy=&nGlX*+dVSlO$Xk2S1FAz3EcYg@kS6`PH0@#MA0P=M; zG%caNto0T9Tic;mSI=1=f*GL?ZvEz5)pD40#Xny(b=XX+zb7?#! zYCNkSTYuUJ{UCNABR#Nb?RhkIi$A$Myr|*Nk$vvbt#9X5dCKHmaH?SS6~#q~9Y4J9 zx8_5cVV?vwNs(g&2R`$B-j6EL78H}(PN4eobDrqoNA2V?Iq>KQ*ok-34e)|WzM0{< z!f7!>j@REaVCWXg$XDFOz`WIhQvbuHApCrsirOPFaPa zmA%GnMOtcb^FnI=BMMnly;xQF_HmpgI@VUtIMJ*mx7_75;sxBSkQHkM7tTBLn)CoX zgv`v=5L_n-(F2T`6)(&XWsJha^Uv9xP^%@?OU&)nFk*(tSDMF+25K+K3zQ>i$A`~* zHL#QqV(_9xW#1wRR}?f_3?HMNt#@FvfF$(oTl#TTQ4muL&I(%KN>Z5qiU_!`2#0baYGF*c5c1ugq$IpuE83N9xG8uUN~^VB=8?FLq>2o z)pgY%d+)wF7|=4`tAxK3OKBFji~FXcvVbr@pf2q0*SH|FaBhv;14rbmVy*4&pFZ3l zBh#pYs@z=z9}1v-4`szT^Ey0+TX)|-f4&=iugUh<%Jt%@K%zjygnHf8 zyoJ%|N1pMf-0pG3@Lk-x^(OnI#Zy$*_LXUSHF!l~=ZF88@bkK6fXK(o9`#|lHRBtP}mSBoB9+tSweo8V&p4N6}T)|7;bEg4Re25qbFc4h4zRAP6rJC0;oGB0PQa^q>;8 zy_hfptM;%Q)L-3HP$QLVlQLTKz*(1YQHjC>ON$`7PnCL%(@|5Ot97kzMLxU+O>a`B z`#z>5oT;nPglxF>fiE&`ue{5Ww0lWXf_o*ThI^$Y)>E2}daFj}%lOUzY7ohd>5=NvEZjE{0^>`?W6_b-j})o^jT6?qla6B67Clozv%eiDr) zLAYLN$&Ji(ue^|CSH2jy7M98JeT8auu_f5^o(a60xyA04?-1XvdII-2%i&PwyQCRx z_0H)JFHiZ4v z14AyOTz}fdW3el_ZU}CfFwt2`m;e1B?F~!p{A;T$9N+Jz+}rHCBZiqlsz+zdXrmLK zI_q+uGrG#(`g0Y0_(B-n7dNzBoJ<$@h0MaHdKN#ej5(!poshX zP_4Ec(v2E)21ixXoCEG(BY*z`zMgxRUSw%#{|^wBKWq8_{43hcI7N^B*veGlnD8@w zTC%EEI1-4Sl+YO~*o~&FWKA#HKl-TkrN;f?1=~O;{HZjq??u{~IFn`^U0HpTPF-gV z%A*>L_mP4ykE(3HnTgiRlY2*0{G7)p_Z+EQBJ9REuF4@p>Ca)k&Q^^Wn`ZuLYN%)Y z=4kz!BnIIFB=DKy5kr$iAu~RT!lZyy0^L#_j!8x7fBGkxu8OawTtS9FHSk)hQ=mOk zt=TH8<|wJC20HfzI_aJmlgzL?R3`Zooc~;{AJ^{08z$U1%~W)xqwE(@4beEP7je6x z-ASv>VRGgAIbgb(u0qs)+_Y{!$Y3Q^k+JG`0dwg#p=ahbqrQbVmN68EHkS>Tm)@q~DRq}Z_qJ>S7!DJ6xP^an1lU+33wW9Soy zmXYQrp`~A4tM(qo$=trjHWQfy=DT?0lsUzs0CLQr<|bd>Ziv?2)8?Ak+#OJ!RUT>U zkMGwHD={RkpI=I&zv4;_)UoG=v9S94#|F8u3!kZuwWHc3SKs(wCXsqJkx!I!5=R5a zxu3o#&i@0_Y(8cLYs@-eJp>E^a3bU%uvDX-U1wUVEp|N`!&1%sp&HamL9R3>okYnl zacKgvK(J|4utBHS-78*y5~Q10{{eTGPo}X2bGgq|40}u*H0l=J_UQQT=SZQR-VA+O z9-l$<@aT^`aAcVs#;-j((<%pCWl7OVAM!?Ae~?j00kq}!eANEm((NAU&+WR1q9A;Yd){PtlbS!S#6C30+!bG1@%8UN;1q6& zq0W*Ji@z{ez{G-aEU-jI8iip2?@X0eBey6ez`vVJgU}$r+%V8;I%0P>8R0~L;mfhm z^_b7;Bg(41v*pJJ?S zWH#Hk+Lkv8f7M$Q$m#z+3BBAb@8SRaNqsgd3@@_le`LxO>f3Ui@ziDRl*JZPs z)v=p$!R^3YZ$MY7^&e8~NTXQ9qYWUh4QAC*W^ZT z-BNsQ;(Q;pr2F>zcwqFN55hI4ZY)L#AfP%~de46!Q!x4^v1YMtDz3yZ8H;N155RQN zV9{k7%;V|ow9qJKMjY>b{_gg?e!X`zv0Z|>(&=%rUlYHlwwSU9 z!r5}QHV|67|A3>-aQ$*^jixeV!92V}1DAL6h-*RsuUm4{L0~$Ucgo*;}NM>)_ z-`(*3xxb05wx+kGNf_eZRTt>|c2#^mWm5sY&spD+$Pg|P@7^tJ4-<-n*y{=TJ{Zq< ziCqDI*1i;3el?NzxuvX1MgLNdZL4h+gNvp?*^=+M&(TYz-%G zxHI%bSIL4a+PEsf_NMaUov71IeTUBJQqRlaHF)sQ?SB9dtw(oAvCo$Qp#ZweEkfh* zlSg#$Cr%MkwZaAGBcXVkVhsPEcL8FNvDkycb-rlou*}-Us}|wnc=+O3be7CudQ1l& z6^lL$1Mg~mLdRc~(e#2szjRVNaPuVK!JY4l+9r<$3*6FV5E2zwAdouF_$g~>0|zpr zsQzFY89ELf?k)mMdyR;uKuPI5i}K_$TjSTRKiKnG++e3T8@&uMuZ7VI!oe&IVt(z+ z`+Q*5)sNW3ptr{Y7azrlD-675cDda74|r^uUa0SQV{SrSY%<$Sr`E~o9}wPg3EVFk zM4K4rb9#zj^0bJGRux=7nK8`{0dELAFn{ra{Zm5Hp!{bqtEg|V+o!ZQ?L_P)rmv0= z{5Ec)_3+(s0kd7*m)j4!23*bXBBM!+Sh?@RH}JZ8M*YKd4yiG-Y3A#MQswbW0Y?q4 z&UdI&1F)FSc_Z_0Ypb_uunNuJ^9}wqqny%zQmu(n%JYVq3SqDhBpR33_F$l}nIr=f z>QTSZ358ojBETb1Gz-7pEsQ>U-Syi<|gOK~b8cT!RKjxuY*(xA9buiW|qSMQQu( z3vGMBM`YJ4?4OAjKBbhN(|q{mt97DC!tIsNCnhFMNx7$9?UFA;QlxKx_OCp!f9ODj z?9$%E6o{6$yo&x}Ztr!(kPYeyO6Nm>b=Bq1rQ4ypnOl0VZ|y{8zKgyh+2i`=u8m_{ z#^{h=@WuCI!|V#?=kZM|{F@QV_wK!%$#84S?70;PAHk9wU<0`d!M|;k&#~9Odny~! zc?Uluhe^wj&L2EiD0P*4{zLR9>=vP0cjHy~Qs;%f*L*yF`E3eyTMEy?+Fp6`ey)?^ zgxL|QIgLZ!@o~>~)2dxGM{vv$nrX%R=IsNINsEbJUJS(OMSMm53LrnhftS01J^ucz zNZx#fzI^Dsq5r<{edYa_E!^;U*hQQHGGB~p_R3piw!-l~li|^QS232d`hF@cTL)db z{~kZSCKxZxi_sjfa1R9kJW6`>JDTw+^W)~Hns({-mp|6HV}ATsIw&x?X;@~_EY@H) z8iL^-Q!>12f1u7TCe&IT{MV=VszQkha^xQXC8Oq(h?5xycdPiOvu(c=<&#Sw-D3c1 zn@XclC`0PNd6)-3BcL+e>xu>*O&lu$C5fu!jP3#=pO|xzH<%FMd$LC4?@;QxM1aOv z3o{#C;l^b2NC{`}>51f*(blY_539O9H2<%^I*G+Ftd}D>+tM6!M5fbCeypH=fM>XR zpkK$=jzC;4{6htq3)g8ch#0LDS!cxj^=h+gbg${GnA!54`>aZ5E7KAEH{$S!@4a4Z z#;adxet`l%*+IF_H)PVmfv49e*FrVEbM%MM<7ku=tb+#No+KC7-!L-SjW?|xkPO}K zPiGrm7jmP(E(uzhWCYza1%#CtANv>c$Tq`7FWYTx^(kQVkKR9Z$NVY3utFm*VunZ4 z?KaQ*DQqGNzQUSbyg%0dhB#6hlJ>b!sZLj4!W#Fd7nJ1t8#&oFGI#sUgIFh%FPE&= zASX^%Ci*WIetQVf&vr!!E9H$m`y3Y7Z^_sTPHCNWo+m%YM9dl2+&dq_gN)6R1j#;DN4J z4BV^oe(Bdz9vW=4*W38;W+x}y; z%^GT7?ZSLsLNoe5evYiOi@*p5(ANA-;4UdWm-yk~{-QG7ik0@iAJHxq(??r^x6md- z+kNu7OZU1SN+H!JNv8x(!znEYj%P+1Iw-6wUbd=25#GTg$Sk^?Oo8 zn7xZb&Y_?m9|$s!O!1h^Vj?^s^}RR|L4s;qHIJ}m8xnfx^F;2-h{byfDH#}Mx{$C9 z`fY?5h*fWgnQ01aWnz5xNkkemNS3H(iaH$5{;2p0Q>fag_i9zW(9~T>|A&Oxrg2JK zPFXB#XI%v_&&ww+_i|p{{;nUxcMvY2HmUYZk=TN)cvt0gWqFp%x7}Hh`$mLFJC*+{ zxI{)nMp(`wchVgz&7>H(*q}#dy4~&3wdr3v^UJduaiR}u)%Zz19hDjiqpn_5;6S;y z`!1#^5dFN57$>C8eEsI}hYa!5-)kTS(zFDGd=!`M^S@$-(kskf*PU$sBF8hu(NI^G z7SWJalk6qeOkhScjP~b#zdg9m?Rj}dK5CVRyxtc4dXxELhm}}*`T_pgG!Y}j$IfS6 z6KgCLf8k~Qlgz_nBKl<~zMdJ`(jCy*zl}-n>h~aM&i`l_`6YUx*2U{_IWc=0tkO$r zRuBD(YLG3zo$i>^{We78_4W$4O2fi=`Mde#J>DmM(n}1y(|tt=)kC%^i3RZs3wdah z@SGB*_k?io#9kLD{7ho8L}J z6Oc>Lo_?<4!%LP|I`i&e#w~^4p}uJDy0<9jA$##P9wcGZU5uaYdxd zw_jWiyuZh1{tAAy>(S09(hKg$Bd*A5Bq+UbQoGc*-=YDa#DtMe zg-ROshbm%`(mnWws*ER^ky#@Z6Bd-u#(8*bvzEMnttzIYWjr!$g@)d=NKCE`&2-V= zkzlGn(~ij)LVpMz{vLV<*svchDZJE1Xb|Bi8hOXr6(##Q!C~$F3OP(fhNG&zRfVwB zv6rFXo{dc@c@pcjvkHJJ9OqZhiq^vM6`-NTlP}@B0qn zuJ&uL0efWqiaeP3s+5}ZJ)g@y^Gg}+ zGh=r64g4O*-Pu^!&@&8|g#UrMN*9Ad3KfpMzqwj2mGLEU*MZ=zhc4??Y20als#H3V z^|86f#m^9t z>EW?scp9w$y0ZOGMZ(qDS!f8f7<{!_7@DM;L*ZullS-#N2&NhaK;rH4XyVNC|+Sg*b>*j{XTLJ{R_d-dBy+7^jy#ylkmO2wM*?Ze=T~_e3@K8<&!wOe3Vzdueb$=jF&3-LaaEjXT>>&k)>K z91+%~<7X4DJm*s`+z;)<9nd&(kMiz%cM-6jzbu9A4QdUv^FPpJS~pN^aHc>lM~9jF z;fk`>k?`mJ>aI-Q@>{2f4E22RM6oX%kliz8EsJkIeY^?|GkYdq<}7ZB>X}u)U$fhw z#lK?!hTRA4e`pPb51C4JhOVF*k;hCw92Ys-aGoFDFtC6v%qbPt&K0=mn-(T()2z4R z_RS1dn^`(IrL-0~IXA^Gjc{&pbs;<{ka&LQeYJTtj(c>wYwsA@oH(L4g>G=fJuXb} z<0lo#669ix$X5BckF0C6iwro%Gx3eXlKS<3MZd^DWQCQv6It(F)LRDkkiVM$ysK@U&zA*(Vhs_uvCW*=6Sq8r z*&e3X!ouM5J1TZj=A^v)oG%i6=@&+ znx+{2voZ9&y)KvCJh~GCB0M!Ru*a1uatJg;y8bl_bUC_V`MFR#^uxVZye>XvUG1!K z8aU{a*r7#DICYJESJ#u+NMLUYKON^jn%&e?GbwS>jxe&>Vhdp$w%#)|MlU_x%9L$K ze=5~4zV{?v2@Wx6h1pq1D+yCSR<|-4!E)MrCE_{0@%w4s=3{d$1Zg8{74cmm3d!7_ zpH`H<&QD**L`yC_h*>V0$lVu&?@BCrfiKOnruBZ6pv_Sq5^f!HaJ^%=@J_q9yK8;7 z?|DLZAkIxEMDgSAHwUY-Qd_?oF)C_zpidaJ?32IMvf{M}YoM%WDd`nP59c^t=y|u5 zYSL}1=w~eIC?!>Og(!aMakVU-6ugl~n90}C04M7rNSMYx`JmxKccGghkZi5=+j%{0 zmdrr|_L>Xwi z#{v(bkZQaglgr{Fz(=8ta77V)g@L!?UVxk>$RrvEH@?-;z~*i!d>i>?>o2W_J!{9= z_uKl*;zXH|voMHG`d6Ou=j2Buq?7dmfw-wQ)mb=a_>f9o)%KhRoe~XKA`L^Uzbcz7 zr$mhTxZ8h`Q!&&>mkT|D7xeV(THBWG=cD*~nKhjZa979n8zMF;s|V>2AXGUOGRqUW z9c_NSD)%V3A(nhVoPi@mW&y_fn4gwYUSiVql`RMNAXi*Xvl0y;LlmT^Wx2a7nq+4B zhGIkbZxW4LB_&I5%U>|Q3ihe@!p1x2U*|wbiUtUyf&y)|Ba+GHqw%mhqJe~XqEr0X z7FY98L?Y~IGWFz-9N|qdc;=%auYUR0It*y}I1@VZRgYI@@}yDES(j`iGUg?v+<&uK zW{!l(cf{26UF@y~hf}8wx?`d7Xoqk9ay}LowqpDWBW#sfSTy9f5snUuXSFel*z}}P z6p`G~AfngUX2TTf3u^xH<;sgDhJ2|Pswh%XJ?2ep9#IJd{l|3QU z_TQs|nyc(#pENx?bIourLR;AOp`}ALhSHNpR@vAYrnFjqnsoeW)v=h#hvc^m+>`r> z7WU{xNTuWccGuJE`xc2vwMsYZ=Afo?FpvUw6&mWDrM@1Vn_u9$N2cBK-grQV>}muR zZ*I@t*HCeCS(Y_aiW^g)+(r=l%Pn5C_!LVhdP~QzHoQADWlYrr+>2BY4TVrvE4qj< zcN`IE4M6pQ^Qm@BGT}Ur^aZ2*L_c7ZRThxRsiOj4!Biw7%$$T%&usX=M1=)ZpgBKK zuftJZf|I8Tk*^hOR4A7et|z%6;y>jd?Q)CP!pmCu37EfNj<}7J#gfb4~?MWYAaQsK{ozQ6c#44gFIF*AY?Clmvg|@}Hdy z*IneMVg{aLoKy`g#3WXq;uRk8fB4~;O$+rh znTS+CuPH{m;Bq@V)c=FRu+(x<{dKLY_^7zwA1hmG$O^F9cRzfxqLh!8q79hxI#qWe zaLOR`uc0w?U$ThW=KVkcm9-R#xC1XlM2TdWwFO?)iM{sVtI(xdxWTz_zdrz`7BwfZ8@VX4!>^e162hNgRilXdWJuD<@%+iGQwH zEC4euD5Z0T_bYYr0DT+$6b~?$;(^$yyjmW?AL_B>q0fU>%ZE=nfiJxd?DC)gNAm1x z@b|lKhnVMg@pwYwpDzC75yB*fl(GS?Z}}zk%Z028CJ>S5Yw-E6o&$M(%U9u!S*^3N z7*a8QwFc4vBY6$@znsn#Ee?5c|8pAdWHW!I&AiGpMJOZr-`os%5Z-zNPO(6A%s701 zo0TI!MasIm4j_bn8!$P!4_7mLmzX|(UQYT<%#pZ>>yd~M|CyupGfPUhSZ(5NY&rKQ z6jHpJM~4HAwab&1OA`I3tO>>MiP9Rb^{vZ3*2)_9@5p#fR%~Iuh?odfaWG(G5S_K&RX3>dcAKo^+qa^VRH3+q(xKQrWH7>; zU7&*Rw2T-JlL5KKV`E`(jbfFX4-)+^e!x)4d(}YYApG`hO}zAzM-q^e88}OF5uhnX zVN_T~%do(yUW~Flj8T$K16>41@3$d@edi*=W})$5C)7+K?Bz}%8GdjS?k`s_z+d1I zNEjt|4?=!7j*z!3dV!7AP_LNy+lEkY5yKPOREV<%@Rj`u81N`2R}BoF0tVbPBRn2C zsS06oh;b{9*tXttr%g5+X~ZSW^S~?%E6WxFR=bCmItZv4Z0+n?+Vz8H4svJUSwUdQ zUhZ2p%7?-?R2NydN?rp&8S8HqSen#z8Gp*d8KM*Gm`t_h#+6>8j`2&SP8(v;g2x&N zjf(caUbqGVFcoxh&Ukta>;vJAOCz&N%@{TCL;+yU{zi*{_5zQT69t2jh#jhmD~HDz z(4x2w?1V`*cxtM!A_0vNsW|#M7LEq-ZX*URdkptSwAcyHu(P4Sj|T$b#ik7!O4@A5 HYajm)?#-Il diff --git a/src/main.rs b/src/main.rs index c2d4c38..40ef1de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,11 +12,21 @@ use std::{ {env, time}, }; use warp::Filter; + +use crate::message::Global; mod message; mod server_info; struct Handler; +fn check_env_variables(var_name: &str, i: i32) -> Result { + if let Ok(e) = env::var(format!("{}{}", var_name, i)) { + Ok(e) + } else { + Ok(env::var(var_name)?) + } +} + #[serenity::async_trait] impl EventHandler for Handler { async fn ready(&self, ctx: Context, _: Ready) { @@ -26,21 +36,9 @@ impl EventHandler for Handler { let last_update = Arc::new(atomic::AtomicI64::new(0)); let last_update_clone = Arc::clone(&last_update); - let mut message_globals = message::Global { - game_id: String::from(""), - since_empty: false, - previous_request: Vec::new(), - since_player_trigger: 5, - }; + let mut info: Vec = Vec::new(); - let statics = message::Static { - server_name: env::var("name").expect("name wasn't given an argument!"), - // optional: - server_id: env::var("guid").unwrap_or_else(|_| "none".to_string()), - game: env::var("game").unwrap_or_else(|_| "tunguska".to_string()), - owner_id: env::var("ownerId").unwrap_or_else(|_| "none".to_string()), - platform: env::var("platform").unwrap_or_else(|_| "pc".to_string()), - fake_players: env::var("fakeplayers").unwrap_or_else(|_| "no".to_string()), + let mut statics = message::Static { set_banner_image: env::var("serverbanner").unwrap_or_else(|_| "yes".to_string()), lang: env::var("lang") .unwrap_or_else(|_| "en-us".to_string()) @@ -66,9 +64,48 @@ impl EventHandler for Handler { .parse::() .expect("prevrequestcount wasn't given an integer!"), include_spectators: env::var("include_spectators").unwrap_or_else(|_| "no".to_string()), + platform: env::var("platform").unwrap_or_else(|_| "pc".to_string()), + game: env::var("game").unwrap_or_else(|_| "tunguska".to_string()), + multiple_msg: env::var("multiple_msg").unwrap_or_else(|_| "- On network".to_string()), + servers: vec![], }; - log::info!("Started monitoring server {:#?}", statics.server_name); + let mut current_env_var = Some(0); + while let Some(i) = current_env_var { + if let Ok(e) = env::var(format!("{}{}", "name", i)) { + statics.servers.push(message::Server { + server_name: e, + server_id: check_env_variables("guid", i) + .unwrap_or_else(|_| "none".to_string()), + owner_id: check_env_variables("ownerId", i) + .unwrap_or_else(|_| "none".to_string()), + fake_players: check_env_variables("fakeplayers", i) + .unwrap_or_else(|_| "no".to_string()), + }); + current_env_var = Some(i + 1); + } else { + current_env_var = None; + } + } + if statics.servers.len() <= 0 { + statics.servers.push(message::Server { + server_name: env::var("name").expect("name wasn't given an argument!"), + // optional + server_id: env::var("guid").unwrap_or_else(|_| "none".to_string()), + owner_id: env::var("ownerId").unwrap_or_else(|_| "none".to_string()), + fake_players: env::var("fakeplayers").unwrap_or_else(|_| "no".to_string()), + }); + } + + log::info!( + "Started monitoring server(s) [{}]", + statics + .servers + .iter() + .map(|x| x.server_name.clone()) + .collect::>() + .join(", ") + ); tokio::spawn(async move { let hello = warp::any().map(move || { @@ -95,23 +132,14 @@ impl EventHandler for Handler { let mut update_avatar = chrono::Utc::now() - chrono::Duration::minutes(statics.mins_between_avatar_change.into()); loop { - let old_message_globals = message_globals.clone(); - message_globals = match status( - ctx.clone(), - message_globals, - statics.clone(), - update_avatar, - ) - .await - { - Ok((item, time)) => { + match status(ctx.clone(), &info, statics.clone(), update_avatar).await { + Ok((cur_info, time)) => { update_avatar = time; - item + info = cur_info; } Err(e) => { log::error!("cant get new stats: {:#?}", e); // return old if it cant find new details - old_message_globals.clone() } }; last_update.store(Utc::now().timestamp() / 60, atomic::Ordering::Relaxed); @@ -124,48 +152,52 @@ impl EventHandler for Handler { async fn status( ctx: Context, - message_globals: message::Global, + info: &Vec, statics: message::Static, mut update_avatar: chrono::DateTime, -) -> Result<(message::Global, chrono::DateTime)> { - let status = - server_info::change_name(ctx.clone(), statics.clone(), &message_globals.game_id).await?; - let image_loc = server_info::gen_img(status.clone(), statics.clone()).await?; - - // only allow updating once a minute to avoid spamming the avatar api - if update_avatar.add(chrono::Duration::minutes( - statics.mins_between_avatar_change.into(), - )) <= chrono::Utc::now() - { - // change avatar - let avatar = CreateAttachment::path(image_loc) - .await - .expect("Failed to read image"); - let mut user = ctx.cache.current_user().clone(); - - let mut new_profile = EditProfile::new().avatar(&avatar); - if &statics.set_banner_image[..] == "yes" { - let banner = CreateAttachment::path("./map.jpg") +) -> Result<(Vec, chrono::DateTime)> { + let status = server_info::change_name(ctx.clone(), statics.clone(), &info).await?; + if statics.servers.len() == 1 && status.len() == 1 { + let image_loc = server_info::gen_img(status[0].clone(), statics.clone()).await?; + + // only allow updating once a minute to avoid spamming the avatar api + if update_avatar.add(chrono::Duration::minutes( + statics.mins_between_avatar_change.into(), + )) <= chrono::Utc::now() + { + // change avatar + let avatar = CreateAttachment::path(image_loc) .await - .expect("Failed to read banner image"); - new_profile = new_profile.banner(&banner); + .expect("Failed to read image"); + let mut user = ctx.cache.current_user().clone(); + + let mut new_profile = EditProfile::new().avatar(&avatar); + if &statics.set_banner_image[..] == "yes" { + let banner = CreateAttachment::path("./map.jpg") + .await + .expect("Failed to read banner image"); + new_profile = new_profile.banner(&banner); + } + if let Err(e) = user.edit(ctx.clone(), new_profile).await { + log::error!( + "Failed to set new avatar: {:?}\n adding timeout before retrying", + e + ); + // add official avatar timeout if discord avatar timeout is reached + update_avatar = chrono::Utc::now().add(chrono::Duration::minutes(5)); + } else { + update_avatar = chrono::Utc::now(); + }; } - if let Err(e) = user.edit(ctx.clone(), new_profile).await { - log::error!( - "Failed to set new avatar: {:?}\n adding timeout before retrying", - e - ); - // add official avatar timeout if discord avatar timeout is reached - update_avatar = chrono::Utc::now().add(chrono::Duration::minutes(5)); - } else { - update_avatar = chrono::Utc::now(); - }; } - Ok(( - message::check(ctx, status.clone(), message_globals, statics).await?, - update_avatar, - )) + let mut shared_info = vec![]; + for server in status { + shared_info + .push(message::check(ctx.clone(), server.clone(), server.shared_info, &statics).await?); + } + + Ok((shared_info, update_avatar)) } #[tokio::main] diff --git a/src/message.rs b/src/message.rs index e4153d9..21cbd66 100644 --- a/src/message.rs +++ b/src/message.rs @@ -5,38 +5,66 @@ use serenity::{ client::Context, model::id::ChannelId, }; +use std::sync::LazyLock; #[derive(Clone, Debug)] pub struct Global { + pub server_name: String, pub game_id: String, pub since_empty: bool, pub previous_request: Vec, pub since_player_trigger: i32, } +static DEFAULT_G: LazyLock = LazyLock::new(|| Global { + server_name: "".to_string(), + game_id: "".to_string(), + since_empty: false, + previous_request: Vec::new(), + since_player_trigger: 5, +}); + +impl<'a> Default for &'a Global { + fn default() -> &'a Global { + &DEFAULT_G + } +} + +impl Default for Global { + fn default() -> Global { + DEFAULT_G.clone() + } +} + #[derive(Clone, Debug)] pub struct Static { - pub server_id: String, - pub game: String, - pub platform: String, - pub owner_id: String, - pub fake_players: String, pub set_banner_image: String, - pub server_name: String, pub lang: String, + pub mins_between_avatar_change: i32, + pub servers: Vec, pub min_player_amount: i32, pub amount_of_prev_request: i32, pub message_channel: u64, pub started_amount: i32, - pub mins_between_avatar_change: i32, pub include_spectators: String, + pub game: String, + pub platform: String, + pub multiple_msg: String, +} + +#[derive(Clone, Debug)] +pub struct Server { + pub server_name: String, + pub server_id: String, + pub owner_id: String, + pub fake_players: String, } pub async fn check( ctx: Context, status: server_info::ServerInfo, mut globals: Global, - statics: Static, + statics: &Static, ) -> Result { if statics.message_channel != 40 { // in_spectator @@ -139,7 +167,7 @@ pub async fn check( .push(status.detailed.current_players); // add current in back }; - globals.game_id = status.game_id.unwrap_or_default(); + globals.game_id = status.shared_info.game_id; Ok(globals) } @@ -160,14 +188,14 @@ pub async fn send( let mut gather_type = "gameid"; if statics.game == "kingston" { gather_type = "serverid"; - } else if status.game_id.clone().unwrap_or_default().contains(':') { + } else if status.shared_info.clone().game_id.contains(':') { gather_type = "serverip"; } let server_link = format!( "https://gametools.network/servers/{}/{}/{}/{}", games.get(&statics.game[..]).unwrap_or(&&statics.game[..]), gather_type, - status.game_id.clone().unwrap_or_default(), + status.shared_info.clone().game_id, statics.platform ); let footer = CreateEmbedFooter::new(format!("player threshold set to {} players, checks difference of previous {} minutes and in-between", diff --git a/src/server_info.rs b/src/server_info.rs index 4643e06..d836f2d 100644 --- a/src/server_info.rs +++ b/src/server_info.rs @@ -1,3 +1,5 @@ +use crate::message::Global; + use super::message; use ab_glyph::{FontRef, PxScale}; use anyhow::Result; @@ -73,11 +75,12 @@ pub struct DetailedInfo { #[derive(Debug, Clone)] pub struct ServerInfo { - pub game_id: Option, + pub shared_info: Global, pub detailed: DetailedInfo, } async fn request_list( + server: &message::Server, statics: &message::Static, game: &str, client: &reqwest::Client, @@ -85,7 +88,7 @@ async fn request_list( let mut url = Url::parse(&format!("https://api.gametools.network/{}/servers/", game)[..]).unwrap(); url.query_pairs_mut() - .append_pair("name", &statics.server_name[..]) + .append_pair("name", &server.server_name[..]) .append_pair("lang", &statics.lang[..]) .append_pair("limit", "10"); @@ -117,7 +120,11 @@ async fn request_detailed( .await?) } -async fn get(statics: message::Static, game_id: &String) -> Result { +async fn get( + statics: message::Static, + server: message::Server, + shared_info: &Global, +) -> Result { let game; if &statics.game[..] == "tunguska" { game = "bf1" @@ -131,15 +138,15 @@ async fn get(statics: message::Static, game_id: &String) -> Result { let client = reqwest::Client::new(); // try twice first - let mut response = request_list(&statics, game, &client).await?; + let mut response = request_list(&server, &statics, game, &client).await?; if response.get("errors").is_some() { - response = request_list(&statics, game, &client).await?; + response = request_list(&server, &statics, game, &client).await?; } let mut info = json!(null); // get via ownerid if newer than bf1 - if &statics.owner_id[..] != "none" + if &server.owner_id[..] != "none" && (&statics.game[..] == "casablanca" || &statics.game[..] == "kingston") { // fail on error @@ -148,29 +155,29 @@ async fn get(statics: message::Static, game_id: &String) -> Result { None => anyhow::bail!("Failed to get serverlist from main api"), }; // use ownerid to select server - for (i, server) in servers.iter().enumerate() { - if serde_json::from_value::(server.to_owned())? + for (i, cur) in servers.iter().enumerate() { + if serde_json::from_value::(cur.to_owned())? .owner_id .unwrap_or_default() - == statics.owner_id + == server.owner_id { info = response["servers"][i].to_owned(); break; } } // try with guid (which should be static) - } else if &statics.server_id[..] != "none" { + } else if &server.server_id[..] != "none" { // fail on error let servers = match response.get("servers") { Some(result) => result.as_array().unwrap(), None => anyhow::bail!("Failed to get serverlist from main api"), }; // use ownerid to select server - for (i, server) in servers.iter().enumerate() { - if serde_json::from_value::(server.to_owned())? + for (i, cur) in servers.iter().enumerate() { + if serde_json::from_value::(cur.to_owned())? .server_id .unwrap_or_default() - == statics.server_id + == server.server_id { info = response["servers"][i].to_owned(); break; @@ -184,7 +191,7 @@ async fn get(statics: message::Static, game_id: &String) -> Result { } // update game_id if it can be gathered - let mut game_id = game_id.to_string(); + let mut game_id = shared_info.game_id.to_string(); if !info.is_null() { let server_info = serde_json::from_value::(info.clone())?; if game == "bf2042" { @@ -213,7 +220,7 @@ async fn get(statics: message::Static, game_id: &String) -> Result { let mut detailed = serde_json::from_value::(detailed_response)?; - if &statics.game[..] == "bf4" && &statics.fake_players[..] == "yes" { + if &statics.game[..] == "bf4" && &server.fake_players[..] == "yes" { detailed.current_players = detailed.fake_players.unwrap_or_default(); } detailed @@ -250,7 +257,13 @@ async fn get(statics: message::Static, game_id: &String) -> Result { // game_id is saved if server cant be found with search Ok(ServerInfo { - game_id: Some(game_id), + shared_info: Global { + server_name: server.server_name, + game_id: game_id, + since_empty: shared_info.since_empty, + previous_request: shared_info.previous_request.clone(), + since_player_trigger: shared_info.since_player_trigger, + }, detailed, }) } @@ -258,39 +271,104 @@ async fn get(statics: message::Static, game_id: &String) -> Result { pub async fn change_name( ctx: Context, statics: message::Static, - game_id: &String, -) -> Result { - let status = match get(statics.clone(), game_id).await { - Ok(status) => { - let server_info = format!( - "{}/{}{}{} - {}", - status.detailed.current_players, - status.detailed.max_players, - match status.detailed.in_que.unwrap_or(0) > 0 { - true => format!(" [{}]", status.detailed.in_que.unwrap_or(0)), - false => "".to_string(), - }, - match &statics.include_spectators[..] == "yes" { - true => format!(" ({})", status.detailed.in_spectator.unwrap_or(0)), - false => "".to_string(), - }, - status.detailed.server_map - ); - - // change game activity - ctx.set_activity(Some(ActivityData::playing(server_info))); + game_ids: &Vec, +) -> Result> { + let mut results = Vec::new(); + for (i, server) in statics.servers.iter().enumerate() { + match get( + statics.clone(), + server.clone(), + game_ids.get(i).unwrap_or_default(), + ) + .await + { + Ok(status) => results.push(status.clone()), + Err(e) => { + if statics.servers.len() > 1 { + println!( + "Failed to get new serverinfo for server '{}': {:#?}", + server.server_name, e + ) + } else { + let server_info = "¯\\_(ツ)_/¯ server not found"; + ctx.set_activity(Some(ActivityData::playing(server_info))); + + anyhow::bail!(format!("Failed to get new serverinfo: {:#?}", e)) + } + } + }; + } - status + if statics.servers.len() > 1 { + let mut total = DetailedInfo { + current_players: 0, + max_players: 0, + in_que: Some(0), + in_spectator: Some(0), + small_mode: "".to_string(), + server_name: "".to_string(), + server_map: "".to_string(), + map_url: "".to_string(), + map_mode: "".to_string(), + region: "".to_string(), + favorites: "".to_string(), + fake_players: Some(0), + }; + for server in results.clone() { + total.current_players += server.detailed.current_players; + total.max_players += server.detailed.max_players; + total.in_que = match total.in_que { + Some(x) => Some(x + server.detailed.in_que.unwrap_or_default()), + None => Some(server.detailed.in_que.unwrap_or_default()), + }; + total.in_spectator = match total.in_spectator { + Some(x) => Some(x + server.detailed.in_spectator.unwrap_or_default()), + None => Some(server.detailed.in_spectator.unwrap_or_default()), + }; + total.fake_players = match total.fake_players { + Some(x) => Some(x + server.detailed.fake_players.unwrap_or_default()), + None => Some(server.detailed.fake_players.unwrap_or_default()), + }; } - Err(e) => { - let server_info = "¯\\_(ツ)_/¯ server not found"; - ctx.set_activity(Some(ActivityData::playing(server_info))); + let server_info = format!( + "{}/{}{}{} {}", + total.current_players, + total.max_players, + match total.in_que.unwrap_or(0) > 0 { + true => format!(" [{}]", total.in_que.unwrap_or(0)), + false => "".to_string(), + }, + match &statics.include_spectators[..] == "yes" { + true => format!(" ({})", total.in_spectator.unwrap_or(0)), + false => "".to_string(), + }, + statics.multiple_msg + ); - anyhow::bail!(format!("Failed to get new serverinfo: {:#?}", e)) - } - }; + // change game activity + ctx.set_activity(Some(ActivityData::playing(server_info))); + return Ok(results.clone()); + } else { + let status = results[0].clone(); + let server_info = format!( + "{}/{}{}{} - {}", + status.detailed.current_players, + status.detailed.max_players, + match status.detailed.in_que.unwrap_or(0) > 0 { + true => format!(" [{}]", status.detailed.in_que.unwrap_or(0)), + false => "".to_string(), + }, + match &statics.include_spectators[..] == "yes" { + true => format!(" ({})", status.detailed.in_spectator.unwrap_or(0)), + false => "".to_string(), + }, + status.detailed.server_map + ); - Ok(status) + // change game activity + ctx.set_activity(Some(ActivityData::playing(server_info))); + return Ok(vec![status.clone()]); + } } pub async fn gen_img(status: ServerInfo, statics: message::Static) -> Result { From df9fa0164124a81adf6af367ec5828f6fe573b84 Mon Sep 17 00:00:00 2001 From: iiTzArcur Date: Sat, 4 Oct 2025 19:37:23 +0200 Subject: [PATCH 2/2] update rust version in dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ea9966d..a477007 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.83 as builder +FROM rust:1.90 as builder WORKDIR /usr/src/myapp COPY . . ARG github_token